浏览器大全:是一个提供流行浏览器教程、在线学习分享的学习平台!

react函数this相关问题的区分(代码示例)

网页的本质就是超级文本标记语言,通过结合使用其他的Web技术(如:脚本语言、公共网关接口、组件等),可以创造出功能强大的网页。因而,超级文本标记语言是万维网(Web)编程的基础,也就是说万维网是建立在超文本基础之上的。超级文本标记语言之所以称为超文本标记语言,是因为文本中包含了所谓“超级链接”点。
本篇文章给大家带来的内容是关于react函数this相关问题的分析(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

react 函数this相关

在使用react的过程中,常常因为函数的this问题导致执行结果不如预期。现梳理下这块的问题,先看代码:

import React from "react";

class MsgList extends React.PureComponent {
  render() {
    return (
      <ul>
        {this.props.list.map((item, index) => (<li key={index}>{item}</li>))}
      </ul>
    )
  }
}

export default class List extends React.Component {
  constructor(props) {
    super(props)
    this.state = {
      inputMsg: '',
      list: [123]
    }
  }
  
  handleInput = (val) => {
    this.setState({
      inputMsg: val.target.value
    })
  }

  handleSubmit = () => {
    const text = this.state.inputMsg
    if (text) {
      const msg = [...this.state.list, text]
      this.setState({
        inputMsg: '',
        list: msg
      })
    }
  }

  render() {
    return (
      <p>
        <MsgList list={this.state.list}/>
        <input type="text" value={this.state.inputMsg}
            onChange={this.handleInput}/>
        <button onClick={this.handleSubmit}>提交</button>
      </p>
    )
  }
}

示例代码实现了简单的元素添加和列表展示功能。

其中函数绑定和定义的方式如下:

// 绑定
onChange={this.handleInput}
// 定义
handleInput = (val) => {
  this.setState({
    inputMsg: val.target.value
  })
}

定义函数的方式有很多种,比如:

handleInput(val) {
  console.log(val.target)
  console.log(this)
  this.setState({
    inputMsg: val.target.value
  })
}

此时val.target为<input>元素,但是this为undefined,此时调用this.setState会报错。

006tNbRwgy1fx9qh55lp6j314g0feqa5.jpg

类的方法默认是不会绑定this的,所以这里丢失了函数执行的上下文。那么如果在绑定时候加上一对括号:

<input type="text" value={this.state.inputMsg} onChange={this.handleInput()}/>

// 函数定义
handleInput(val) {
  console.log(val.target)
  console.log(this)
  this.setState({
      inputMsg: val.target.value
  })
}

此时添加括号,虽然绑定了上下文,但这样会导致函数在组件渲染的时候被触发,而不是等到渲染完成时通过点击触发,且无法响应onChange动作。组件在渲染过程中触发函数,函数中调用setState()会再次调用render,导致死循环。

如果在最开始使用.bind()为函数绑定上下文,去掉绑定函数时的括号,

constructor(props) {
  super(props)
  this.state = {
    inputMsg: 'hello',
    list: [123]
  }
  this.handleInput = this.handleInput.bind(this)
}

这时功能正常。

而最开始我们定义函数时用箭头函数绑定了上下文,所以也能实现想要的功能。

除此之外,还有一种书写方式也可以正常工作,不过实际上与最开始的写法是一样的。

<input type="text" value={this.state.inputMsg} onChange={(e)=>this.handleInput(e)}/>

小结

使用react的时候要注意this的指向,类默认是不会为方法绑定this,要么在开始的时候手动绑定this,要么可以使用箭头函数自动绑定上下文。如果不是希望在组件渲染时就触发的函数,那么绑定函数时不能加括号。

以上就是react函数this相关问题的分析(代码示例)的详细内容,更多请关注php中文网其它相关文章!


网站建设是一个广义的术语,涵盖了许多不同的技能和学科中所使用的生产和维护的网站。



相关软件

2345加速浏览器官方版

2345加速浏览器官方版 | 56.2MB

2345加速浏览器官方版

新一代2345加速浏览器采用Chromium和IE双内核,主打极速与安全特性。基于Chromium深度定制,引入网页智能预加载技术,访问网页更快速..

QQ浏览器官方正式版

QQ浏览器官方正式版 | 49.67MB

QQ浏览器官方正式版

QQ浏览器秉承TT浏览器1-4系列方便易用的特点,但技术架构不同,交互和视觉表现也重新设计,采用Chromium内核+IE双内核,让浏览快速稳定...

百度浏览器最新版下载

百度浏览器最新版下载 | 13.3MB

百度浏览器最新版下载

q百度浏览器,是一款简洁轻快、智能懂你的浏览器。依靠百度强大的搜索平台,在满足用户浏览网页的基础上,它整合百度体系业务优势,带给用户更方便的浏览方式功能...

UC浏览器官方正式版

UC浏览器官方正式版 | 44.2MB

UC浏览器官方正式版

UC浏览器(UC Browser)是UC Mobile Limited在2004年8月开发的一款软件,分uc手机浏览器和uc浏览器电脑版。UC浏览器是全球使用量最大的第三方手机浏览器...

猎豹浏览器2022最新版下载

猎豹浏览器2022下载 | 45MB

猎豹浏览器2022最新版下载

猎豹安全浏览器对Chrome的Webkit内核进行了超过100项的技术优化,访问网页速度更快。其具有首创的智能切换引擎,动态选择内核匹配不同网页...

360安全浏览器官方版下载

360安全浏览器下载 | 21.4MB

360安全浏览器官方版下载

360安全浏览器拥有全国最大的恶意网址库,采用恶意网址拦截技术,可自动拦截挂马、欺诈、网银仿冒等恶意网址。独创沙箱技术,在隔离模式即使访问****也不会感染...