【问题标题】:Creating dependant fields in Reactjs?在 Reactjs 中创建依赖字段?
【发布时间】:2016-01-27 18:27:54
【问题描述】:

这是我渲染的

<select>
   <option>1</option>
   <option>2</option>
</select>

下拉列表中选择任何选项。我必须呈现另一个下拉列表 在它旁边

<select>
   <option>1</option>
   <option>2</option>
</select>
<select>
   <option>1.1</option>
   <option>1.2</option>
</select>

然后从第二个下拉列表中选择选项。我必须在其旁边呈现文本类型的输入字段。

如何在 react 中实现这一点?

var React = require('react');
var ReactDOM = require('react-dom');

var View = React.createClass({  

getInitialState: function() {
     return {
         value: '------'
     }
},
handleChange: function(event){
     this.setState({value: event.target.value});
     this.getFields(event.target.value);

},
handleClick : function(){

},
render : function(){
    return (<div>
            <p>
                <i className="plusSymbol fa fa-minus-circle"></i>
                <select onChange={this.handleChange} value={this.state.value} className="js-example-basic-single">
                <option value="">------</option>
                <option value="1">1</option>
                <option value="2">2</option>
                </select>
            </p>
            <p>
                <i onClick={this.handleClick} className="plusSymbol fa fa-plus-circle"></i>
                <span>Add a new condition</span>
            </p>
        </div>);
    }});
   module.exports = View;

所以我的视图应该是这样的 [Dropdown][Dropdown][Text Field]

【问题讨论】:

    标签: javascript reactjs


    【解决方案1】:

    以下示例应该为您指明正确的方向...

    var Hello = React.createClass({
    
      getDefaultProps: function () {
        return {
          fieldMap: {
            "1": [
              { value: "1.1", label: "1.1" },
              { value: "1.2", label: "1.2" }
            ],
            "2": [
              { value: "2.1", label: "2.1" },
              { value: "2.2", label: "2.2" }
            ]
          }
        }
      },
    
      getInitialState: function() {
         return {
             firstValue: '',
             secondValue: '',
             thirdValue: ''
         }
      },
    
      getOptions: function (key) {    
        if (!this.props.fieldMap[key]) {
          return null;
        }
    
        return this.props.fieldMap[key].map(function (el, i) {
            return <option key={i} value={el.value}>{el.label}</option>
        });
      },
    
      handleFirstLevelChange: function (event) {
        this.setState({
          firstValue: event.target.value,
          secondValue: '',
          thirdValue: ''
        });
      },
    
      handleSecondLevelChange: function (event) {
        this.setState({
            secondValue: event.target.value,
          thirdValue: ''
        });
      },
    
      handleThirdLevelChange: function (event) {
          this.setState({
            thirdValue: event.target.value
        });
      },
    
      getSecondLevelField: function () {
        if (!this.state.firstValue) {
            return null;
        }
    
        return (
            <select onChange={this.handleSecondLevelChange} value={this.state.secondValue}>
            <option value="">---</option>
            {this.getOptions(this.state.firstValue)}
          </select>
        )
      },
    
      getThirdLevelField: function () {
        if (!this.state.secondValue) {
            return null;
        }
    
        return (
            <input type="text" onChange={this.handleThirdLevelChange} value={this.state.thirdValue} />
        )
      },
      render: function() {
        return (
        <div>
            <select onChange={this.handleFirstLevelChange} value={this.state.firstValue}>
            <option value="">---</option>
            <option value="1">1</option>
            <option value="2">2</option>
          </select>
          {this.getSecondLevelField()}
          {this.getThirdLevelField()}
        </div>
        );
      }
    });
    

    https://jsfiddle.net/27u9Lw4t/1/观看直播

    【讨论】:

    • 你能解释一下它是如何工作的,因为我是新手。
    • 嘿,我在小提琴中添加了几个 cmets。希望对jsfiddle.net/27u9Lw4t/3有帮助
    • 如果第三级是多选下拉菜单,你能修改小提琴吗?我尝试添加一个 。但它不起作用。我不能选择多个选项。
    • 今晚我会调查一下……
    • 检查一下 :) 我使用 for 循环遍历多选字段:jsfiddle.net/27u9Lw4t/7
    猜你喜欢
    • 2011-10-09
    • 2023-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多