在React中设置一个复选框“ check”属性

在React中设置一个复选框“ check”属性

reactjs

我在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。我该如何解决这个问题,以便消除警告?

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以通过以下步骤在 React 实现在表格外添加一个复选框并实现全选或取消全选功能: 1. 在表格外部添加一个复选框,并为其编写状态处理函数。 ```jsx class Table extends React.Component { constructor(props) { super(props); this.state = { isChecked: false }; } handleCheckAll = e => { this.setState({ isChecked: e.target.checked }); }; render() { return ( <div> <input type="checkbox" checked={this.state.isChecked} onChange={this.handleCheckAll} /> <table> {/* ... */} </table> </div> ); } } ``` 2. 在表格行添加一个复选框,并在其上绑定一个 `checked` 属性,该属性值应该与外部复选框的状态保持一致。 ```jsx class Table extends React.Component { constructor(props) { super(props); this.state = { isChecked: false, rows: [ { id: 1, name: 'Alice', isChecked: false }, { id: 2, name: 'Bob', isChecked: false }, { id: 3, name: 'Charlie', isChecked: false } ] }; } handleCheckAll = e => { const isChecked = e.target.checked; const rows = this.state.rows.map(row => ({ ...row, isChecked })); this.setState({ isChecked, rows }); }; handleCheckRow = (id, isChecked) => { const rows = this.state.rows.map(row => row.id === id ? { ...row, isChecked } : row); const isCheckedAll = rows.every(row => row.isChecked); this.setState({ isChecked: isCheckedAll, rows }); }; render() { return ( <div> <input type="checkbox" checked={this.state.isChecked} onChange={this.handleCheckAll} /> <table> <thead> <tr> <th>ID</th> <th>Name</th> <th>Is Checked</th> </tr> </thead> <tbody> {this.state.rows.map(row => ( <tr key={row.id}> <td>{row.id}</td> <td>{row.name}</td> <td> <input type="checkbox" checked={row.isChecked} onChange={e => this.handleCheckRow(row.id, e.target.checked)} /> </td> </tr> ))} </tbody> </table> </div> ); } } ``` 3. 当外部复选框的状态发生改变时,需要更新表格行的复选框状态;当表格行的复选框状态发生改变时,需要更新外部复选框的状态。 上述代码已经实现了这些功能,因此整个应用已经可以正常工作了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值