注释从这开始~

总览

当咱们在多选框上设置了checked 属性,却没有onChange 处理函数时,会产生"You provided a checked prop to a form field without an onChange handler"谬误。为了解决该谬误,能够应用defaultChecked 属性,或者在表单字段上设置onChange 属性。

这里有个例子用来展现谬误是如何产生的。

// 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 (    <div>      <input type="checkbox" id="subscribe" name="subscribe" checked={true} />    </div>  );}

上述代码片段的问题在于,咱们在input表单上设置了checked属性,但却没有提供onChange事件处理器。这使得inputchecked属性成为动态的。

defaultChecked

解决该谬误的一种形式是,应用defaultChecked属性取而代之。

export default function App() {  return (    <div>      <input        type="checkbox"        id="subscribe"        name="subscribe"        defaultChecked={true}      />    </div>  );}

defaultChecked属性为多选框设置了一个初始值,然而该值不是动态的,是能够被更改的。

defaultChecked 属性常被用于不受控(不被开发者管制)的多选框。这象征你必须应用ref或者表单元素来拜访表单字段的值。
// App.jsimport {useRef} from 'react';// ️ Example of uncontrolled checkboxexport 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>  );}

咱们做的第一件事是将inputchecked值存储在一个叫做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