• 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 属性。

    you-provided-checked-prop-to-form-field.png

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

    // 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}>Clickbutton>
        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

  • 相关阅读:
    计算机毕业设计选题推荐-基于数据可视化的智慧社区内网平台-Python项目实战
    LinkWeChat V4.9.8 版本发布
    第 2 章 线性表(静态链表示例)
    转发网关与NAT网关
    大数据面试总结三
    Flink简介、基本原理、架构图
    [附源码]计算机毕业设计JAVAjsp疫情防控期间人员档案追寻系统
    内网穿透的应用-如何在Docker中部署MinIO服务并结合内网穿透实现公网访问本地管理界面
    一文了解蛋白功能结构域预测与分析
    mac支持fat32格式吗 mac支持什么格式的移动硬盘
  • 原文地址:https://www.cnblogs.com/chuckQu/p/16625969.html