【问题标题】:How to set or clear value of material-ui Input in ReactJS如何在 ReactJS 中设置或清除 material-ui Input 的值
【发布时间】:2019-12-16 14:22:58
【问题描述】:

我无法使用 refs 而不是 state 清除 material-ui Input 的值。

我已经尝试了我所知道的两种类型的参考: ref={this.input} - 和 - ref={el => (this.input = el)}

但似乎都无法使用 material-ui 输入

以下类似问题没有帮助: How to get input value of TextField from Material UI? Clear and reset form input fields Clear an input field with Reactjs? how to set Input value in formField ReactJs

这是我的 React JSX 的输入和按钮的 sn-p:

    <Input
      type="text"
      id="name"
      inputComponent="input"
      ref={el => (this.name = el)}
    />
    <Button
      variant="contained"
      onClick={this.handleClear}
      className="materialBtn"
    >
      Clear
    </Button>

我期望的事件处理程序应该清除输入值:

    handleClear() {
      this.name.value = "";
    }

我可以使用标准的 HTML5 输入使代码正常工作,但 不能 使用 material-ui 输入,这是该项目的要求。此外,这个元素的值不是处于反应状态,我不是在寻找需要使用状态的解决方案——我需要将这块作为不受控制的组件。

关于material-ui,我缺少什么?我已经梳理了他们的文档/api,但没有发现任何表明它需要与标准输入不同的处理方式。谢谢

下面是 CodeSandbox 上的一个示例,显示了使用 material-ui 输入的失败和使用 HTML5 输入的成功: https://codesandbox.io/s/fancy-frost-joe03

【问题讨论】:

  • Metherial UI 的版本是多少?
  • 我使用的是 material-ui/core 4.3.0。

标签: reactjs material-ui


【解决方案1】:
import React, { useState } from 'react'
    
import { Button, Container, InputBase } from '@material-ui/core'


const ClearText = ()=> {
    const [text , setText] = useState("")
}

const clearTextField = () => setText("")

    return (
        <Container>
        <InputBase 
        value={text ? text : ""}
        onChange={(e)=>setText(e.target.value)}
        />


        <Button onClick={clearTextField} > Clear </Button>
        </Container>
    )
};

export default ClearText;

【讨论】:

  • 欢迎来到 Stack Overflow。当代码附有解释时,它会更有帮助。 Stack Overflow 是关于学习的,而不是提供 sn-ps 来盲目复制和粘贴。请edit您的问题并解释它如何回答所提出的具体问题。见How to Answer。
【解决方案2】:

我想通了,你为 ref 使用了错误的道具。 您应该使用 inputRef 道具。 这是正确的版本,

<Input
    type="text"
    id="name"
    inputComponent="input"
    inputRef={el => this.name = el}           
/>
<Button
    variant="contained"
    onClick={this.handleClear}
    className="materialBtn"
>
 Clear
</Button>
handleClear() {
      this.name.value = "";
    }

原因是Material Input组件创建了一个结构如下的元素,

<div class="MuiInputBase-root MuiInput-root MuiInput-underline">
<input class="MuiInputBase-input MuiInput-input" id="name" type="text" value=""></input>
</div>

因此,使用ref 将引用根元素&lt;div&gt;。因此,他们创建了一个名为 inputRef 的单独属性来引用子元素 &lt;input&gt;。

我更新了您的 codesandbox.io 代码并保存了它。在此处查看完整的工作代码,

https://codesandbox.io/s/elastic-dhawan-l4dtf

【讨论】:

  • 哇,我从来没有想过 Material-UI 会阻止 React ref 按设计工作。如果文档不遗余力地说明必须使用 inputRef 代替标准的 React ref,那将会很有帮助。感谢您的洞察力。
  • @Coder 没错,这有点不合常规。我碰巧通过查看 API here 弄明白了。原因是 Material Input 组件创建了一个结构为 &lt;div&gt;&lt;input&gt;&lt;/input&gt;&lt;/div&gt; 的元素,因此使用 ref 将引用根元素,即
    。因此,他们创建了一个名为 inputRef 的单独 prop 来引用子元素 。我已经用这个解释更新了答案
  • 我一直忘记使用 inputRef 而不是 ref。
猜你喜欢
相关资源
最近更新 更多
热门标签