IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> react中this的指向问题 -> 正文阅读

[JavaScript知识库]react中this的指向问题

export class Shijian extends React.Component {
    constructor() {
        super(); //es6里面规定的,构造函数里必须这个super函数
        this.state = {
            count: 10
        }
    }
    render() {
        return (<div>
            <h1>计数器:{this.state.count}</h1>
            <button onClick={()=> {
                this.setState({count: this.state.count + 1})
            }}>按钮</button>
        </div>)
    }
};
  • JSX 中掺杂过多 JS 逻辑代码,会显得非常混乱
  • 推荐:将逻辑抽离到单独的方法中,保证JSX 结构清晰

方法

1、
箭头函数里面的this并不是自己决定的,而是由外部环境决定的,外部环境中this是谁箭头函数里面的this就是谁

  • 利用箭头函数自身不绑定this的特点
  • render() 方法中的 this 为组件实例,可以获取到setState()
class Hello extends React.Component {
onIncrement() {
this.setState({})
}
render() {
// 箭头函数中的this指向外部环境,此处为:render()方法
return (
<button onClick={() => this.onIncrement()}></button>
)
}
}

2、

  • bind方法
export class Shijian extends React.Component {
    constructor() {
        super(); //es6里面规定的,构造函数里必须这个super函数
        this.state = {
            count: 10
        }
    };
    handleCount() {
        this.setState({count: this.state.count + 1})
    };
    render() {
        return (<div>
            <h1>计数器:{this.state.count}</h1>
            <button onClick={this.handleCount.bind(this)}>按钮</button>
        </div>)
    }
};
  • 利用ES5中的bind方法,将事件处理程序中的this与组件实例绑定到一起
  • constructor中的this也是指向实例的

class Hello extends React.Component {
constructor() {
super()
 this.state = {
            count: 10
        };
this.onIncrement = this.onIncrement.bind(this);
}
onIncrement() {
this.setState({})
}
render() {
return (
<button onClick={this.onIncrement}></button>
)
}
export class Shijian extends React.Component {
    constructor() {
        super(); //es6里面规定的,构造函数里必须这个super函数
        this.state = {
            count: 10
        };
        this.handleCount = this.handleCount.bind(this)
    };
    handleCount() {
        this.setState({count: this.state.count + 1})
    };
    render() {
        return (<div>
            <h1>计数器:{this.state.count}</h1>
            {/* <button onClick={this.handleCount.bind(this)}>按钮</button> */}
            <button onClick={this.handleCount}>按钮</button>
        </div>)
    }
};

3、class 的实例方法

  • 利用箭头函数形式的class实例方法
  • 注意:该语法是实验性语法,但是,由于babel的存在可以直接使用

绝对可以用呀,直接就指向的是实例的this

class Hello extends React.Component {
onIncrement = () => {
this.setState({})
}
render() {
return (
<button onClick={this.onIncrement}></button>
)
}
}
export class Shijian extends React.Component {
    constructor() {
        super(); //es6里面规定的,构造函数里必须这个super函数
        this.state = {
            count: 10
        };
        
    };
    handleCount = () => {
        this.setState({count: this.state.count + 1});
    }
    render() {
        return (<div>
            <h1>计数器:{this.state.count}</h1>
            {/* <button onClick={this.handleCount.bind(this)}>按钮</button> */}
            <button onClick={this.handleCount}>按钮</button>
        </div>)
    }
};

推荐使用方法三

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-26 12:02:06  更:2021-08-26 12:03:42 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 12:48:04-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码