【问题标题】:Use react-input-mask with antd without getFieldDecorator在没有 getFieldDecorator 的情况下使用带有 antd 的 react-input-mask
【发布时间】:2019-07-21 08:33:13
【问题描述】:

我是 React 新手,我想使用 react-input-maskantd 输入字段。如果我使用getFieldDecoratorForm.create,一切正常。

在 inputmask.js 中:

const CustomInput = forwardRef((props, ref) => {
  return (
    <ReactInputMask {...props}>
      {inputProps => (
        <Input
          {...inputProps}
          ref={ref}
          disabled={props.disabled ? props.disabled : null}
        />
      )}
    </ReactInputMask>
  );
});

CustomInput.propTypes = {
  mask: PropTypes.string,
  maskChar: PropTypes.string,
  formatChars: PropTypes.object,
  alwaysShowMask: PropTypes.bool,
  inputRef: PropTypes.func
};

export default CustomInput;

在 index.js 中:

function FormBuilder(props) {
  const { getFieldDecorator } = props.form;

  return (
    <Form>
      <Form.Item label="Phone">
        {getFieldDecorator("phone", {
          rules: [{ required: true, message: "Phone is required." }]
        })(
          <CustomInput
            mask="+7 (999) 999-99-99"
            placeholder="+7 (___) ___-__-__"
          />
        )}
      </Form.Item>
      <Button htmlType="submit" type="primary">
        Send
      </Button>
    </Form>
  );
}

const App = Form.create({ name: "form" })(FormBuilder);

这里是demo

但如果我删除 getFieldDecoratorForm.create(因为我将使用 react-final-form 并且我不需要它们),则掩码不起作用。

这是我的新 index.js 和 demo

function App(props) {
  return (
    <Form>
      <Form.Item label="Phone">
        <CustomInput
            mask="+7 (999) 999-99-99"
            placeholder="+7 (___) ___-__-__"
          />
      </Form.Item>
      <Button htmlType="submit" type="primary">
        Send
      </Button>
    </Form>
  );
}

代码基本相同,但在第二个示例中,掩码不起作用。你能告诉我,我的错误在哪里吗?

【问题讨论】:

    标签: javascript reactjs antd


    【解决方案1】:

    getFieldDecorator API 管理它的表单字段values 为您

    如果你删除它,你需要自己管理它。

    您可以通过仅渲染 CustomInput 来保证它,但它仍然无法像您一样工作。

    function FormBuilder(props) {
      // Won't work
      return (
        <CustomInput mask="+7 (999) 999-99-99" placeholder="+7 (___) ___-__-__" />
      );
    }
    

    要修复它,如上所述,自己管理输入状态for example

    function App(props) {
      const [value, setValue] = useState('');
      return (
        <Form>
          <Form.Item label="Phone">
            <CustomInput
              value={value}
              onChange={e => setValue(e.target.value)}
              mask="+7 (999) 999-99-99"
              placeholder="+7 (___) ___-__-__"
            />
          </Form.Item>
          <Button htmlType="submit" type="primary">
            Send
          </Button>
        </Form>
      );
    }
    

    注意事项:

    1. 如果你使用其他form库,比如react-final-form,不要混合组件,比如在Form里面使用antd的Form.Item react-final-form使用单个库,否则你会得到 意想不到的结果。
    2. antd Formrc-form 的一个实现,所以你可以使用它的扩展 api。
    3. 当您使用 完整的 UI 库(如 antd您需要一个很好的理由来使用其他组件时,请重新考虑是否真的需要 其他form 图书馆。

    【讨论】:

    • 1) 是的,我知道。 2) 谢谢。 3)我可能在这里需要一些建议。我想使用react-final-form,因为我有一个复杂的表单,其中包含步骤、一些自定义元素、条件输入字段和一些可重复使用的部分,如不同人的地址或个人数据。我知道你可以用react-final-form 做到这一点。是否可以使用antd 中的本机形式执行此操作?
    • 你需要比较API,你描述的属性对于表单库来说不是什么特别的东西,antd支持。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-05
    • 2015-01-02
    • 2019-07-30
    • 2021-10-30
    • 2011-11-30
    相关资源
    最近更新 更多