[英]Passing functions to components in React
假设我有一个名为“Parent”的类组件,它呈现一个名为“Child”的组件:
class Parent extends React.Component {
constructor(props) {
super(props);
this.state = {
someProperty = 'some value',
};
}
setProperty: newValue => {
this.setState({someProperty: newValue});
}
render() {
return < Child setProperty: {this.setProperty} />
}
和子组件:
const Child = props => {
return <button onClick={props.setProperty('new value')} />
}
所以这是有效的,这对我来说很有意义:我们传递对setProperty的引用,然后只要点击子组件就可以了。
在许多教程中,我看到以下代码(在Parent中):
render() {
return < Child setProperty: {newValue => this.setProperty(newValue) />
}
传递函数时,这样做有什么好处?
传递函数时,这样做有什么好处?
这取决于如何定义this.setProperty
。 没有必要这样做或必要**因为它不会起作用。
这一切都归结为this
是如何工作的:
在“正常”的功能,价值this
取决于函数是如何被调用 。 因此,如果this.setProperty
是这样的正常功能,然后将它传递给与儿童setProperty={this.setProperty}
使得不可能为孩子调用功能,使得this
指的是父组件,这意味着主叫this.setState
函数内部将失败。
function callMe(callback) { callback(); } const obj = { foo: 42, normalFunction() { console.log(this.foo); }, }; callMe(obj.normalFunction); // not 42 :( callMe(() => obj.normalFunction()); // 42 :)
但是,如果该函数是一个箭头的功能(如在你的第一个例子)或绑定的功能,那么价值this
已经被预定并不要紧函数是如何调用。
function callMe(callback) { callback(); } const obj = { foo: 42, normalFunction() { console.log(this.foo); }, }; obj.boundFunction = obj.normalFunction.bind(obj); callMe(obj.boundFunction); // 42 :) callMe(() => obj.boundFunction()); // 42 :)
有关:
-
**:当然,如果可以控制函数的定义方式,以任何特定方式传递函数都不是“必要的”。 这整个的答案是只盯着为什么有人可能会做这种方式。 如果更改函数的定义方式,则可以避免使用某种样式。
所以关于内联函数的讨论一直存在争议。 许多人认为内联函数不具备性能,并且还会使子组件重新呈现,导致不同的函数引用,特别是在使用PureComponent的情况下。
恕我直言,没有区别,但为什么不使用静态功能,而它们在任何情况下都可用
这只是一个示例,演示了使用静态函数和内联函数之间的区别:
class Test extends Component {
render() {
return(
<button onClick={() => this.props.onUpdate(true)}>update</button>
)
}
}
// could be this as handleClick is the same reference in all renders
class Test2 extends Component {
constructor(props) {
super(props);
this.handleClick = this.handleClick.bind(this);
}
handleClick() {
this.props.onUpdate(true);
}
render() {
return (
<button onClick={this.handleClick}>update</button>
);
}
}
更新:使用构造函数绑定静态函数
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.