首页 文章

如何从材料-ui TextField,DropDownMenu组件中获取数据?

提问于
浏览
38

我创建了表单,我有几个TextField,包含DropDownMenu材料-ui组件,问题是如何从一个obj中收集所有TextFields,DropDownMenus中的所有数据并将其发送到服务器上 . 对于TextField,它具有TextField.getValue()返回输入的值 . 但我不明白如何使用它 .

var React = require('react'),
    mui = require('material-ui'),
    Paper = mui.Paper,
    Toolbar = mui.Toolbar,
    ToolbarGroup = mui.ToolbarGroup,
    DropDownMenu = mui.DropDownMenu,
    TextField = mui.TextField,
    FlatButton = mui.FlatButton,
    Snackbar = mui.Snackbar;

var menuItemsIwant = [
  { payload: '1', text: '[Select a finacial purpose]' },
  { payload: '2', text: 'Every Night' },
  { payload: '3', text: 'Weeknights' },
  { payload: '4', text: 'Weekends' },
  { payload: '5', text: 'Weekly' }
];
var menuItemsIcan = [
  { payload: '1', text: '[Select an objective]' },
  { payload: '2', text: 'Every Night' },
  { payload: '3', text: 'Weeknights' },
  { payload: '4', text: 'Weekends' },
  { payload: '5', text: 'Weekly' }
];
var menuItemsHousing = [
  { payload: '1', text: '[Select housing]' },
  { payload: '2', text: 'Every Night' },
  { payload: '3', text: 'Weeknights' },
  { payload: '4', text: 'Weekends' },
  { payload: '5', text: 'Weekly' }
];
var menuItemsIlive = [
  { payload: '1', text: '[Select family mambers]' },
  { payload: '2', text: 'Every Night' },
  { payload: '3', text: 'Weeknights' },
  { payload: '4', text: 'Weekends' },
  { payload: '5', text: 'Weekly' }
];
var menuItemsLifestyle = [
  { payload: '1', text: '[Select lifestyle]' },
  { payload: '2', text: 'Every Night' },
  { payload: '3', text: 'Weeknights' },
  { payload: '4', text: 'Weekends' },
  { payload: '5', text: 'Weekly' }
];
var menuItemsLifestyle2 = [
  { payload: '1', text: '[Select savings]' },
  { payload: '2', text: 'Every Night' },
  { payload: '3', text: 'Weeknights' },
  { payload: '4', text: 'Weekends' },
  { payload: '5', text: 'Weekly' }
];
var menuItemsIncome = [
  { payload: '1', text: '[Select your yearly income]' },
  { payload: '2', text: 'Every Night' },
  { payload: '3', text: 'Weeknights' },
  { payload: '4', text: 'Weekends' },
  { payload: '5', text: 'Weekly' }
];
var Content = React.createClass({

  getInitialState: function() {
    return {
      //formData: {
      //  name: '',
      //  age: '',
      //  city: '',
      //  state: ''
      //},
      errorTextName: '',
      errorTextAge: '',
      errorTextCity: '',
      errorTextState: ''
    };
  },

  render: function() {

    return (
      <div className="container-fluid">
        <div className="row color-bg"></div>
        <div className="row main-bg">
          <div className="container">
            <div className="mui-app-content-canvas page-with-nav">
              <div className="page-with-nav-content">

                <Paper zDepth={1}>

                  <h2 className="title-h2">Now, what would you like to do?</h2>

                  <Toolbar>
                    <ToolbarGroup key={1} float="right">
                      <span>I want to</span>
                      <DropDownMenu
                        className="dropdown-long"
                        menuItems={menuItemsIwant}
                        //autoWidth={false}
                      />
                    </ToolbarGroup>
                  </Toolbar>

                  <div className="clearfix"></div>

                  <Toolbar>
                    <ToolbarGroup key={2} float="right">
                      <span>So I can</span>
                      <DropDownMenu
                        className="dropdown-long"
                        menuItems={menuItemsIcan}
                        //autoWidth={false}
                      />
                    </ToolbarGroup>
                  </Toolbar>

                  <h2 className="title-h2">Please, share a little about you.</h2>

                  <div className="clearfix"></div>

                  <Toolbar>
                    <ToolbarGroup key={3} float="right">
                      <span>I am</span>
                      <TextField
                        id="name"
                        className="text-field-long"
                        ref="textfield"
                        hintText="Full name"
                        errorText={this.state.errorTextName}
                        onChange={this._handleErrorInputChange}
                      />
                      <span>and I am</span>
                      <TextField
                        id="age"
                        className="text-field-short"
                        ref="textfield"
                        hintText="00"
                        errorText={this.state.errorTextAge}
                        onChange={this._handleErrorInputChange}
                      />
                      <span className="span-right-measure">years of age.</span>
                    </ToolbarGroup>
                  </Toolbar>

                  <div className="clearfix"></div>

                  <Toolbar>
                    <ToolbarGroup key={4} float="right">
                      <span>I</span>
                      <DropDownMenu
                        hintText="I"
                        menuItems={menuItemsHousing}
                        //autoWidth={false}
                      />
                      <span>in</span>
                      <TextField
                        id="city"
                        ref="textfield"
                        className="text-field-long"
                        hintText="City"
                        errorText={this.state.errorTextCity}
                        onChange={this._handleErrorInputChange}
                      />
                      <span>,</span>
                      <TextField
                        id="state"
                        ref="textfield"
                        className="text-field-short text-field-right-measure"
                        hintText="ST"
                        errorText={this.state.errorTextState}
                        onChange={this._handleErrorInputChange}
                      />
                    </ToolbarGroup>
                  </Toolbar>

                  <div className="clearfix"></div>

                  <Toolbar>
                    <ToolbarGroup key={5} float="right">
                      <span>Where I live</span>
                      <DropDownMenu
                        className="dropdown-long"
                        menuItems={menuItemsIlive}
                        //autoWidth={false}
                      />
                    </ToolbarGroup>
                  </Toolbar>

                  <div className="clearfix"></div>

                  <Toolbar>
                    <ToolbarGroup key={6} float="right">
                      <span>My lifestyle is</span>
                      <DropDownMenu
                        className="dropdown-short"
                        menuItems={menuItemsLifestyle}
                        //autoWidth={false}
                      />
                      <span>and I've saved</span>
                      <DropDownMenu
                        className="dropdown-short"
                        menuItems={menuItemsLifestyle2}
                        //autoWidth={false}
                      />
                    </ToolbarGroup>
                  </Toolbar>

                  <div className="clearfix"></div>

                  <Toolbar>
                    <ToolbarGroup key={7} float="right">
                      <span>My yearly household is about</span>
                      <DropDownMenu
                        className="dropdown-mobile"
                        menuItems={menuItemsIncome}
                        //autoWidth={false}
                      />
                    </ToolbarGroup>
                  </Toolbar>

                  <div className="clearfix"></div>

                  <div className="button-place">
                    <FlatButton
                      onTouchTap={this._handleClick}
                      label="I'm done lets go!"
                    />

                    <Snackbar
                      ref="snackbar"
                      message="Invalid input, please check and try again"
                    />
                  </div>

                </Paper>

              </div>
            </div>
          </div>
        </div>
      </div>
    );
  },

  _handleErrorInputChange: function(e) {
    if (e.target.id === 'name') {
      var name = e.target.value;
      this.setState({
        //name: name,
        errorTextName: e.target.value ? '' : 'Please, type your Name'
      });
    } else if (e.target.id === 'age') {
      var age = e.target.value;
      this.setState({
        //age: age,
        errorTextAge: e.target.value ? '' : 'Check Age'
      });
    } else if (e.target.id === 'city') {
      var city = e.target.value;
      this.setState({
        //city: city,
        errorTextCity: e.target.value ? '' : 'Type City'
      });
    } else if (e.target.id === 'state') {
      var state = e.target.value;
      this.setState({
        //state: state,
        errorTextState: e.target.value ? '' : 'Type State'
      });
    }
  },

  _handleClick: function(e) {
    this.refs.snackbar.show();
    //TODO: find a way to change errorText for all empty TextField
    if (this.refs.textfield && this.refs.textfield.getValue().length === 0) {
      this.setState({
        errorTextState: 'Type State',
        errorTextCity: 'Type City',
        errorTextAge: 'Check Age',
        errorTextName: 'Please, type your Name'
      });
    }
  }

});

