我在React和复选框方面遇到了一个非常烦人的问题。我正在处理的应用程序需要一个复选框列表,表示在后端持久化的设置。有一个选项可以将设置恢复为其原始状态。
起初,我创建了一个具有类似于设置映射的对象的组件。每个设置都有一个键和布尔值。因此:
{
bubbles: true,
gregory: false
}
应该被表示为:
<input type="checkbox" value="bubbles" checked="checked" />
<input type="checkbox" value="gregory" />
现在,React似乎不清楚复选框的工作原理。我不想设置复选框的值,我想要的是"checked"属性。
然而,如果我尝试像这样:
<input
type="checkbox"
value={setting}
checked={this.settings[setting]}
onChange={this.onChangeAction.bind(this)}
/>
我收到了这个警告:
警告:AwesomeComponent 将一个未控制的复选框输入改为受控。输入元素不应从未受控制转换为受控制(或反之亦然)。在组件的生命周期内决定使用控制或未控制的输入元素。更多信息:[我阅读了几遍但毫无进展的一些无用文档页面]
因此,我决定创建另一个组件来包装每个单独的复选框,然后我得到了这个:
<input
type="checkbox"
checked={this.state.checked}
onChange={this.onChangeAction.bind(this)}
/>
现在,checked
是我状态中直接存在的属性。
这会产生相同的警告,因此我尝试使用defaultChecked
:
<input
type="checkbox"
defaultChecked={this.state.checked}
onChange={this.onChangeAction.bind(this)}
/>
这使得警告消失了,但现在无法将checked
值重置为默认值。所以我尝试使用componentWillReceiveProps
方法进行调整,这样我非常确定我的状态是正确的,this.state.checked
是正确的,组件重新渲染。
它确实做到了。 但复选框仍然保持原样。
目前我留下了那个丑陋的警告,正在使用checked
。
如何修复这个问题,让警告消失?
我认为也许有一种方法可以强制重新渲染组件,这样它就可以捕获新的defaultChecked
值并使用它。 但我不知道该怎么做。 也许仅针对此组件抑制警告? 这可能吗? 也许还有其他可行的东西?