前言

由于JS的灵活性,我们在React中其实有很多种绑定事件的方式,然而,其实有许多我们常见的事件绑定,其实并不是高效的。所以本文想给大家介绍一下React绑定事件的正确姿势。

常见两种种错误绑定事件


class ErrorExample1 extends Component { balabala(e) {console.log(e)} render() {
const { text } = this.state; return (
<Wrapper>
{text}
<Balabala onClick={(e) => this.balabala(e)}></Balabala>
</Wrapper>
)
}
}

class ErrorExample2 extends Component {
balabala(e) {console.log(e)} render() {
const { text } = this.state;
return (
<Wrapper>
{text}
<Balabala onClick={this.balabala.bind(this)}></Balabala>
</Wrapper>
)
}
}

这是两种最常见的React绑定事件代码,但它为什么是错误的?

每当你的text发生变化,就会rerender,只要组件重新render,那就会重新创建新的事件函数,进而绑定事件,这个过程的开销就是极大极大的浪费。相当于,每次rerender都会创建一次事件函数。

这据说是 Best Practice


class Balabala extends Component {
constructor(p) {
suprt(p);
this.balabala = this.balabala.bind(this);
}
render() {
const { text } = this.state;
return (
<Wrapper>
{text}
<Balabala onClick={this.balabala}></Balabala>
</Wrapper>
)
}
}

然而我更喜欢的姿势


class Balabala extends Component {
constructor(p) {
suprt(p);
}
醒来记得想我 = (e) => {
alert('想你了');
}
render() {
const { text } = this.state;
return (
<Wrapper>
{text}
<Balabala onClick={this.醒来记得想我}></Balabala>
</Wrapper>
)
}
}

利用箭头函数,帮我们bind this。避免了在构造函数里生命一堆的变量。减少键盘的敲击,延长生命。

当然,还有人会问,这样的写法如何传参呢?以前别人会这样写


class 渣男 extends Component {
constructor(p) {
suprt(p);
}
醒来记得想我 = (e, text) => {
alert(text); // alert 滚吧,渣男
}
render() {
const { text } = this.state;
return (
<Wrapper>
{text}
<Balabala onClick={this.醒来记得想我.bind(e, '滚吧,渣男')}></Balabala>
</Wrapper>
)
}
}

但是其实,我们可以这样传参,更加简洁明了


class 渣男 extends Component {
constructor(p) {
suprt(p);
}
醒来记得想我 = (text) => (event) => {
alert(text); // 你渣我也喜欢,因为是你
}
render() {
const { text } = this.state;
return (
<Wrapper>
{text}
<Balabala onClick={this.醒来记得想我( '你渣我也喜欢,因为是你')}></Balabala>
</Wrapper>
)
}
}

动态绑定

基于这个我们还可以针对同一事件修改多个input值,进行事件优化


class ChangeMyName extends Component {
修改渣男名称 = name => {
if (!this.handlers[name]) {
this.handlers[name] = event => {
this.setState({ [name]: event.target.value });
};
}
return this.handlers[name];
} render() {
return (
<>
<input onChange={this.修改渣男名称('男神1号')}/>
<input onChange={this.修改渣男名称('渣男2号')}/>
</>
)
}
}

旁门左道,邪教!(个人不喜欢而已)


import autoBind from 'react-autobind'; class Balabala extends Component {
constructor() {
autoBind(this);
}
醒来记得想我 (e) {
alert('想你了');
}
render() {
const { text } = this.state;
return (
<Wrapper>
{text}
<Balabala onClick={this.醒来记得想我}></Balabala>
</Wrapper>
)
}
}

import { BindAll } from 'lodash-decorators'; @BindAll()
class Bbb extends Component {}

// 这种写法等同于 bind
class Bbb extends Component {
balabala(){}
render() {
const { text } = this.state;
return (
<Wrapper>
{text}
<Balabala onClick={::this.balabala}></Balabala>
</Wrapper>
)
}
}

基本都大同小异吧,就不过多介绍了。看到这里,你也知道到底应该如何绑定事件了。

个人网站:http://meckodo.com

