如何在reactJS中获取动态输入文本的值

How to get value of dynamic input text in reactJS

本文关键字:输入 文本 动态 获取 reactJS      更新时间:2023-09-26

目前我在ReactJS中遇到了从动态组件获取值的问题。

示例:

我有5个复选框:A, B, C, D, E。当我选中A复选框时,我希望添加新的输入文本A,当我选中B以添加新的输出文本B等等。当我取消选中复选框时我希望删除相应的输入文本。

我有一个按钮"保存",当我点击保存时,我想得到渲染输入文本的值。有人有想法吗?

以下是我的代码。它并不像上面的例子。我渲染了一个表=>表列表=>列表项=>选择选项。所以我想得到表中所有的选择值:

var React = require('react');
var AssignmentTranslatorItem = React.createClass({
  getInitialState: function () {
    return {
      selectedItem: -1
    };
  },
  componentDidMount: function () {
    return {};
  },
  renderTranslator: function(translatorList) {
    var items = []
    var arrTrans = translatorList.arrTrans
    var selectedItem = translatorList.selectedItem
    if(selectedItem == -1)
      items.push(<option value="-1" selected>(Select Translator)</option>)
    else
      items.push(<option value="-1">(Select Translator)</option>)
    for (var i in arrTrans) {
      if(selectedItem == arrTrans[i].id)
        items.push(<option value={arrTrans[i].id} selected>{arrTrans[i].username}</option>)
      else
        items.push(<option value={arrTrans[i].id}>{arrTrans[i].username}</option>)
    }
    return items
  },
  render: function () {
    return (
      <tr>
        <td>{this.props.languageName}</td>
        <td>
          <select className="form-control" ref="translatorList">
            {this.renderTranslator(this.props.translatorList)}
          </select>
        </td>
      </tr>
    );
  }
});
var AssignmentTranslatorList = React.createClass({
  render: function () {
    var tmp = this.props.data.map(function (obj, index) {
      return (
        <AssignmentTranslatorItem languageName={obj.lang.name} translatorList={obj} key={index}></AssignmentTranslatorItem>
      );
    });
    return (
      <tbody>
      {tmp}
      </tbody>
    );
  }
});
module.exports = React.createClass({
  getInitialState: function () {
    return {
      data: [
        {
          "lang": {
            "id": 1,
            "name": "English"
          },
          "arrTrans": [
            {
              "id": 3,
              "username": "hhuihuihiuhuihiuh"
            },
            {
              "id": 4,
              "username": "zcdscac"
            }
          ],
          "selectedItem": 4
        },
        {
          "lang": {
            "id": 2,
            "name": "French"
          },
          "arrTrans": [
            {
              "id": 3,
              "username": "hhuihuihiuhuihiuh"
            }
          ],
          "selectedItem": -1
        }
      ]
    };
  },
  componentDidMount: function () {
  },
  render: function () {
    return (
      <div className="table-responsive">
        <table className="table table-bordred table-striped">
          <thead>
          <tr>
            <th>Language</th>
            <th>Assigned Translator</th>
          </tr>
          </thead>
          <AssignmentTranslatorList data={this.state.data} ref='assignTranslatorList'></AssignmentTranslatorList>
          <tfoot>
            <tr>
              <td></td>
              <td>
                <button type="button" className="btn btn-success">
                  Assign
                </button>
              </td>
            </tr>
          </tfoot>
        </table>
        <div className="clearfix"></div>
      </div>
    );
  }
});

我看到你需要一些类似于中LinkedStateMix的东西

var LinkedStateMixin = require('react-addons-linked-state-mixin');
var WithLink = React.createClass({
  mixins: [LinkedStateMixin],
  getInitialState: function() {
    return {message: 'Hello!'};
  },
  render: function() {
    return <input type="text" valueLink={this.linkState('message')} />;
  }
});

或者你可以用lodash自己制作,你不需要这种混合物。

linkState(propertyPath) {
    return {
        value: _.get(this.state, propertyPath),
        requestChange: value => this.setState(_.set(_.clone(this.state), propertyPath, value))
    };
}

与我的版本的最大区别是,你现在可以放弃像这样的嵌套路径

<TextInput label="Name" valueLink={this.linkState('branch.name')} />
<CheckBox label="Name" checkedLink={this.linkState('branch.name')} />

注意:如果您使用valueLink作为复选框,请改用checkedLink。