【问题标题】:Unable to retrieve the input field of material UI using refs in react js无法使用react js中的refs检索材料UI的输入字段
【发布时间】:2018-07-12 16:31:17
【问题描述】:

我正在使用 React JS + Material UI 核心开发一个 Web 应用程序。现在,我正在使用材质 ui 控件构建一个表单。现在,我正在尝试使用 React 的 refs 检索输入字段值(TextField)。它总是说未定义。

这是我的组件

class CreateEventComponent extends React.Component{

    constructor(props)
    {
        super(props)


    }


    submitCreateEventForm(e)
    {
        e.preventDefault();
        alert(this.refs.name.input.value)
    }

    render()
    {
        return (
            <MuiThemeProvider>
            <div className={scss['page-container']}>
            <Grid
            spacing={16}
            container>
                <Grid item md={12}>
                    <Card>
                    <CardContent>
                        <form onSubmit={this.submitCreateEventForm.bind(this)}>
                        <div>
                            <TextField
                            ref="name"
                            className={scss['form-control']}
                            name="name"
                            label="Name" />
                        </div>

                        <div>
                        <Grid>
                        <Button type="submit" color="primary" variant="raised">Save</Button>
                        </Grid>
                        </div>
                        </form>
                    </CardContent>
                    </Card>
                </Grid>
            </Grid>
            </div>
            </MuiThemeProvider>
        )
    }

}

function mapStateToProps(state)
{
    return {

    };
}

function matchDispatchToProps(dispatch)
{
    return bindActionCreators({

    }, dispatch);
}

const enhance = compose(withWidth(), withStyles(themeStyles, { withTheme: true }), connect(mapStateToProps, matchDispatchToProps))
export default enhance(CreateEventComponent);

如您所见,当表单提交时,我正在尝试使用 refs 来提醒名称输入字段。但它总是显示“未定义”。我尝试使用它来获取 TextField 的值。

alert(this.refs.name.value)

它会抛出错误,说名称未定义。那么,如何使用 Ref 获取 TextField 的值呢?

我也是这样用的。

我在构造函数中创建 ref

 constructor(props)
    {
        super(props)

        this.nameRef = React.createRef();
    }

然后设置TextField的ref

<TextField
                            ref={this.nameRef}
                            className={scss['form-control']}
                            name="name"
                            label="Name" />

然后以这种方式检索值。

this.nameRef.value
this.nameRef.input.value

它也给了我同样的错误。

【问题讨论】:

    标签: reactjs material-ui


    【解决方案1】:

    原始答案

    您需要在构造函数中创建一个ref

    来自docs

    class MyComponent extends React.Component {
        constructor(props) {
            super(props);
            this.myRef = React.createRef(); // create a ref
        }
    
        render() {
            return <div ref={this.myRef} />;
        }
    }
    

    更新答案

    根据 Material UI 的 documentation,您需要将回调传递给 &lt;TextField /&gt; 上的 inputRef 属性。

    所以,除了原来的答案,也试试这个:

    <TextField
        inputRef={e => this.nameRef = e}
        className={scss['form-control']}
        name="name"
        label="Name" />
    

    【讨论】:

    • 我也尝试过这种方式。不工作。如果你想检查,我更新了问题。
    • 您使用的是哪个版本的 React 和 Material?尝试将 inputRef={e =&gt; this.nameRef = e} 传递给您的 &lt;TextField /&gt; 组件。
    • 核心。像这样导入的那个 - import TextField from '@material-ui/core/TextField/TextField';
    • 这个答案缺乏关于版本的适当上下文,并且可能是指大多数用户在提出这个问题时没有使用的最新版本的 react。
    • 这个答案是完全错误的,并没有解决问题。
    【解决方案2】:

    如果您正在使用带有材质 ui 的无状态功能组件,那么您可以使用 react hooks。

    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";
                console.log(textInput.current.value);
              }, 100);
            }}
          >
            Focus TextField
          </Button>
          <TextField
            fullWidth
            required
            inputRef={textInput}
            name="firstName"
            type="text"
            placeholder="Enter Your First Name"
            label="First Name"
          />
        </div>
      );
    };
    

    【讨论】:

      【解决方案3】:

      对我来说,这解决了问题:

      <TextField
        ref={this.nameRef}
        onChange={e => {
          this.nameRef.current.value = e.target.value;
        }}
        className={scss['form-control']}
        name="name"
        label="Name" />
      

      【讨论】:

        猜你喜欢
        • 2020-01-25
        • 1970-01-01
        • 2020-12-20
        • 2018-11-23
        • 2021-10-07
        • 1970-01-01
        • 1970-01-01
        • 2021-10-18
        • 2020-09-19
        相关资源
        最近更新 更多