目录
You provided ‘value’ prop to a form field without onChange handler
如果您收到错误消息“您在没有 onChange 处理程序的情况下向表单字段提供了‘checked’属性”,请单击第二个副标题。
您在没有 onChange 处理程序的情况下向表单字段提供了 ‘value’ 属性
当我们在value
没有处理程序的字段上设置 prop 时,会出现错误“您向没有
处理程序的表单字段提供了 prop”。onChange
value
onChange
要解决错误,请使用道具或在场地上defaultValue
设置道具。onChange
下面是错误如何发生的示例。
export default function App() { // ⛔️ You provided a `value` prop to a form field // without an `onChange` handler. This will render // a read-only field. If the field should be mutable // use `defaultValue`. Otherwise, set either `onChange` or `readOnly`. return ( <div> <input type="text" id="message" value="Initial value" /> </div> ); }
问题是我们在没有提供事件处理程序的情况下在字段value
上设置了道具。这使得输入的值是静态的。input
onChange
使用defaultValue
prop解决错误
解决错误的一种方法是改用defaultValue
prop。
export default function App() { return ( <div> <input type="text" id="message" defaultValue="Initial value" /> </div> ); }
defaultValue
属性为输入字段设置一个初始值
,但该值不是静态的,可以更改。
defaultValue
道具通常用于不受(由开发人员)控制的领域。这意味着您必须使用ref
or 作为表单中的元素来访问输入字段的值。import {useRef} from 'react'; // 👇️ Example of uncontrolled input field export default function App() { const ref = useRef(null); const handleClick = () => { console.log(ref.current.value); }; return ( <div> <input ref={ref} type="text" id="message" defaultValue="Initial value" /> <button onClick={handleClick}>Click</button> </div> ); }
每次单击按钮时,value
输入字段的 将被记录到控制台。
在 上设置一个onChange
propinput
来解决错误
或者,我们可以在字段onChange
上设置一个道具input
并处理事件。
import {useState} from 'react'; export default function App() { const [message, setMessage] = useState(''); const handleChange = event => { setMessage(event.target.value); // 👇️ this is the input field itself console.log(event.target); // 👇️ this is the new value of the input console.log(event.target.value); }; return ( <div> <input type="text" id="message" placeholder="Your message" onChange={handleChange} value={message} /> </div> ); }
我们做的第一件事是将输入值存储在一个名为 的状态变量中
message
。
onChange
在输入字段上设置了 prop,所以每次输入的值改变时,handleChange
都会调用该函数。target
我们可以通过对象的属性访问输入字段event
。
同样,我们可以通过访问输入的值event.target.value
。
为输入字段指定一个初始值
如果你想
为 input 提供一个初始值,你可以将它传递给useState()
钩子。
import {useState} from 'react'; export default function App() { // 👇️ set initial value in call to useState const [message, setMessage] = useState('Your initial value'); const handleChange = event => { setMessage(event.target.value); console.log(event.target.value); }; return ( <div> <input type="text" id="message" placeholder="Your message" onChange={handleChange} value={message} /> </div> ); }
我们传递给钩子的字符串useState
将被设置为message
变量的初始值。
您在没有 onChange 处理程序的情况下向表单字段提供了 ‘checked’ 属性
当我们在checked
没有处理程序的复选框上设置 prop 时,会出现错误“您向没有
处理程序的表单字段提供了 prop”。onChange
checked
onChange
要解决错误,请使用道具或在场地上defaultChecked
设置道具。onChange
下面是错误如何发生的示例。
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> ); }
问题是我们在没有提供事件处理程序的情况下在字段checked
上设置了道具。这使得输入的道具静态。input
onChange
checked
使用defaultChecked
prop解决错误
解决错误的一种方法是
改用defaultChecked
prop。
export default function App() { return ( <div> <input type="checkbox" id="subscribe" name="subscribe" defaultChecked={true} /> </div> ); }
该defaultChecked
道具为复选框设置了一个初始值,但该值不是静态的,可以更改。
defaultChecked
道具通常用于不受控制(由开发人员)的复选框。这意味着您必须使用ref
or 作为表单中的元素来访问字段的值。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
在复选框上设置一个属性
或者,我们可以在字段onChange
上设置一个道具input
并处理事件。
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> ); }
我们做的第一件事是将checked
输入值存储在一个名为 的状态变量中isSubscribed
。
onChange
在复选框上设置了 prop,因此每次更改其值时,handleChange
都会调用该函数。target
我们可以通过对象上的属性访问复选框event
。
同样,我们可以通过 访问它的值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> ); }
我们传递true
给了useState
钩子,所以复选框的初始值为checked
。
我还写了一篇关于
如何设置复选框的默认选中值的文章。
额外资源
您可以通过查看以下教程来了解有关相关主题的更多信息: