reactjs 材料UI组件引用不起作用

ecfdbz9o  于 2022-12-22  发布在  React
关注(0)|答案(7)|浏览(142)

我正在建立一个小聊天应用程序。我已经使用材料UI文本字段输入用户消息。但我不能引用它。我读到这一点。他们说,他们不支持refs。这是我的代码。它的工作。

class App extends Component {
  constructor() {
    super();
    this.state = {
      q: "default"
    };

  }
  handleChanges(val) {
    this.setState({ q: val });
  }
  handleSearch(val) {
    this.setState({ q: val });
    console.log(this.state.q);
  }
  render() {
    return (
      <div className="App">
        <h1>  {this.state.q}</h1>
        <Row className="show-grid">
          <Col sm={2} md={4} className="contact"><h5>contact</h5><br /></Col>
          <Col sm={10} md={8} className="chat grid-border"><h5>chat</h5><br />
            <div className="history"></div>
            <div className="message top-border">

              <input type="text" ref="question" onChange={(e) => { this.handleChanges(this.refs.question.value) }} />
              <MuiThemeProvider>
                <FlatButton label="Primary" primary={true} onTouchTap={(e) => { e.preventDefault(); this.handleSearch(this.refs.question.value); }} />
              </MuiThemeProvider>

            </div>
          </Col>
        </Row>{/*show-grid ends here*/}
      </div>
    );
  }
}
export default App;

如果我使用这个材料UI TextField而不是原生HTML输入标记,它不会从引用中获得值。

<MuiThemeProvider>
       <TextField hintText="Ask your question" fullWidth={true} multiLine={true} rows={2} rowsMax={4} type="text" ref="question" onChange={(e) => { this.handleChanges(this.refs.question.value) }}/>
</MuiThemeProvider>

对此是否有任何变通方法或替代UI库?

1hdlvixo

1hdlvixo1#

也可以使用inputRef。该 prop 从材质1.0中可用。

<TextField
   className={classes.textField}
   inputRef={input => (this._my_field = input)}
   label="My field"
   fullWidth
   margin="normal"
   defaultValue={this.props.my_field}
   onChange={this.handleChange("dhis_password")}
/>

on change允许您在状态改变时更新状态,但是如果您需要保持值不变,那么inputRef是必需的。
还可以查看如何在react的material-ui中获取密码字段值

egmofgnx

egmofgnx2#

请尝试以下操作

let emailRef =React.createRef();

在材料用户界面输入字段中使用inputRef

<TextField label="Email Address" name="email" inputRef ={emailRef} />

仅使用inputRef而非ref

but5z9lq

but5z9lq3#

如果你正在使用一个带有materialui的无状态功能组件,那么你可以使用react钩子。

import React, { useState, useRef } from "react";

let MyComponent = (props) => {

  let textInput = useRef(null);

  return (
    <div>
      <Button
        onClick={() => {
          setTimeout(() => {
            textInput.current.focus();
            textInput.current.click();
            textInput.current.value="myname";
          }, 100);
        }}
      >
        Focus TextField
      </Button>
      <TextField
        fullWidth
        required
        inputRef={textInput}
        name="firstName"
        type="text"
        placeholder="Enter Your First Name"
        label="First Name"
      />
    </div>
  );
};
6tr1vspr

6tr1vspr4#

不推荐使用这种引用元素的方式。请参见https://facebook.github.io/react/docs/refs-and-the-dom.html
请尝试使用此:

<TextField hintText="Ask your question" fullWidth={true} multiLine={true} rows={2} rowsMax={4} type="text" ref={(input) => { this.input = input; }} onChange={(e) => { this.handleChanges(this.refs.question.value) }}/>

并将文本字段引用为this.input
如果要获取TextField值,请使用this.input.getValue()
我做过类似的事情。

tvmytwxo

tvmytwxo5#

在onChange方法中,您不需要使用ref来访问相同文本字段的值,material-ui TextField在onChange方法中传递2个参数:

event, value

所以你可以这样写,不用ref:

<TextField ... onChange={(e, value) =>  this.handleChanges(value) }/>

根据DOC:
onChange:函数
当文本域的值更改时触发的回调函数。
签名:功能(事件:对象,新值:字符串)=〉空
event:更改文本字段的目标事件。
newValue:文本字段的新值。

ar7v8xwq

ar7v8xwq6#

此解决方案允许使用多个TextField元素,这些元素可通过类内部的this.(name)访问。
我们仍然可以使用ref,但必须传入一个函数并在类上添加另一个属性(不是在props、refs或state上,而是在类本身上)。Material UI提供了一个.getValue()方法,我们可以从中检索值。

class App extends Component {
...
handleQuestion() {
    this.setState({
        q : this.question.getValue(),
        /** add more key/value pairs for more inputs in same way **/
    })
}
...
<MuiThemeProvider>
   <TextField 
      hintText="Ask your question"
      fullWidth={true} 
      multiLine={true} 
      rows={2} 
      rowsMax={4} 
      type="text" 
      ref={(q) => { this.question = q; }}
      onChange={ this.handleQuestion }
    />
</MuiThemeProvider> 


}
j2datikz

j2datikz7#

MenuItem中有TextField,默认情况下是隐藏的,所以我不能使用打开菜单事件,因为输入字段还没有呈现
对我来说唯一有效的方法是用DOM元素监视变量

const [textInput, setTextInput] = useState(null);

  useEffect(() => {
    if (textInput) {
      textInput.focus();
    }
  }, [textInput]);

  return (
    <MenuItem>
      <TextField
        inputRef={setTextInput}
      />
    </MenuItem>
  );

相关问题