我对React和复选框有一个非常恼人的问题.我正在使用的应用程序需要一个复选框列表,这些复选框表示在后端保留的设置.There is an option to restore the settings to their original state

首先,我创建了一个组件,它有一个类似设置 map 的对象.每个设置都有一个键和一个布尔值.因此:

{
    bubbles: true,
    gregory: false
}

代表如下:

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

现在,React似乎不知道复选框应该如何工作.我不想设置复选框的值,我想要"checked"属性.

然而,如果我try 这样的事情:

<input
    type="checkbox"
    value={setting}
    checked={this.settings[setting]}
    onChange={this.onChangeAction.bind(this)}
/>

我得到这个警告:

警告:AwesomeComponent正在将复选框类型的非受控输入更改为受控.输入元件不应从非受控切换到受控(反之亦然).在组件的使用生命周期 内,决定使用受控或非受控输入元件.更多信息:[some useless docs page I read several times to no avail]

所以我决定创建另一个组件来包装每个复选框,我得到了以下结果:

<input
    type="checkbox"
    checked={this.state.checked}
    onChange={this.onChangeAction.bind(this)}
/>

现在checked是我所在州的一处房产.

这会产生同样的警告,所以我try 使用defaultChecked:

<input
    type="checkbox"
    defaultChecked={this.state.checked}
    onChange={this.onChangeAction.bind(this)}
/>

这会使警告消失,但现在无法将checked值重置为默认值.所以我试着使用方法componentWillReceiveProps,这样我很确定我的状态是正确的,this.state.checked是正确的,组件再次渲染.

的确如此.但复选框仍保持原样.

我在想,也许有一种方法可以强制重新渲染组件,因此它会捕获新的defaultChecked值并使用它.但我不知道该怎么做.可能会 suppress 此组件的警告only?可能吗?也许还有别的办法?

推荐答案

如果将复选框的checked属性设置为nullundefined,则会出现问题.

然而,在JS中,这些都是"虚假"的价值观.由于复选框的默认状态是未选中的,所以一切都可以正常工作.如果将checked设置为true,则认为该属性突然存在!这是你从非受控切换到受控的时候,因为现在props 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属性如何,这增加了一点混乱.

Reactjs相关问答推荐

如何使用json将购物车数组传递到后台API

LocalStore未存储正确的数据

Firebase删除UserWithEmail AndPassword仅创建匿名用户

react 表复选框不对任何操作做出react

404使用GitHub操作部署Next.js应用程序时出错

Formik验证不适用于物料UI自动完成

UseEffect和useSelector的奇怪问题导致无限循环

如何使图像zoom 并移动到点击点

useCallback()是否应该用于作为prop传递给子组件的函数,即使该组件包装在memo()中?

折叠并重新打开react 手风琴将重置内部状态

ctx.strokeStyle 在 canvas html 5 中不起作用

Yup.number().integer() 不将 1.0 视为小数,如何解决这个问题?

如何将 MUI X 数据网格单元格方向更改为行级而不是列级?

React Router 6 点击链接在 React 18 应用中打开 flickr 页面

如何根据用户在react.js中的 Select , Select 多个心形图标?

无法设置 null 的属性(设置src)

使用 map 循环浏览列表列表中的列表并显示它们

Primereact 的日历组件在每个月 12 日之后使用非唯一键生成

FlatList 不在 React Native 中呈现项目

如何使用 React Router 在 React 中正确同步 useEffect 和 useLocation 挂钩?