我有一个容器,它是一个子容器。这个子容器处理states
,它还从父容器接收一些props
。我有两个select语句,onChange
在子容器中设置state
。由于某些原因,setState()
导致容器重新呈现。奇怪的是,render()
和我的setState()
代码只被调用一次。(我添加了调试器来检查)。请在下面找到我选择的组合框代码:
<Select
native
name="evidenceNode"
value={nodeType}
onChange={this.handleChange('nodeType')}
className={classes.textField}
>
<option />
{NODE_TYPE.map(function (item, i) {
return <option key={i} value={item}>{item}</option>
})}
</Select>
<Select
native
name="modelType"
value={modelType}
onChange={this.handleChange('modelType')}
className={classes.textField}
>
<option />
{MODEL_TYPE.map(function (item, i) {
return <option key={i} value={item}>{item}</option>
})}
</Select>
下面是我的handleChange函数:
handleChange = name => event => {
this.setState({
[name]: event.target.value,
});
};
我怀疑这是一个很小的解决办法,但我不知道我哪里出错了。
我尝试过的事情:
handleChange
调用,它运行得很好。我还应该提到:我有一个componentWillReceiveProps
函数(不确定是否重要)
componentWillReceiveProps(nextProps, nextContext) {
if(nextProps.selectedNode !== this.state.selectedNode){
this.setState({
selectedNode: nextProps.selectedNode
});
}
}
发布于 2019-02-22 13:22:29
问题是onChange={this.handleChange('modelType')}
。
不是附加一个事件,而是用它调用一个方法。
正因为如此,你进入了一个无限循环。this.handleChange('modelType')
发生重呈现,再次调用this.handleChange('modelType')
...etc。
在onChange
事件上附加一个调用handleChange
的匿名函数
onChange={e => this.handleChange('modelType', e)}
并更改handleChange
参数声明:
handleChange = (name, event) => {}
发布于 2019-02-25 06:05:07
问题不在于handleChange侦听器。显然,Material-UI (我为表单元素使用的工具)要求我们在我添加的每个选择之上添加一个FormControl元素。所以组件应该是这样的。
<FormControl
// className={classes.formControl}
>
<Select
native
name="nodeType"
value={nodeType}
onChange={this.handleChange('nodeType')}
className={classes.textField}
inputProps={{
name: 'nodeType',
id: 'nodeType'
}}
>
<option/>
{NODE_TYPE.map(function (item, i) {
return <option key={i} value={item}>{item}</option>
})}
</Select>
</FormControl>
我犯的错误是我有一个FormControl,它里面有两个选择元素。这个特别的东西并没有在他们的网站上有正确的记录。
我认为Material在表单控件中的每个Select上都递归地调用handleChange,而且由于我有多个组件,所以它进入了一个循环。我希望这能帮到你。
https://stackoverflow.com/questions/54834882
复制相似问题