在React中设置复选框“检查”属性

我对React和复选框有一个非常恼人的问题。我正在使用的应用程序需要一个复选框列表,这些复选框表示在后端保留的设置。 有一个选项可将设置恢复到原始状态。在React中设置复选框“检查”属性

首先,我创建了一个组件,其中包含一个像设置图一样的对象。每个设置都有一个键和一个布尔值。因此:

{ 

bubbles: true,

gregory: false

}

是为表示:

<input type="checkbox" value="bubbles" checked="checked" /> 

<input type="checkbox" value="gregory" />

现在看来阵营是无知一个复选框应该是怎样工作的。我不想设置复选框的值,我想要“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。 我该如何解决这个问题,让警告消失?

我在想,也许有办法强制重新渲染组件,所以它会捕获新的值并使用它。但我不知道该怎么做。也许这个组件禁止警告只有?那可能吗?也许还有别的可以做的事情?

回答:

如果您将复选框的checked属性设置为null或,则会出现问题。

这些是JS中的“错误”值,但是完全是React treats a value of null as if the property was not set。由于复选框的默认状态是未选中状态,所以一切都会正常工作。如果您随后将checked设置为true React认为该属性突然出现!这是React数字从非控制切换到控制的时候,因为现在支持checked存在。

在您的示例中,您可以通过将checked={this.settings[setting]}更改为checked={!!this.settings[setting]}来摆脱此警告。注意双重爆炸(!!)。他们会将nullundefined转换为false(并且只保留true),因此React将注册您的checked属性,其值为false,并以受控表单组件开始。

我也有这个问题,我也读了docs about controlled-components几次无济于事,但我终于明白了,所以我想我会分享。此外,由于version 15.2.0正常输入触发由设置value控制,而复选框被初始化为由设置checked控制,无论其value财产,这增加了一点混乱。

回答:

基本上,defaultChecked意味着你不想控制输入 - 它只是呈现这个值,然后就没有办法控制它。此外,value不应该使用,但checked而不是,所以你的第二个代码应该是正确的。而且你不应该同时使用它们。

<input 

type="checkbox"

checked={this.state.checked}

onChange={this.onChangeAction.bind(this)}

/>

你能用这种行为创建一个小提琴吗?

回答:

您可以将您的数据的状态,然后利用与个别复选框相关的checked属性的设置状态

{ this.state.data.map(function(item, index) { 

return (

<input type="checkbox" checked={item.value} onChange={this.handleChange.bind(this, index)}/>

);

}.bind(this))

}

样本数据中的状态是

data: [{name:'bubbles', value: true}, {name:'gregory', value: false}] 

JSFIDDLE

回答:

Amoebe的回答是正确的,但我认为比双银行有更清洁的解决方案(!!)。

import React from 'react'; 

const Checkbox = ({checked}) => (

<div>

<input type="checkbox" checked={checked} />

</div>

);

Checkbox.defaultProps = {

checked: false

};

export default Checkbox;

以上是 在React中设置复选框“检查”属性 的全部内容, 来源链接: utcz.com/qa/257198.html

回到顶部