module.exports = Content;

我想在_handleClick方法中将它发送到服务器上 .

6 回答

  • 70

    use the accepted answer / this was the answer to another (already deleted) question

    @karopastal

    ref 属性添加到 <TextField /> 组件并在其上调用getValue(),如下所示:

    零件:

    <TextField ref="myField" />
    

    使用getValue:

    this.refs.myField.getValue()
    
  • 2

    为每个 TextFieldDropDownMenu 元素添加 onChange 处理程序 . 调用它时,将这些输入的新值保存在 Content 组件的 state 中 . 在渲染中,从 state 中检索这些值并将它们作为 value prop传递 . 见Controlled Components .

    var Content = React.createClass({
    
        getInitialState: function() {
            return {
                textFieldValue: ''
            };
        },
    
        _handleTextFieldChange: function(e) {
            this.setState({
                textFieldValue: e.target.value
            });
        },
    
        render: function() {
            return (
                <div>
                    <TextField value={this.state.textFieldValue} onChange={this._handleTextFieldChange} />
                </div>
            )
        }
    
    });
    

    现在,您在 _handleClick 方法中所要做的就是从 this.state 检索所有输入的值并将它们发送到服务器 .

    您还可以使用 React.addons.LinkedStateMixin 来简化此过程 . 见Two-Way Binding Helpers . 之前的代码变为:

    var Content = React.createClass({
    
        mixins: [React.addons.LinkedStateMixin],
    
        getInitialState: function() {
            return {
                textFieldValue: ''
            };
        },
    
        render: function() {
            return (
                <div>
                    <TextField valueLink={this.linkState('textFieldValue')} />
                </div>
            )
        }
    
    });
    
  • 0

    flson的代码对我不起作用 . 对于那些处于类似情况的人来说,这是我稍微不同的代码:

    <TextField ref='myTextField'/>

    得到它的 Value

    this.refs.myTextField.input.value

  • 3

    接受的答案的策略是正确的,但这是一个与当前版本的React和Material-UI一起使用的通用示例 .

    数据流应该是单向的:

    • 在MyForm控件的构造函数中初始化了initialState

    • TextArea 是从这个初始状态填充的
      _999_对TextAreas的更改通过 handleChange 回调传播到 state .

    • state 是从 onClick 回调中访问的---现在它只是写入控制台 . 如果你想添加验证,它可以去那里 .

    import * as React from "react";
    import TextField from "material-ui/TextField";
    import RaisedButton from "material-ui/RaisedButton";
    
    const initialState = {
        error: null, // you could put error messages here if you wanted
        person: {
            firstname: "",
            lastname: ""
        }
    };
    
    export class MyForm extends React.Component {
    
        constructor(props) {
            super(props);
            this.state = initialState;
            // make sure the "this" variable keeps its scope
            this.handleChange = this.handleChange.bind(this);
            this.onClick = this.onClick.bind(this);
        }
    
        render() {
            return (
                <div>
                    <div>{this.state.error}</div>
                    <div>
                        <TextField
                            name="firstname"
                            value={this.state.person.firstname}
                            floatingLabelText="First Name"
                            onChange={this.handleChange}/>
                        <TextField
                            name="lastname"
                            value={this.state.person.lastname}
                            floatingLabelText="Last Name"
                            onChange={this.handleChange}/>
                    </div>
                    <div>
                        <RaisedButton onClick={this.onClick} label="Submit!" />
                    </div>
                </div>
            );
        }
    
        onClick() {
            console.log("when clicking, the form data is:");
            console.log(this.state.person);
        }
    
        handleChange(event, newValue): void {
            event.persist(); // allow native event access (see: https://facebook.github.io/react/docs/events.html)
            // give react a function to set the state asynchronously.
            // here it's using the "name" value set on the TextField
            // to set state.person.[firstname|lastname].            
            this.setState((state) => state.person[event.target.name] = newValue);
    
        }
    
    }
    
    
    React.render(<MyForm />, document.getElementById('app'));
    

    (注意:您可能希望为每个MUI组件编写一个 handleChange 回调以消除那个丑陋的 event.persist() 调用 . )

  • 5

    这是我提出的最简单的解决方案,我们得到材料-ui textField创建的输入值:

    create(e) {
            e.preventDefault();
            let name = this.refs.name.input.value;
            alert(name);
          }
    
          constructor(){
            super();
            this.create = this.create.bind(this);
          }
    
          render() {
            return (
                  <form>
                    <TextField ref="name" hintText="" floatingLabelText="Your name" />
    <RaisedButton label="Create" onClick={this.create} primary={true} /> </form> )}

    希望这可以帮助 .

  • 45
    class Content extends React.Component {
        render() {
            return (
                <TextField ref={(input) => this.input = input} />
            );
        }
    
        _doSomethingWithData() {
            let inputValue =  this.input.getValue();
        }
    }
    

相关问题