我使用Material UI复选框组件,并尝试切换状态onCheck,在控制台状态更改但不在UI中,复选标记不切换。我弄得一团糟。
class CheckboxInteractivity extends React.Component {
state = {
switched: false,
}
componentWillMount() {
const {checked} = this.props
if (checked) {
this.setState({
switched: true,
})
}
}
handleChange = (event, switched) => {
this.setState({switched: !this.state.switched})
}
render () {
const {switched} = this.state
return <Checkbox
label="Label"
checked={switched}
onCheck={this.handleChange}
{...this.props}
/>
}
}
CheckboxInteractivity.propTypes = {
checked: PropTypes.bool,
}
export default CheckboxInteractivity
组件
<CheckboxInteractivity />
//working correctly
<CheckboxInteractivity checked/>
//not working
答案 0 :(得分:3)
不使用第二种情况的原因是:
return <Checkbox
label="Label"
checked={switched}
onCheck={this.handleChange}
{...this.props}
/>
将成为:
return <Checkbox
label="Label"
checked={switched}
onCheck={this.handleChange}
checked={true} //here
/>
您使用两个checked
属性,第二个将复选框选中为真,无论state
变量是什么原因。删除{...this.props}
它将按预期工作。
为什么它在第一种情况下工作的是,你没有传递checked
所以checkbox
将只找到一个选中的密钥,它将基于此呈现组件。
此处{...this.props}
不是必需的,因为您已将值存储在state
中。
<强>建议:强>
而不是在props
生命周期方法中的state
中设置componentWillMount
值,而不是仅在constructor
中设置,如下所示:
constructor(props){
super(props);
this.state = {
switched: props.checked || false,
}
}
<强>更新强>
我们假设您在props
中传递了很多值,并且要在组件中覆盖的值很少,因此您需要在此处执行的操作首先应用所有props
属性,然后定义其他属性。通过这种方式,组件属性将覆盖props
属性。
像这样:
return <Checkbox
{...this.props} //first apply props values then other
label="Label"
checked={switched}
onCheck={this.handleChange}
/>