解决React报错You provided a `checked` prop to a form field
总览
当我们在多选框上设置了checked 属性,却没有onChange 处理函数时,会产生"You provided a checked prop to a form field without an onChange handler"错误。为了解决该错误,可以使用defaultChecked 属性,或者在表单字段上设置onChange 属性。

这里有个例子用来展示错误是如何发生的。
// App.js
export default function App() {
// ⛔️ Warning: You provided a `checked` prop to a form field
// without an `onChange` handler. This will render a read-only field.
// If the field should be mutable use `defaultChecked`.
// Otherwise, set either `onChange` or `readOnly`.
return (
<div>
<input type="checkbox" id="subscribe" name="subscribe" checked={true} />
</div>
);
}
上述代码片段的问题在于,我们在input表单上设置了checked属性,但却没有提供onChange事件处理器。这使得input的checked属性成为静态的。
defaultChecked
解决该错误的一种方式是,使用defaultChecked属性取而代之。
export default function App() {
return (
<div>
<input
type="checkbox"
id="subscribe"
name="subscribe"
defaultChecked={true}
/>
</div>
);
}
defaultChecked属性为多选框设置了一个初始值,但是该值不是静态的,是可以被更改的。
defaultChecked 属性常被用于不受控(不被开发者控制)的多选框。这意味你必须使用ref或者表单元素来访问表单字段的值。
// App.js
import {useRef} from 'react';
// 👇️ Example of uncontrolled checkbox
export default function App() {
const ref = useRef(null);
const handleClick = () => {
console.log(ref.current.checked);
};
return (
<div>
<input
ref={ref}
type="checkbox"
id="subscribe"
name="subscribe"
defaultChecked={true}
/>
<button onClick={handleClick}>Click</button>
</div>
);
}
每当你点击按钮时,多选框的checked值就会被打印到控制台上。
onChange
或者,我们可以在input表单字段上设置onChange属性,并处理事件。
import {useState} from 'react';
export default function App() {
const [isSubscribed, setIsSubscribed] = useState(false);
const handleChange = event => {
setIsSubscribed(event.target.checked);
// 👇️ this is the checkbox itself
console.log(event.target);
// 👇️ this is the checked value of the field
console.log(event.target.checked);
};
return (
<div>
<input
type="checkbox"
id="subscribe"
name="subscribe"
onChange={handleChange}
checked={isSubscribed}
/>
</div>
);
}
我们做的第一件事是将input的checked值存储在一个叫做isSubscribed的状态变量中。
我们在多选框上设置了onChange属性,所以每当值改变时,handleChange函数就会被调用。
我们可以通过event对象上的target属性来访问多选框。类似地,我们可以通过event.target.checked来访问多选框的值。
初始值
如果你想为多选框提供一个初始值,只需将它传递给useState()钩子。
import {useState} from 'react';
export default function App() {
// 👇️ set checked to true initially
const [isSubscribed, setIsSubscribed] = useState(true);
const handleChange = event => {
setIsSubscribed(event.target.checked);
// 👇️ this is the checkbox itself
console.log(event.target);
// 👇️ this is the checked value of the field
console.log(event.target.checked);
};
return (
<div>
<input
type="checkbox"
id="subscribe"
name="subscribe"
onChange={handleChange}
checked={isSubscribed}
/>
</div>
);
}
我们向useState钩子传递了true,所以复选框的初始值将是checked。
翻译原文链接:bobbyhadz.com/blog/react-…
以上就是解决React报错You provided a `checked` prop to a form field的详细内容,更多关于React报错的资料请关注脚本之家其它相关文章!
- 解决React报错Expected `onClick` listener to be a function
- 解决React报错Unexpected default export of anonymous function
- 解决React报错JSX element type does not have any construct or call signatures
- 解决React报错Expected an assignment or function call and instead saw an expression
- React Hook 'useEffect' is called in function报错解决
- React hook 'useState' is called conditionally报错解决
- 解决React hook 'useState' cannot be called in a class component报错
- 解决React报错Encountered two children with the same key
相关文章
React memo允许你的组件在 props 没有改变的情况下跳过重新渲染的问题记录
使用 memo 将组件包装起来,以获得该组件的一个 记忆化 版本,只要该组件的 props 没有改变,这个记忆化版本就不会在其父组件重新渲染时重新渲染,这篇文章主要介绍了React memo允许你的组件在 props 没有改变的情况下跳过重新渲染,需要的朋友可以参考下2024-06-06
解决React报错You provided a `checked` prop&n
这篇文章主要为大家介绍了React报错You provided a `checked` prop to a form field的解决方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2022-12-12
解析React中useMemo与useCallback的区别
这篇文章主要介绍了React中useMemo与useCallback的区别,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2022-08-08
关于antd tree和父子组件之间的传值问题(react 总结)
这篇文章主要介绍了关于antd tree 和父子组件之间的传值问题,是小编给大家总结的一些react知识点,本文通过一个项目需求实例代码详解给大家介绍的非常详细,需要的朋友可以参考下2021-06-06


最新评论