解决React报错You provided a `checked` prop to a form field

 更新时间:2022年12月02日 09:44:00   作者:Borislav Hadzhiev  
这篇文章主要为大家介绍了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事件处理器。这使得inputchecked属性成为静态的。

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>
  );
}

我们做的第一件事是将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

翻译原文链接:bobbyhadz.com/blog/react-…

以上就是解决React报错You provided a `checked` prop to a form field的详细内容,更多关于React报错的资料请关注脚本之家其它相关文章!

相关文章

  • React  memo允许你的组件在 props 没有改变的情况下跳过重新渲染的问题记录

    React  memo允许你的组件在 props 没有改变的情况下跳过重新渲染的问题记录

    使用 memo 将组件包装起来,以获得该组件的一个 记忆化 版本,只要该组件的 props 没有改变,这个记忆化版本就不会在其父组件重新渲染时重新渲染,这篇文章主要介绍了React  memo允许你的组件在 props 没有改变的情况下跳过重新渲染,需要的朋友可以参考下
    2024-06-06
  • 使用React封装一个Tree树形组件的实例代码

    使用React封装一个Tree树形组件的实例代码

    这篇文章主要介绍了使用React封装一个Tree树形组件的实例,文中通过代码示例讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-03-03
  • 解决React报错You provided a `checked` prop to a form field

    解决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的区别

    这篇文章主要介绍了React中useMemo与useCallback的区别,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-08-08
  • 使用React实现一个简单的待办事项列表的示例代码

    使用React实现一个简单的待办事项列表的示例代码

    这篇文章我们将详细讲解如何建立一个这样简单的列表,文章通过代码示例介绍的非常详细,对我们的学习或工作有一定的帮助,需要的朋友可以参考下
    2023-08-08
  • 关于antd tree和父子组件之间的传值问题(react 总结)

    关于antd tree和父子组件之间的传值问题(react 总结)

    这篇文章主要介绍了关于antd tree 和父子组件之间的传值问题,是小编给大家总结的一些react知识点,本文通过一个项目需求实例代码详解给大家介绍的非常详细,需要的朋友可以参考下
    2021-06-06
  • react组件传值的四种方法

    react组件传值的四种方法

    本文主要介绍了react组件传值的四种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • React实现组件之间状态共享的几种方法

    React实现组件之间状态共享的几种方法

    在开发现代Web应用时,管理组件之间的状态共享是一个重要的课题,特别是在使用React这个流行的前端库时,如何有效地在不同组件之间传递状态,确保应用的响应性和可维护性,是我们需要掌握的关键技能,在本文中,我们将探讨几种有效的状态共享策略,需要的朋友可以参考下
    2025-02-02
  • 基于React封装一个层次模糊效果的容器组件

    基于React封装一个层次模糊效果的容器组件

    这篇文章主要为大家详细介绍了如何基于React封装一个层次模糊效果的容器组件,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-03-03
  • React-Native 环境搭建和基本介绍

    React-Native 环境搭建和基本介绍

    这篇文章主要介绍了React-Native 环境搭建和基本介绍的相关资料,包括react native优缺点,通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2021-04-04

最新评论