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 属性。
React报错之You provided a `checked` prop to a form field
文章图片

这里有个例子用来展示错误是如何发生的。

// App.jsexport 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 (); }

上述代码片段的问题在于,我们在input表单上设置了checked属性,但却没有提供onChange事件处理器。这使得inputchecked属性成为静态的。
defaultChecked 解决该错误的一种方式是,使用defaultChecked属性取而代之。
export default function App() { return (); }

defaultChecked属性为多选框设置了一个初始值,但是该值不是静态的,是可以被更改的。
defaultChecked 属性常被用于不受控(不被开发者控制)的多选框。这意味你必须使用ref或者表单元素来访问表单字段的值。
// App.jsimport {useRef} from 'react'; // ? Example of uncontrolled checkbox export default function App() { const ref = useRef(null); const handleClick = () => { console.log(ref.current.checked); }; return (); }

每当你点击按钮时,多选框的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 (); }

我们做的第一件事是将inputchecked值存储在一个叫做isSubscribed的状态变量中。
我们在多选框上设置了onChange属性,所以每当值改变时,handleChange函数就会被调用。
【React报错之You provided a `checked` prop to a form field】我们可以通过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 (); }

我们向useState钩子传递了true,所以复选框的初始值将是checked

    推荐阅读