使用 React 时,在构造函数中使用粗箭头函数还是绑定函数更可取?
When using React Is it preferable to use fat arrow functions or bind functions in constructor?
创建 React class 时,哪个更可取?
export default class Foo extends React.Component {
constructor (props) {
super(props)
this.doSomething = this.doSomething.bind(this)
}
doSomething () { ... }
}
或
export default class Foo extends React.Component {
doSomething = () => { ... }
}
我的一个同事认为后者会导致内存问题,因为 babel 将代码转译为在闭包内捕获 this
,而该引用将导致实例无法被 GC 清理。
对此有什么想法吗?
渲染函数中的绑定会导致在每次渲染时创建新函数,这意味着差异算法认为存在变化。当您在构造函数中绑定时,这不会发生。
public class 字段语法(所以 doSomething = () => {...}
)是 not yet part of ECMAScript 但它运行良好,我非常有信心它会到达那里。
所以使用这种语法会强制你进行转译,但它带来了好处:
- 用于表达
this
绑定的清晰、简洁的语法
- 浏览器何时支持此功能的未来证据
- 不关心实施
对我来说,这是一场明显的胜利。在大多数情况下,您甚至不需要 constructor(props)
,从而避免了样板 super
调用。
如果 Babel 实现会导致内存泄漏,您可以肯定会很快找到并修复这些泄漏。您更有可能因为不得不编写更多代码而自己制造泄漏。
这里的link明确强调,官方是安全的"Bind methods in constructor"而不是使用箭头函数作为短代码实现事件绑定
这里是link:https://reactjs.org/docs/react-without-es6.html#autobinding供参考。
创建 React class 时,哪个更可取?
export default class Foo extends React.Component {
constructor (props) {
super(props)
this.doSomething = this.doSomething.bind(this)
}
doSomething () { ... }
}
或
export default class Foo extends React.Component {
doSomething = () => { ... }
}
我的一个同事认为后者会导致内存问题,因为 babel 将代码转译为在闭包内捕获 this
,而该引用将导致实例无法被 GC 清理。
对此有什么想法吗?
渲染函数中的绑定会导致在每次渲染时创建新函数,这意味着差异算法认为存在变化。当您在构造函数中绑定时,这不会发生。
public class 字段语法(所以 doSomething = () => {...}
)是 not yet part of ECMAScript 但它运行良好,我非常有信心它会到达那里。
所以使用这种语法会强制你进行转译,但它带来了好处:
- 用于表达
this
绑定的清晰、简洁的语法 - 浏览器何时支持此功能的未来证据
- 不关心实施
对我来说,这是一场明显的胜利。在大多数情况下,您甚至不需要 constructor(props)
,从而避免了样板 super
调用。
如果 Babel 实现会导致内存泄漏,您可以肯定会很快找到并修复这些泄漏。您更有可能因为不得不编写更多代码而自己制造泄漏。
这里的link明确强调,官方是安全的"Bind methods in constructor"而不是使用箭头函数作为短代码实现事件绑定
这里是link:https://reactjs.org/docs/react-without-es6.html#autobinding供参考。