在react + ES6中考虑以下代码:
import React, { Component } from 'react';
const myFunction=(x,y)=>{
return x*y
};
class MyTest extends Component {
// state comes here
myProperty=(x,y)=>{
return x*y
};
myMethod(x,y){
return x*y
}
render () {
return (<div>
<h2>Result of myMethod: {this.myMethod(2,3)}</h2>
<h2>Result of myProperty: {this.myProperty(2,3)}</h2>
<h2>Result of myFunction: {myFunction(2,3)}</h2>
</div>
);
}
}
export default MyTest;
输出内容如下:
myMethod的结果:6
myProperty的结果:6
myFunction的结果:6
真的有区别吗?一个比另一个好吗?
答案 0 :(得分:1)
考虑到您显示的示例,两者之间没有太大区别,它们可能可以互换使用。
几乎没有什么事情,例如在外部(可能是在内部)声明函数表达式的事实,不会在每次实例化类时都重新创建它。老实说,我必须检查EcmaScript规范以进行验证。
当您需要传递这些功能之一作为对其他功能的引用,以及这些目的地是否需要访问原始上下文或新的上下文时,情况会发生变化。
Lambda除了声明的上下文之外不能具有其他上下文,因此可以毫无困难地将它们作为引用传递。
相反,实例方法需要在绑定为引用之前绑定到上下文。
您见过这种模式吗?
constructor() {
// ...
this.myMethod = this.myMethod.bind(this)
}
myMethod(x,y){
return x*y
}
这只是用与此上下文绑定的相同方法的副本覆盖了类范围内的myMethod
。基本上与以下内容完全相同:
myMethod = (x, y) => x * y
答案 1 :(得分:1)
在您的情况下,我建议您使用功能组件,即,您在类外部声明的函数是适合您的情况的函数。因为您正在传递输入并期望输出,所以该函数内部没有状态管理。因此,最好使用功能组件。
关于使用箭头功能还是普通功能,请查看下面的线程以获取详细答案
答案 2 :(得分:1)
myFunction
类的私有方法,因为MyTest
不会导出。
myFunction
和myMethod
之间的区别在于myProperty
使用ES6箭头函数语法。
在JavaScript中,对方法使用ES6语法尚未成为EcmaScript标准的一部分。您需要使用babel将其转换为ES5语法。使用ES6语法的好处是您不需要将myProperty
绑定到myProperty
,但是需要绑定this
(否则myMethod
是{{ 1}})。
但是,我称它为this.myMethod
是不正确的,因为它仍然是一种方法。属性将类似于undefined
。基本上,它是对象的属性/属性,而不是操作。
myProperty
或myProperty = {something: 5}
{color: "red"}