React hook实现复选框checkbox勾选,状态不触发重新渲染问题

项目需要实现一个弹窗,不再提醒的功能。需要用到input的checkbox实现。
通过在组件中使用useState控制checked属性

const [checked, setChecked] = React.useState(false)
const handleChange = () => {
    setChecked(!checked)
}

对应渲染组件

<StyledPromptText>
   <label>
        <input type="checkbox" checked={checked} onChange={handleChange} style={{ 'verticalAlign': 'middle' }} />
        {_('不再提示')}
    </label>
</StyledPromptText>

但是切换的时候,onchange事件只能改变state,不能主动触发组件渲染,更新勾选态
在这里插入图片描述

于是通过想了各种办法,想到了加一个key去主动触发react的渲染。
每一次checked变化都会影响到key,从而触发主动渲染。

<StyledPromptText>
   <label>
        <input type="checkbox" checked={checked} key={Number(checked)} onChange={handleChange} style={{ 'verticalAlign': 'middle' }} />
        {_('不再提示')}
    </label>
</StyledPromptText>

完美解决!切换流畅
在这里插入图片描述

后面优化了用户体验,让点击文字也可以修改check的状态

<StyledPromptText>
    <input type="checkbox" checked={checked} key={Number(checked)} onChange={handleChange} style={{ 'verticalAlign': 'middle' }} />
    <label onClick={handleChange}>{_('不再提示')}</label>
</StyledPromptText>
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
可以通过以下步骤在 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. 当外部复选框状态发生改变时,需要更新表格行的复选框状态;当表格行的复选框状态发生改变时,需要更新外部复选框状态。 上述代码中已经实现了这些功能,因此整个应用已经可以正常工作了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值