class App extends Component {
constructor() {
super();
this.state = {
name: 'React'
};
this.setState=this.setState.bind(this)
}
render() {
return (
<div>
<Hello name={this.state.name} />
<p>
Start editing to see some magic happen :)
</p>
<Child {...this}/>
</div>
);
}
}
child Component
var Child=(self)=>{
return(
<button onClick={()=>{
self .setState({
name:"viswa"
})
}}>Click </button>
)
这里我绑定了setState函数并将其作为道具发送到子组件。这将改变父级的状态。这是正确的吗?
答案 0 :(得分:0)
正如@yBrodsky所说,你应该传递一个改变状态的函数。这是一个例子:
class App extends Component {
constructor() {
super();
this.state = {
name: 'React'
};
this.update=this.update.bind(this);
}
update(nextState) {
this.setState(nextState);
}
render() {
return (
<Child updateParent={this.update} />
);
}
}
const Child = ({updateParent}) => (
<button onClick={() => updateParent({name: 'Foo bar'})}>Click</button>
);
您现在可以完全控制子项中父项的状态。只需将对象轻微合并到父状态即可。在此示例中,name
中的App
将在按钮点击时更改为Foo bar
。
答案 1 :(得分:0)
但这比传递函数简单。如果我想改变许多状态改变。与传递函数相比,这将是简单快捷的方式吗?
执行此操作的正确方法与您的一样简单,并且不违反最佳做法:
class App extends Component {
state = {
name: 'React',
};
render() {
return (
<div>
<Hello name={this.state.name} />
<p>
Start editing to see some magic happen :)
</p>
<Child onClick={() => this.setState({name: 'viswa'})}/>
</div>
);
}
}
const Child=({onClick})=>(
<button onClick={onClick}>Click</button>
);
答案 2 :(得分:0)
您不应直接传递setState,因为setState函数不会立即更改状态。
正如documents所说:
将setState()视为请求而不是立即命令 更新组件。为了获得更好的感知性能,React可能会 延迟它,然后一次更新几个组件。应对 并不保证立即应用状态变化。
setState()并不总是立即更新组件。它可以批量推迟更新或推迟更新。因此,您最好一起管理setState函数的调用,因为可能存在改变父类状态的竞争。不建议将此功能传递给其他组件。
在一个类中封装setState函数的调用,使代码变得强大。