相关疑难解决方法(0)

如何使用箭头函数(公共类字段)作为类方法?

我刚接触使用带有React的ES6类,之前我已经将我的方法绑定到当前对象(在第一个示例中显示),但ES6是否允许我使用箭头将类函数永久绑定到类实例?(当作为回调函数传递时很有用.)当我尝试使用它时,我遇到错误,就像使用CoffeeScript一样:

class SomeClass extends React.Component {

  // Instead of this
  constructor(){
    this.handleInputChange = this.handleInputChange.bind(this)
  }

  // Can I somehow do this? Am i just getting the syntax wrong?
  handleInputChange (val) => {
    console.log('selectionMade: ', val);
  }
Run Code Online (Sandbox Code Playgroud)

因此,如果我要传递SomeClass.handleInputChangesetTimeout它,那么它将被限定为类实例,而不是window对象.

javascript ecmascript-6 reactjs babeljs ecmascript-next

168
推荐指数
4
解决办法
8万
查看次数

如何避免render方法中的bind或inline箭头函数

我们应该避免在render内部绑定方法,因为在重新渲染期间它将创建新方法而不是使用旧方法,这将影响性能.

所以对于这样的场景:

<input onChange = { this._handleChange.bind(this) } ...../>
Run Code Online (Sandbox Code Playgroud)

我们可以_handleChange在构造函数中绑定方法:

this._handleChange = this._handleChange.bind(this);
Run Code Online (Sandbox Code Playgroud)

或者我们可以使用属性初始化器语法:

_handleChange = () => {....}
Run Code Online (Sandbox Code Playgroud)

现在让我们考虑一下我们想要传递一些额外参数的情况,让我们说在一个简单的待办事项应用中,点击项目我需要从数组中删除项目,因为我需要传递每个项目索引或待办事项名称onClick方法:

todos.map(el => <div key={el} onClick={this._deleteTodo.bind(this, el)}> {el} </div>)
Run Code Online (Sandbox Code Playgroud)

现在假设todo名称是唯一的.

根据DOC:

此语法的问题是每次组件呈现时都会创建不同的回调.

题:

如何在render方法中避免这种绑定方式或者这有什么替代方法?

请提供任何参考或示例,谢谢.

javascript reactjs

21
推荐指数
2
解决办法
6869
查看次数

具有箭头功能的事件处理程序如何实现上下文绑定

我了解this绑定的一般理论(重要的函数调用站点,隐式,显式绑定等)以及解决React中此绑定问题的方法,因此它始终指向我想要this成为的对象(绑定构造函数,箭头函数等),但我正在努力获取内部机制。

看一下这两段代码:

class demo extends React.component {
  goToStore(event) {
    console.log(this)
  }

  render() {
    <button onClick={(e) => this.goToStore(e)}>test</button>
  }
}
Run Code Online (Sandbox Code Playgroud)

class demo extends React.component {
  goToStore(event) {
    console.log(this)
  }

  render() {
    <button onClick={this.goToStore}>test</button>
  }
}
Run Code Online (Sandbox Code Playgroud)

我所知道的是:

  • 在这两个版本中,我们都成功地使用goToStore方法成功,因为thisrender()方法内部自动(通过React)绑定到组件实例
  • 因此,第一个成功了,
  • 第二个失败,因为es6中的类方法未绑定到组件实例,因此this将方法解析为undefined

据我了解,从理论上讲,在第一版中会发生以下情况:

  1. 按钮点击处理程序是一个匿名箭头函数,因此,只要我在其中引用this,它就会this从环境中拾取(在本例中是从render()
  2. 然后调用goToStore方法,即常规函数。
  3. 因为该调用似乎符合隐式绑定(object.function())的规则,所以object它将成为上下文对象,并且在此类函数调用中,它将用作this
  4. 因此,在goToStore方法内部,按词法拾取该对象(用作上下文对象)将正确解析为组件实例

我觉得这里不是3.和4.,因为那样就适用于2.情况:

<button onClick={this.goToStore}>test</button>
Run Code Online (Sandbox Code Playgroud)

还带有this上下文对象。

在这种特定情况下,逐步发生了什么?

javascript this reactjs

6
推荐指数
1
解决办法
4807
查看次数

React:推荐使用哪种箭头或正常功能?

在我觉得做手动功能/对象绑定后,我开始使用箭头功能,并且范围相关的问题令人头疼,但我非常认真地了解使用正常功能(ES5)比使用箭头功能(ES6)更好.

我对这些功能的理解

React中的正常函数:

  1. 手动绑定对象/函数以便在函数内部使用状态或道具并避免与范围相关的问题
  2. 始终在构造函数中绑定对象/函数,但不直接在渲染中绑定
  3. 如果你在构造函数中执行它,那么当你的组件第一次渲染时,Webpack只在bundle.js文件中创建一个新对象/函数
  4. 如果你直接在渲染中执行它,那么每次组件渲染和重新渲染时,Webpack都会在bundle.js文件中创建一个新对象/函数
  5. 如果你没有绑定,那么你就无法访问状态或道具.您必须将当前对象分配给本地变量,否则this.state或this.props是未定义的

React中的箭头功能:

  1. 无需在构造函数中绑定对象/函数也不需要渲染
  2. 你不需要依赖当前对象的局部变量interms,即,让那=这个;
  3. 您不会有范围问题,并且会自动进行对象/功能绑定

但我的查询是,我听说它建议使用正常的功能,并将其绑定在构造函数,而不是使用箭头功能,因为箭头功能创建新的对象/功能的WebPack bundle.js每次你的组件呈现和重新呈现时间.

这是真的?推荐哪个?

这个线程接受了答案在React中正确使用箭头函数说 - >这取决于你在哪里使用箭头功能.如果在render方法中使用了Arrow函数,那么每次调用render时它们都会创建一个新实例,就像bind的工作方式一样.

对不起,如果你觉得这是一个戏剧性的问题,但这是我最大的疑问.请建议

ecmascript-5 ecmascript-6 reactjs

3
推荐指数
1
解决办法
1683
查看次数

onClick 从类更改为函数

在官方反应教程中,他们首先编写类组件:

class Square extends React.Component {
 render() {
   return (
     <button className="square" onClick={() => this.props.onClick()}>
       {this.props.value}
     </button>
   );
 }
}
Run Code Online (Sandbox Code Playgroud)

然后使它成为一个功能组件

function Square(props) {
  return (
    <button className="square" onClick={props.onClick}>
      {props.value}
    </button>
  );
}
Run Code Online (Sandbox Code Playgroud)

为什么 onClick 更改是必要的,即为什么我们删除了箭头功能?

在第一种情况下,当我们移除箭头函数时,即只保留 this.props.onClick() 事件在每次渲染方块时都会发生,甚至无需单击按钮,为什么会这样?ps:我是 react js 的新手,在学习本教程时遇到了这些疑问,如果您能给出详细的答案和任何可以提供帮助的其他资源,那就太好了!!提前致谢。

javascript reactjs

2
推荐指数
1
解决办法
60
查看次数