当子组件的select
元素更改时,我试图做两件事-
更新子状态(用于显示更多字段以及其他特定于子的决定等),
调用传递给道具的父处理程序。
只有第一个正在工作,我如何还要添加第二个?什么是正确的方法?
虚拟代码:
class Child {
render(){
return(
<div>
//....
<select
id={this.state.searchId}
value={this.state.searchId}
onChange={
//1. event => this.setState({searchId : event.target.value})
//2. call parent props changeHandler
}>
{options}
</select>
//....
</div>
)
}
}
class Parent {
onSearchPrefChange(e) {
this.setState({
searchId : e.target.value
})
}
render(){
<Child onChange={this.onSearchPrefChange} />
}
}
我试过了:
onChange={e => {
this.setState({searchId : e.target.value});
this.props.onSearchPrefChange;
}}>
不调用父处理程序,它也用于更改具有相同已更改元素的值/ id的父状态。
最佳答案
您可以在子组件中定义onChange
事件处理程序,在该子组件中设置子组件的集合,并从该函数中调用props
中从父代传递的回调。这是示例代码:
class Child extends React.Component {
constructor(props) {
super(props);
this.onSelectChange = this.onSelectChange.bind(this);
}
onSelectChange(e) {
const newValue = e.target.value;
this.props.onChange(newValue );
// set child state here
this.setState({searchId : newValue })
}
render() {
return (
<div>
<select onChange={this.onSelectChange}>
<option value="1">1</option>
<option value="2">2</option>
</select>
</div>
)
}
}
class Parent extends React.Component {
constructor(props) {
super(props);
this.someHandler = this.someHandler.bind(this);
}
someHandler(childValue) {
console.log(childValue);
this.setState({ value: childValue })
}
render() {
return <Child onChange={this.someHandler} />
}
}
这是codesandbox上的工作示例。