Android攻城狮前端遇坑指南

栏目: JavaScript · 发布时间: 5年前

内容简介:持续更新但是第一种箭头函数确带来了奇怪的问题:按钮未点击handlerClick函数自动执行了,而不传参数的话是不会自动执行的,这是为什么?明明看起来两种写法差不多!在讲这个问题之前我们首先来看一下匿名函数聪明的你应该发现问题了,第一种箭头函数传参就相当于匿名函数立即执行。讲清楚了为什么会立即执行,看下如何解决

持续更新

1.按钮未点击自动执行点击事件

handlerClick = (questionId)=>{
    console.log('我执行了')
}
<button type="button"
   onClick={
    this.handlerClick(question_id)
  }>补习详情
</button>
复制代码
handlerClick (questionId){
    console.log('我被点击了')
}
<button type="button"
   onClick={
    this.handlerClick.bind(this,question_id)
  }>补习详情
</button>
复制代码

第一种和第二种是两种常见的函数定义方法,第一种是箭头函数,第二种是普通函数。推荐用箭头函数

  • 避免普通函数this造成的一系列问题,而箭头函数this指向函数定义的组件
  • 每次刷新组件都会重新执行bind方法,对性能有影响

但是第一种箭头函数确带来了奇怪的问题:按钮未点击handlerClick函数自动执行了,而不传参数的话是不会自动执行的,这是为什么?明明看起来两种写法差不多!在讲这个问题之前我们首先来看一下匿名函数

function (){
    console.log('我执行了')
}
复制代码

忽略箭头函数的内部细节,我们发现其实箭头函数就是匿名函数。再来看看匿名函数是如何执行的

(function (){
    console.log('我执行了')
})()
复制代码

聪明的你应该发现问题了,第一种箭头函数传参就相当于匿名函数立即执行。讲清楚了为什么会立即执行,看下如何解决

<button type="button"
   onClick={()=>{
       this.handlerClick(question_id)
   }
  }>补习详情
</button>
复制代码

这有什么区别?第一种箭头函数的写法等价于

onClick=(function(){
    console.log('我执行了') 
})(questionId)
复制代码

第二种等价于

onClick=function(){
    return function handlerClick(questionId){
        console.log('我执行了') 
    }
}
复制代码

那么bind为什么不会立即执行?因为bind返回的还是函数

2.ant Design Select组件的坑

<Select defaultValue={0} onChange={this.handleClasses} className="selectClasses">
   {
   allClass.map((value, index) =>
          <Select.Option value={index}>{value.class_name}</Select.Option>
       )
    }
</Select>
复制代码

开始allClass是空数组,等到网络请求返回allClass才有数据,然后组件会刷新。这时候很奇怪defaultValue没有刷新,莫名其妙的设置不了默认数据。会出现下图所示的情况

Android攻城狮前端遇坑指南

下面的写法可以避免这种情况

{
 allClass.length !== 0 ?
   <Select defaultValue={0} onChange={this.handleClasses} className="selectClasses">
    {
      allClass.map((value, index) =>
       <Select.Option value={index}>{value.class_name}</Select.Option>
      )
    }
   </Select> : <div/>
}
复制代码

这种写法更优雅

{
 allClass.length !== 0 &&
   <Select defaultValue={0} onChange={this.handleClasses} className="selectClasses">
    {
      allClass.map((value, index) =>
       <Select.Option value={index}>{value.class_name}</Select.Option>
      )
    }
   </Select>
}
复制代码

以上所述就是小编给大家介绍的《Android攻城狮前端遇坑指南》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

走进搜索引擎

走进搜索引擎

梁斌 / 电子工业出版社 / 2007-1 / 49.80元

《走进搜索引擎》由搜索引擎开发研究领域年轻而有活力的科学家精心编写,作者将自己对搜索引擎的深刻理解和实际应用巧妙地结合,使得从未接触过搜索引擎原理的读者也能够轻松地在搜索引擎的大厦中邀游一番。《走进搜索引擎》作为搜索引擎原理与技术的入门书籍,面向那些有志从事搜索引擎行业的青年学生、需要完整理解并优化搜索引擎的专业技术人员、搜索引擎的营销人员,以及网站的负责人等。《走进搜索引擎》是从事搜索引擎开发的......一起来看看 《走进搜索引擎》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具