zoukankan      html  css  js  c++  java
  • 解决自定义 Antd 的 Form 表单控件获取值的问题

    前置条件:React 16.8+ 项目、引用 Antd UI 组件库

    问题:自定义 Form 表单控件时,表单提交获取不到控件值

    解决思路:

    自定义表单时,经常会封装一些复杂的控件,然而 像 Input 这样的输入控件,不直接作为 Form.Item 的子元素的时候,值就会获取不到。例如 使用 Popover 包裹 Input 组件的时候。

    重点在 给 Input 绑定 props,使其成为受控组件,props 包含 value 属性 和 onChange 方法。通过 props.onChange 方法为控件更新值。可以参考受控组件的实现方式。

    解决案例:(在线demo

    import React, { useState, useEffect } from "react";
    import { Form, Popover, Input, Row, Col, Button, message } from "antd";
    import { ChromePicker } from "react-color";
    import "./styles.css";
    
    const ColorPicker = (props) => {
      const { defaultColor = "#000000" } = props;
      const [color, setColor] = useState(defaultColor);
      const onChangeComplete = (value, event) => {
        setColor(value.hex);
        props.onChange(value.hex);
      };
    
      useEffect(() => {
        props.onChange(color);
        // eslint-disable-next-line
      }, []);
    
      return (
        <Popover
          content={
            <ChromePicker color={color} onChangeComplete={onChangeComplete} />
          }
        >
          <Input
            {...props}
            readOnly
            style={{  125 }}
            addonAfter={
              <div style={{  15, height: 15, backgroundColor: color }}></div>
            }
          />
        </Popover>
      );
    };
    
    function App() {
      const [form] = Form.useForm();
      const onFinish = (values) => {
        message.success(values.color);
      };
      return (
        <div className="App">
          <Form layout="inline" form={form} onFinish={onFinish}>
            <Form.Item label="Color" name="color">
              <ColorPicker />
            </Form.Item>
            <Form.Item>
              <Row gutter={[10, 0]}>
                <Col>
                  <Button onClick={() => form.resetFields()}>Reset</Button>
                </Col>
                <Col>
                  <Button htmlType="submit">Submit</Button>
                </Col>
              </Row>
            </Form.Item>
          </Form>
        </div>
      );
    }
    
    export default App;
     
  • 相关阅读:
    C++内存检测函数_CrtSetBreakAlloc()
    Detours 的配置
    浅析杀毒软件开发原理
    Sqlite3初学
    java拦截器、过滤器的区别
    sudo 设置无需密码
    Visual Studio 2012/2010/2008 远程调试
    jquery 随笔
    网页中显示xml,直接显示xml格式的文件
    centos7.2_x64安装mysql.tar.gz
  • 原文地址:https://www.cnblogs.com/jserhub/p/13520478.html
Copyright © 2011-2022 走看看