解决React报错You provided a `checked` prop to a form field
作者:Borislav Hadzhiev
总览
当我们在多选框上设置了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