【问题标题】:How to get input value of TextField from Material UI?如何从 Material UI 获取 TextField 的输入值?
【发布时间】:2018-09-29 18:20:15
【问题描述】:

所以,在使用材质 UI 之前,我的代码是这样的。为了实现 ToDo 应用程序的编辑功能,我使用 textarea 中的 ref 来获取当前(默认)值,然后在 save () 方法中保存更新的值(不要担心 editItem 方法,它在另一个组件中,我相信没必要发他,因为问题不存在)

import React, {Component} from 'react';
import './ToDoItem.css';
import EditButton from './EditButton';
import DeleteButton from './DeleteButton';
import SaveButton from './SaveButton';
import EditToDoField from './EditToDoField';

class ToDoItem extends Component {
    constructor(props) {
        super(props);
        this.state = {
            editMode: false,
        }
      };

      edit = () => {
        this.setState ({editMode: true});
      };

      save = () => {
        let updToDo = this.refs.newToDo.value;
        this.props.editItem (updToDo);

        this.setState ({
          editMode: false})
      };

      renderNormal = () => {
        return (
            <div className="ToDoItem">
            <p className="ToDoItem-Text">{this.props.todo}</p>
            <EditButton editHandler={this.edit} />
        </div>
        );
      };

      renderEdit = () => {
        return (
          <div className="ToDoItem">
            <textarea ref="newToDo" defaultValue={this.props.todo}></textarea>
            <SaveButton saveHandler={this.save} /> 
          </div>
        );
      };

      render() {
        if (this.state.editMode) {
          return this.renderEdit ();
        } else {
          return this.renderNormal ();
        }
      }
}

export default ToDoItem;

所以,现在我尝试从 Material UI 中实现漂亮的 TextField,texarea 标签被删除,下面是代码的相应添加:

<EditToDoField 
                ref="newToDo"
                defaultToDoValue={this.props.todo} 
            />

和 EditToDoField 组件:

import React from 'react';
import PropTypes from 'prop-types';
import { withStyles } from '@material-ui/core/styles';
import TextField from '@material-ui/core/TextField';

const styles = theme => ({
  container: {
    display: 'flex',
    flexWrap: 'wrap',
  },
  textField: {
    marginLeft: theme.spacing.unit,
    marginRight: "61px",
  },
});

class OutlinedTextFields extends React.Component {

  render() {
    const { classes } = this.props;

    return (
      <form className={classes.container} noValidate autoComplete="off">
        <TextField
          id="outlined-editToDO"
          label="Edit ToDo"
          defaultValue={this.props.defaultToDoValue}
          className={classes.textField}
          multiline
          margin="normal"
          variant="outlined"
        />
      </form>
    );
  }
}

OutlinedTextFields.propTypes = {
  classes: PropTypes.object.isRequired,
};

export default withStyles(styles)(OutlinedTextFields);

所以我将当前(默认)值传递给 EditToDoField,但是当我尝试保存更新的 ToDo 文本时,结果中出现了空字段。我知道很可能我只是错过了一些东西,但仍然没有得到什么。我也尝试使用“innerRef”和“inputRef”而不是“ref”,但没有运气。你能帮我解决这个问题吗?

【问题讨论】:

  • 我的回答好运吗?
  • 输入有效,console.log 中的值按原样显示,但保存编辑后的输入后我仍然有空字段...
  • 查看我的更新答案。
  • 它似乎工作,根据控制台,但我仍然不明白如何在我的确切代码中实现它。睡了一会儿,我必须继续……

标签: javascript reactjs


【解决方案1】:

当用户输入文本时添加一个简单的事件处理程序,然后您可以使用回调将输入从文本字段移动到您想要的任何组件,这是完整的example

import React from 'react';
import PropTypes from 'prop-types';
import { withStyles } from '@material-ui/core/styles';
import TextField from '@material-ui/core/TextField';

const styles = theme => ({
  container: {
    display: 'flex',
    flexWrap: 'wrap'
  },
  textField: {
    marginLeft: theme.spacing.unit,
    marginRight: '61px'
  }
});

class OutlinedTextFields extends React.Component {
  handleOnChange = event => {
    console.log('Click');
    console.log(event.target.value);
  };

  render() {
    const { classes } = this.props;

    return (
      <form className={classes.container} noValidate autoComplete="off">
        <TextField
          id="outlined-editToDO"
          label="Edit ToDo"
          defaultValue={this.props.defaultToDoValue}
          className={classes.textField}
          multiline
          margin="normal"
          variant="outlined"
          onChange={this.handleOnChange}
        />
      </form>
    );
  }
}

OutlinedTextFields.propTypes = {
  classes: PropTypes.object.isRequired
};

export default withStyles(styles)(OutlinedTextFields);

【讨论】:

  • 嗯,我也可以通过 inputRef 简单地获取值: this.ToDoRef = el} /> handleOnChange = event => { console.log(this.ToDoRef 。价值); };只需将此值发送到我的 ToDoItem 组件中的 save() 方法...
  • 你不需要使用引用。
  • 保罗,谢谢你,我终于明白你的意思了,现在一切正常!好吧,几乎所有东西。我还是有问题。如果我点击编辑按钮并且不更改输入文本,然后点击保存按钮,那么我会得到空字段。所以我需要实际更改字段,如果我尝试保存相同的输入,我会得到空字段。如何解决这个“错误”?请查看我的更新代码:codesandbox.io/s/01w2v171vn
  • 我相信我解决了,检查代码和框。猫你请解释什么 event.preventDefault();功能做什么?
  • 好的,但是我的按钮来自 Material UI,而不是 HTML 的默认按钮,所以我可以删除这个功能。再次感谢您)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-20
  • 1970-01-01
  • 2015-06-29
  • 1970-01-01
  • 2021-09-12
  • 2021-08-30
  • 1970-01-01
相关资源
最近更新 更多