当前位置: 首页 > news >正文

react当中的this指向

绑定this常见的方法

在JavaScript当中,this的指向取决于函数调用的上下文,但是在react当中,this通常指向指向问题是一个常见的困扰,如果this没有正确绑定,那么方法中的this很可能会是undefined,导致程序出错

 1.bind(this):

在构造函数当中使用.bind(this)来this的指向绑定,这个方法比较方便,绑定一次即可生效,性能比较好,但是代码比较长

Test1ConstructorBind 继承自React.Component,这是定义 React 类组件的标准方式。

在构造函数中使用this.method.bind(this)为每个事件处理方法绑定this,确保方法内部的this指向组件实例。

import React, { Component } from 'react'class Test1ConstructorBind extends Component {constructor(props) {super(props)this.state = {message: 'Hello!',count: 0,isVisible: true,}this.handleClick = this.handleClick.bind(this)this.handleCount = this.handleCount.bind(this)this.toggleVisibility = this.toggleVisibility.bind(this)this.handleReset = this.handleReset.bind(this)}//切换消息文本handleClick() {console.log('方法1 - 构造函数绑定: 当前消息:', this.state.message)this.setState({message: this.state.message === 'Hello!' ? '你好!' : 'Hello!',})}//增加计数handleCount() {this.setState((prevState) => ({count: prevState.count + 1,}))}//切换内容显示 / 隐藏toggleVisibility() {this.setState((prevState) => ({isVisible: !prevState.isVisible,}))}//重置所有状态handleReset() {this.setState({count: 0,message: 'Hello!',isVisible: true,})}render() {return (<div><h2>方法1: 构造函数中绑定 this</h2><p>在 constructor 中使用 this.method = this.method.bind(this) 绑定</p><button onClick={this.handleClick}>切换消息</button><span> 当前消息: {this.state.message}</span><br /><button onClick={this.handleCount}>增加计数</button><span> 计数: {this.state.count}</span><br /><button onClick={this.toggleVisibility}>{this.state.isVisible ? '隐藏' : '显示'}内容</button>{this.state.isVisible && <div>这是可以切换显示/隐藏的内容</div>}<br /><button onClick={this.handleReset}>重置所有状态</button></div>)}
}export default Test1ConstructorBind

2.使用箭头函数:

箭头函数不绑定自己的this,它会捕获所在上下文的this值,使用这种方法无需手动绑定,每次渲染的时候需要创建两个函数实例,可能会影响性能

