源码
https://stackblitz.com/edit/r...
class App extends Component {
constructor() {
super();
this.state = {
name: 'React',
checked:false,
};
this.handleChange=this.handleChange.bind(this)
}
handleChange(event){
this.setState({
checked:event.target.checked
})
}
render() {
return (
<div>
<Hello name={this.state.name} />
<input checked={this.state.checked} onChange={this.handleChange} id='test' type='checkbox' />
<span>color for test</span>
<div>
<label for='test' >test's label</label>
<button onClick={()=>{
this.setState({
checked:undefined
})
}}>
something
</button>
</div>
</div>
);
}
}
在线演示(支持DevTool)
https://react-as5oze.stackbli...
问题是这样的:
- 如果
this.state.checked
一开始是true(蓝色背景),那么我点一下勾选框(this.state.checked为false了),再点一下something
按钮,它又变成了蓝色 - 如果
this.state.checked
一开始是false(红色背景),那么我点一下勾选框(this.state.checked为false了),再点一下something
按钮,它又变成了红色
something
按钮的功能就是将checked设为undefined,请问这个按钮为什么会出现上述这种看起来像'复原'的功能
补充(我实际遇到的问题):
一个设置页,如果用户点击取消则将所有checkbox复原,经过排查发现再复原方法中漏了一个state字段(这就导致这个字段在复原时设为undefined),但是从界面上却是正常效果
这和 react 的实现用关系. react 会把 input 的初始状态存在 dom 元素的 _wrapperState 中. 你通过
document.getElementById('test')._wrapperState
看到, 其中_wrapperState.initialChecked
存的是 input 初始的 checked 属性, 当state.checked
变为undefined
时, react 的 diff 算法会选择使用_wrapperState.initialChecked
作为 input 的值.