【问题标题】:React | Why the defaultValue of the input isn't being updated?反应 |为什么输入的 defaultValue 没有被更新?
【发布时间】:2021-01-24 13:24:22
【问题描述】:

我有一个调用 CEP 承诺的有状态组件,用于从邮局获取数据。当 Zip 输入用 9 个字符(8 个数字和一个“-”)完成时获取此数据,并返回一个包含所需信息的对象。

功能如下:

  const handleZipCode = useCallback(
    async ({ target }: ChangeEvent<HTMLInputElement>) => {
      const { value } = target;

      try {
        if (value.length === 9 && isDigit(value[8])) {
          const zip = await cep(value);

          if (zip?.city) {
            setZipData(zip);
          } else
            addressFormRef.current?.setErrors({
              user_zip_code: 'CEP not found',
            });
        }
      } catch (e) {
        addressFormRef.current?.setErrors({
          user_zip_code: e.message ?? 'CEP not found',
        });
      }
    },
    [isDigit]
  );

然后,在返回时我有一些字段,例如:

            <fieldset>
              <legend>Address</legend>
              <Input
                mask=''
                name='user_address'
                placeholder='Rua um dois três'
                defaultValue={zipData.street}
              />
            </fieldset>

这是输入组件:

const Input: React.FC<InputProps> = ({ name, ...rest }) => {
  const { fieldName, defaultValue, registerField, error } = useField(name);
  const inputRef = useRef(null);

  useEffect(() => {
    registerField({
      name: fieldName,
      ref: inputRef.current,
      path: 'value',
      // eslint-disable-next-line
      setValue(ref: any, value: string) {
        ref.setInputValue(value);
      },
      // eslint-disable-next-line
      clearValue(ref: any) {
        ref.setInputValue('');
      },
    });
  }, [fieldName, registerField]);

  return (
    <Container>
      <ReactInputMask ref={inputRef} defaultValue={defaultValue} {...rest} />
      {error && <Error>{error}</Error>}
    </Container>
  );
};

然而 zipData 似乎已更新,但未满足默认值。我做错了什么?

【问题讨论】:

  • 这个输入组件是什么?是你做的,还是来自图书馆?
  • 来自图书馆。实际上我正在使用 unform 和 react-input-mask。我编辑添加了 Input 组件。

标签: node.js reactjs typescript


【解决方案1】:

默认值不会改变,因为unform是一个不受控制的表单库,默认值会在页面第一次渲染时设置,然后就不会再改变了。

要解决您的问题,您可以执行以下操作:

// on your handleZipCode function
formRef.current.setData({
   zipData: {
     street: zipResult.street,
   },
});

【讨论】:

  • 我收到了这个错误:ref.setInputValue is not a function.
  • 你没有忘记current吗?
  • 是的,我一点也不喜欢 unform,我推荐你reac-hooks-form
  • 好的,我将使用下一个项目,这将创建一个巨大的额外工作来改变。我将寻找另一种更改值的方法!谢谢!
猜你喜欢
  • 1970-01-01
  • 2022-12-10
  • 2017-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-30
相关资源
最近更新 更多