import React, { Component } from 'react'class Test2ArrowFunction extends Component {constructor(props) {super(props)this.state = {message: 'Hello!',count: 0,isVisible: true,}// 使用箭头函数时,不需要在构造函数中绑定}// 方法2: 使用箭头函数自动绑定thishandleClick = () => {console.log('方法2 - 箭头函数: 当前消息:', this.state.message)this.setState({message: this.state.message === 'Hello!' ? '你好!' : 'Hello!',})}handleCount = () => {this.setState((prevState) => ({count: prevState.count + 1,}))}toggleVisibility = () => {this.setState((prevState) => ({isVisible: !prevState.isVisible,}))}handleReset = () => {this.setState({count: 0,message: 'Hello!',isVisible: true,})}render() {return (<div><h2>方法2: 箭头函数自动绑定 this</h2><p>使用箭头函数语法,this 自动绑定到组件实例</p><button onClick={this.handleClick}>切换消息</button><span> 当前消息: {this.state.message}</span><br /><button onClick={this.handleCount}>增加计数</button><span> 计数: {this.state.count}</span><br /><button onClick={this.toggleVisibility}>{this.state.isVisible ? '隐藏' : '显示'}内容</button>{this.state.isVisible && <div>这是可以切换显示/隐藏的内容</div>}<br /><button onClick={this.handleReset}>重置所有状态</button></div>)}
}export default Test2ArrowFunction

3.使用内联bind:

组件较小且方法简单,需要快速传递参数,方法只在一处使用,无需复用。

大型列表渲染,性能敏感的组件,方法需要被多次复用(如传递给子组件)。

import React, { Component } from 'react'class Test4InlineBind extends Component {constructor(props) {super(props)this.state = {message: 'Hello!',count: 0,isVisible: true,}}handleClick() {console.log('方法4 - 内联bind: 当前消息:', this.state.message)this.setState({message: this.state.message === 'Hello!' ? '你好!' : 'Hello!',})}handleCount() {this.setState((prevState) => ({count: prevState.count + 1,}))}toggleVisibility() {this.setState((prevState) => ({isVisible: !prevState.isVisible,}))}handleReset() {this.setState({count: 0,message: 'Hello!',isVisible: true,})}render() {return (<div><h2>方法4: 内联 bind 方法</h2><p>在 render 中使用 onClick=this.handleClick.bind(this) 语法(性能较差)</p><button onClick={this.handleClick.bind(this)}>切换消息</button><span> 当前消息: {this.state.message}</span><br /><button onClick={this.handleCount.bind(this)}>增加计数</button><span> 计数: {this.state.count}</span><br /><button onClick={this.toggleVisibility.bind(this)}>{this.state.isVisible ? '隐藏' : '显示'}内容</button>{this.state.isVisible && <div>这是可以切换显示/隐藏的内容</div>}<br /><button onClick={this.handleReset.bind(this)}>重置所有状态</button><div><small>注意:这种方法每次渲染都会创建新的函数,影响性能,不推荐在生产环境中使用。</small></div></div>)}
}export default Test4InlineBind

4.使用内联箭头函数:

语法简洁,自动绑定this,可直接传递参数

每次渲染都会创建新的函数实例,可能影响性能

import React, { Component } from 'react'class Test3InlineArrow extends Component {constructor(props) {super(props)this.state = {message: 'Hello!',count: 0,isVisible: true,}}render() {return (<div><h2>方法3: 内联箭头函数</h2><p>在 render 中使用 onClick={() => this.handleClick()} 语法(性能较差)</p><buttononClick={() => {console.log('方法3 - 内联箭头函数: 当前消息:', this.state.message)this.setState({message: this.state.message === 'Hello!' ? '你好!' : 'Hello!',})}}>切换消息</button><span> 当前消息: {this.state.message}</span><br /><buttononClick={() => {this.setState((prevState) => ({count: prevState.count + 1,}))}}>增加计数</button><span> 计数: {this.state.count}</span><br /><buttononClick={() => {this.setState((prevState) => ({isVisible: !prevState.isVisible,}))}}>{this.state.isVisible ? '隐藏' : '显示'}内容</button>{this.state.isVisible && <div>这是可以切换显示/隐藏的内容</div>}<br /><buttononClick={() => {this.setState({count: 0,message: 'Hello!',isVisible: true,})}}>重置所有状态</button><div><small>注意:这种方法每次渲染都会创建新的函数,影响性能,不推荐在生产环境中使用。</small></div></div>)}
}export default Test3InlineArrow

http://www.lryc.cn/news/581484.html

相关文章:

  • (C++)学生管理系统(正式版)(map数组的应用)(string应用)(引用)(文件储存的应用)(C++教学)(C++项目)
  • .NET9 实现字符串拼接(StringConcatenation)性能测试
  • 深入探索 pnpm:高效磁盘利用与灵活的包管理解决方案
  • jmm,`as - if - serial` 与 `happens - before` 原则
  • 【一起来学AI大模型】算法核心:数组/哈希表/树/排序/动态规划(LeetCode精练)
  • OpenSearch 向量搜索与Qwen3-Embedding 集成示例
  • @Data、@AllArgsConstructor、@NoArgsConstructor不生效。lombok不起作用怎么解决?
  • Web前端开发-Vue
  • 多人协同开发时Git使用命令
  • 锁和事务的关系
  • 深入探索开源爬虫MediaCrawler,从入门到掌握多平台数据收集
  • HarmonyOS学习6 --- 数据存储
  • 9. 【Vue实战--孢子记账--Web 版开发】-- 账户账本管理(二)
  • MySQL CDC与Kafka整合指南:构建实时数据管道的完整方案
  • 1.线性神经网络--线性回归
  • 华为云 银河麒麟 vscode远程连接
  • 前端开发问题:SyntaxError: “undefined“ is not valid JSON
  • Flutter 每日翻译之 Widget
  • Vue+Openlayers加载OSM、加载天地图
  • java学习——guava并发编程练习
  • 【Guava】1.0.设计虚拟机的方向
  • 第一个Flink 程序:词频统计 WordCount(流处理)
  • LeetCode--41.缺失的第一个正数
  • 《Redis》缓存与分布式锁
  • AGV选型指南:AGV智能搬运车智能问答系统助力从技术参数到供应商选择的完整方案
  • Flutter 项目开启 UI 层级虚线(UI Guides)
  • 深度学习篇---简单果实分类网络
  • JAVA 项目找不到符号
  • 零依赖Web数据管理系统:midb轻松管理
  • Node.js EventEmitter 深入解析