博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
React组件绑定this的四种方式
阅读量:5846 次
发布时间:2019-06-18

本文共 2570 字,大约阅读时间需要 8 分钟。

题图 By HymChu From lnstagram

 

用react进行开发组件时,我们需要关注一下组件内部方法this的指向,react定义组件的方式有两种,一种为函数组件,一种为类组件,类组件内部可以定义一些方法,这些方法的this需要绑定到组件实例上,小编这里总结了一下,一共有四种方案:

第一种方案,在构造函数内部使用bind绑定this,这样做的好处是,避免每次渲染时都要重新绑定,代码如下:

 

import React, {Component} from 'react'​class Test extends React.Component {     constructor (props) {
super(props) this.state = {
message: 'Allo!'} this.handleClick = this.handleClick.bind(this) }​ handleClick (e) {
console.log(this.state.message) }​ render () {
return (
) }}

 

第二种方案同样是用bind,但是这次不再构造函数内部使用,而是在render函数内绑定,但是这样的话,每次渲染都需要重新绑定,代码如下:

 

import React, {Component} from 'react'​class Test extends React.Component {     constructor (props) {
super(props) this.state = {
message: 'Allo!'} }​ handleClick (name, e) {
console.log(this.state.message + name) }​ render () {
return (
) }}

 

第三种方案是在render函数中,调用方法的位置包裹一层箭头函数,因为箭头函数的this指向箭头函数定义的时候其所处作用域的this,而箭头函数在render函数中定义,render函数this始终指向组件实例,所以箭头函数的this也指向组件实例,代码如下:

 

class Test extends React.Component {     constructor (props) {
super(props) this.state = {
message: 'Allo!'} }​ handleClick (e) {
console.log(this.state.message) }​ render () {
return (
) }

 

以上这种方式有个小问题,因为箭头函数总是匿名的,如果你打算移除监听事件,是做不到的,那么怎么做才可以移除呢?看下一种方案。

 

第四种方案,代码如下:

 

class Test extends React.Component {     constructor (props) {
super(props) this.state = {
message: 'Allo!'} } handleClick = (e) => {
console.log(this.state.message) } render () {
return (
) }}

 

不过,在Classes中直接赋值是ES7的写法,ES6并不支持,你有两种选择,一种是配置你的开发环境支持ES7,一种使采用如下方式,下面这种方式是第四种方案的另外一种写法,代码如下:

 

class Test extends React.Component {     constructor (props) {
super(props) this.state = {
message: 'Allo!'} this.handleClick = (e) => {
console.log(this.state.message) } } render () {
return (
) }​

 

以上便是react组件内部方法this绑定的四种方案,如果还有其它方案欢迎留言。

 

资料引用:

https://blog.csdn.net/sinat_17775997/article/details/56839485

 

更多干货关注下方公众号

欢迎关注、转发、点击好看

 

转载于:https://www.cnblogs.com/suoking/p/10519406.html

你可能感兴趣的文章
[异常笔记] zookeeper集群启动异常: Cannot open channel to 2 at election address ……
查看>>
mysql 03
查看>>
windows系统下搭建私有nuget仓储服务器, 打包程序集并推送到私有nuget仓储服务器...
查看>>
NgDL:第三周:浅层NN
查看>>
OpenCV基于傅里叶变换进行文本的旋转校正
查看>>
Centreon 安装部署指南
查看>>
利用ADMT进行Exchange跨域迁移之三:迁移Exchange用户邮箱
查看>>
项目管理修炼之道之规划项目
查看>>
学生机房PC也桌面虚拟化!
查看>>
Ext.Net 1.2.0_分析 Ext.Net.ResourceHandler 资源处理程序
查看>>
写你的shell,其实很简单[架构篇]
查看>>
dedecms的arclist循环中判断第一个li添加css,否则不加
查看>>
java—三大框架详解,其发展过程及掌握的Java技术慨括
查看>>
Git 常用命令
查看>>
HDU 2289 Cup (二分)
查看>>
C#中使用Monitor类、Lock和Mutex类来同步多线程的执行
查看>>
【面试&笔试】ASP.NET的相关问题
查看>>
[翻译] 使用CSS进行文字旋转
查看>>
在freebsd下安装vim(Debian下类似)
查看>>
读取本地已有的.db数据库
查看>>