React应该如何优雅的绑定事件?的更多相关文章

  1. React中如何优雅的捕捉事件错误

    React中如何优雅的捕捉事件错误 前话 人无完人,所以代码总会出错,出错并不可怕,关键是怎么处理. 我就想问问大家react的错误怎么捕捉呢? 这个时候: 小白:怎么处理? 小白+: ErrorBo ...

  2. angular,vue,react的基本语法—动态属性、事件绑定、ref,angular组件创建方式

    基本语法: 动态属性: vue: v-bind:attr="msg" :attr="msg" react: attr={msg} angular [attr]= ...

  3. React绑定事件动态化的实现方法

    一.什么是绑定事件 1.1 事件 我这里指的事件一般指的是React自带的触发事件,我这里先简单举例几个 onClick //鼠标点击 onMouseEnter //鼠标滑进 onMouseLeave ...

  4. jq绑定事件的4种方式

    jQuery提供了多种绑定事件的方式,每种方式各有其特点,明白了它们之间的异同点,有助于我们在写代码的时候进行正确的选择,从而写出优雅而容易维护的代码.下面我们来看下jQuery中绑定事件的方式都有哪 ...

  5. jQuery绑定事件的四种方式

      jQuery提供了多种绑定事件的方式,每种方式各有其特点,明白了它们之间的异同点,有助于我们在写代码的时候进行正确的选择,从而写出优雅而容易维护的代码.下面我们来看下jQuery中绑定事件的方式都 ...

  6. jQuery绑定事件的四種方式

    这篇文章主要介绍的是jQuery绑定事件的四种方式相关内容,下面我们就与大家一起分享. jQuery绑定事件的四种方式 jQuery提供了多种绑定事件的方式,每种方式各有其特点,明白了它们之间的异同点 ...

  7. react 使用antd导航组件实现事件传递并局部刷新DOM

    我们要实现一个通过点击顶部导航来查询左侧菜单的一个功能 在这个功能中,我们要应用到onClick={this.headNavMenuList.bind(this)}方法来传递点击 不同按钮来传递不同的 ...

  8. window.onresize绑定事件以及解绑事件

    问题描述 在Vue工程中,添加样式,部分需要做到自适应,需要添加resize事件,由于是单页面应用,如果组件初始化的时候绑定事件,在切换页面的时候不去注销事件,如果来回切换,会让resize事件执行多 ...

  9. 冒泡,setinterval,背景图的div绑定事件,匿名函数问题

    1.会冒泡到兄弟元素么? $(function(){ $("#a").click(function(){alert("a")}) $("#b" ...

随机推荐

  1. fastjson =< 1.2.47 反序列化漏洞浅析

    fastjson =< 1.2.47 反序列化漏洞浅析 iiusky 洛米唯熊 今天 文章出处: https://www.03sec.com/3240.shtmlhttps://www.secq ...

  2. 对iOS锁的一些研究

    #import <objc/runtime.h> #import <objc/message.h> #import <libkern/OSAtomic.h> #im ...

  3. 0.spring cloud目录

    1. 微服务架构概述 1.0. 单体架构是什么 1.1. 单体应用架构存在的问题 1.2. 如何解决单体应用架构存在的问题 1.3. 什么是微服务 1.4. 微服务架构的优点与挑战 1.4.1. 微服 ...

  4. 【译】OkHttp3 拦截器(Interceptor)

    一,OkHttp 拦截器介绍(译自官方文档) 官方文档:https://github.com/square/okhttp/wiki/Interceptors 拦截器是 OkHttp 提供的对 Http ...

  5. Leetcode题目34.在排序数组中查找元素的第一个和最后一个位置(中等)

    题目描述: 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n) 级别. 如果数组中不存在目标 ...

  6. spark streaming 6: BlockGenerator、RateLimiter

    BlockGenerator和RateLimiter其实很简单,但是它包含了几个很重要的属性配置的处理,所以记录一下. ))) , SECONDS) From WizNote

  7. https知识汇总

    状态码 含义 100 客户端应当继续发送请求.这个临时响应是用来通知客户端它的部分请求已经被服务器接收,且仍未被拒绝.客户端应当继续发送请求的剩余部分,或者如果请求已经完成,忽略这个响应.服务器必须在 ...

  8. C++学习 之 初识命名空间

    声明:            本人自学C++, 没有计算机基础,在学习的过程难免会出现理解错误,出现风马牛不相及的现象,甚至有可能会贻笑大方. 如果有幸C++大牛能够扫到本人的博客,诚心希望大牛能给予 ...

  9. C++学习 之 初识C++

    声明:            本人自学C++, 没有计算机基础,在学习的过程难免会出现理解错误,出现风马牛不相及的现象,甚至有可能会贻笑大方. 如果有幸C++大牛能够扫到本人的博客,诚心希望大牛能给予 ...

  10. 简易的美图秀秀利用别人的so库

    在实际开发中,有时候时间短,任务量大,可以查看类似的apk,将行apk反编译,通过看源码分析,用里面的JNI代码! 本案例中用了美图秀秀的JNI.java和jni.so链接库 项目中调用别人写的c代码 ...