使用 useRef 更改输入值

Posted

技术标签:

【中文标题】使用 useRef 更改输入值【英文标题】:Change input value with useRef 【发布时间】:2021-01-27 19:22:36 【问题描述】:

我使用 React 的 useRef 钩子捕获了一个元素。 如果我使用 console.log(this.inputRef) 我得到:

<input aria-invalid="false" autocomplete="off" class="MuiInputBase-input-409 MuiInput-input-394" placeholder="Type ItemCode or scan barcode" type="text" value="2">

有没有办法使用 this.inputRef 更改该元素的值?然后强制其重新渲染?

【问题讨论】:

我不熟悉 React,但假设 this.inputRef 顾名思义是对元素的引用,this.inputRef.value = 'foo' 应该可以工作 您使用 ref 而不是 state 有什么原因吗?如果您在状态中管理输入值(而不是保持对元素本身的引用),则该过程通常会变得更加清晰。相关React forms documentation 因为 onchange 函数是在输入组件内部声明的,而不是来自父组件。所以我想从父组件使用 ref 触发它 【参考方案1】:

好吧,你可以这样做:

<input ref=myRef value=myRef.current.value />

唯一的问题是 refs 不会更新或重新渲染组件,因此,该值永远不会更新......而不是它可能会在您尝试将不受控制的输入设为受控时抛出错误

【讨论】:

【参考方案2】:

听起来您正在寻找的是 ImperativeHandle 钩子。

来自 React 文档:

useImperativeHandle 自定义使用 ref 时暴露给父组件的实例值

下面的代码应该适合你:

function ValueInput(props, ref) 
  const inputRef = useRef();
  useImperativeHandle(ref, () => (
    changeValue: (newValue) => 
      inputRef.current.value = newValue;
    
  ));
  return <input ref=inputRef aria-invalid="false" autocomplete="off" class="MuiInputBase-input-409 MuiInput-input-394" placeholder="Type ItemCode or scan barcode" type="text" value="2">

ValueInput = forwardRef(ValueInput);

文档:https://reactjs.org/docs/hooks-reference.html#useimperativehandle

【讨论】:

以上是关于使用 useRef 更改输入值的主要内容,如果未能解决你的问题,请参考以下文章

输入值清除 - React Hooks

“从不”类型上不存在属性“值”。在 mui 中使用 useRef 挂钩时

如何使用 useRef() 进行验证

在自定义输入元素上使用带有打字稿的 useRef

如何更改我的非输入标签的反应?

如何在玩笑测试中检查 useRef.current.selectionStart 的值