【问题标题】:How to reset dropdown values when an option is selected from another dropdown in React.js从 React.js 中的另一个下拉列表中选择一个选项时如何重置下拉列表值
【发布时间】:2020-05-29 10:37:55
【问题描述】:

如果用户从numbers 下拉列表中选择号码3,这将使names 下拉列表被禁用。 我想在选择选项3时将名称列表重置为“选择名称”。

const DropDown = ({ selectedValue, disabled, options, onChange }) => {
  return (
    <select onChange={onChange} disabled={disabled}>
      {
        options.map(o => <option value={o} selected={o == selectedValue}>{o}</option>)
      }
    </select>
  );
}


class App extends React.Component {

  constructor(props) {
    super(props);
    this.state = {
      numbers: [1, 2, 3, 4, 5], // 3 should disable the second dropdown and reset
      names: ['john', 'jane', 'eric'],
      selectedNumber: '',
      selectedName: ''
    }

    this.onNumbersChange = this.onNumbersChange.bind(this);
    this.onNamesChange = this.onNamesChange.bind(this);
  }

  onNumbersChange(e) {
    this.setState({ selectedNumber: e.target.value });
  }

  onNamesChange(e) {
    this.setState({ selectedName: e.target.value });
  }

  render() {
    const { numbers, names, selectedNumber, selectedName } = this.state;
    return (
      <div>
        <DropDown
          options={numbers}
          selectedValue={selectedNumber}
          onChange={this.onNumbersChange}

        />
        <DropDown
          options={names}
          selectedValue={selectedName}
          onChange={this.onNamesChange}
          disabled={selectedNumber == 3} // this will be disabled if selected value of the first dropdown is 3
        />
      </div>
    );
  }
}

ReactDOM.render(<App />, document.getElementById('root'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="root"></div>

我的下拉菜单使用 redux 表单,字段。

<Field name="Name" 
 component={renderSelect} 
 label="" 
 disabled options={options} 
 returnValue={"id"} 
 displayText={"name"} 
/> 

所以这是我的下拉列表.. 我无法重置它的值

【问题讨论】:

    标签: reactjs


    【解决方案1】:

    您需要进行 2 处更改

    1. 在onNumbersChange函数中,检查e.target.value是否等于3,如果是,更新selectedValue状态为'select name'
    2. 在DropDown组件中,如果selectedValue属性等于'select name',则额外添加一个值为'select name'的选项,并在其上添加selected属性。

    const DropDown = ({ selectedValue, disabled, options, onChange }) => {
      return (
        <select onChange={onChange} disabled={disabled}>
          { 
             selectedValue === 'select name'
               ? <option value={selectedValue} selected>{ selectedValue }</option>
               : null
          }
          {
            options.map(o => <option value={o} selected={o == selectedValue}>{o}</option>)
          }
        </select>
      );
    }
    
    
    class App extends React.Component {
    
      constructor(props) {
        super(props);
        this.state = {
          numbers: [1, 2, 3, 4, 5], // 3 should disable the second dropdown and reset
          names: ['john', 'jane', 'eric'],
          selectedNumber: '',
          selectedName: ''
        }
    
        this.onNumbersChange = this.onNumbersChange.bind(this);
        this.onNamesChange = this.onNamesChange.bind(this);
      }
    
      onNumbersChange(e) {
        if (e.target.value == 3) {
           this.setState({ selectedName: 'select name' });
        }
        this.setState({ selectedNumber: e.target.value });
      }
    
      onNamesChange(e) {
        this.setState({ selectedName: e.target.value });
      }
    
      render() {
        const { numbers, names, selectedNumber, selectedName } = this.state;
        return (
          <div>
            <DropDown
              options={numbers}
              selectedValue={selectedNumber}
              onChange={this.onNumbersChange}
    
            />
            <DropDown
              options={names}
              selectedValue={selectedName}
              onChange={this.onNamesChange}
              disabled={selectedNumber == 3} // this will be disabled if selected value of the first dropdown is 3
            />
          </div>
        );
      }
    }
    
    ReactDOM.render(<App />, document.getElementById('root'));
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
    <div id="root"></div>

    更好的方法是在您所在州的名称数组中添加'select name',因为在您的州中添加'select name' 后,您只需在App 组件中进行一些更改即可获得所需的功能。

    const DropDown = ({ selectedValue, disabled, options, onChange }) => {
      return (
        <select onChange={onChange} disabled={disabled}>
          {
            options.map(o => <option value={o} selected={o == selectedValue}>{o}</option>)
          }
        </select>
      );
    }
    
    
    class App extends React.Component {
    
      constructor(props) {
        super(props);
        this.state = {
          numbers: [1, 2, 3, 4, 5], // 3 should disable the second dropdown and reset
          names: ['select name', 'john', 'jane', 'eric'],
          selectedNumber: '',
          selectedName: ''
        }
    
        this.onNumbersChange = this.onNumbersChange.bind(this);
        this.onNamesChange = this.onNamesChange.bind(this);
      }
    
      onNumbersChange(e) {
        if (e.target.value == 3) {
           this.setState({ selectedName: this.state.names[0] });
        }
        this.setState({ selectedNumber: e.target.value });
      }
    
      onNamesChange(e) {
        this.setState({ selectedName: e.target.value });
      }
    
      render() {
        const { numbers, names, selectedNumber, selectedName } = this.state;
        return (
          <div>
            <DropDown
              options={numbers}
              selectedValue={selectedNumber}
              onChange={this.onNumbersChange}
    
            />
            <DropDown
              options={names}
              selectedValue={selectedName}
              onChange={this.onNamesChange}
              disabled={selectedNumber == 3} // this will be disabled if selected value of the first dropdown is 3
            />
          </div>
        );
      }
    }
    
    ReactDOM.render(<App />, document.getElementById('root'));
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
    <div id="root"></div>

    【讨论】:

    • 这里的数字来自 state..so 在 onNumbersChange 函数中,它被写成 this.state.names[0],我怎么写数字来自渲染功能.. 在一个差异编码我的 numbers 选项值来自一个 api,我首先在 render 中定义了它......所以如何编写它
    • 当你从api中获取数字时,将它们保存在状态中。无需在渲染函数中定义它们
    • 我的下拉列表使用的是 redux 表单,字段。 所以这是我的下拉菜单.. 我不能重置其值
    • 我已在问题中对其进行了编辑...我不知道为什么我无法重置此方法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-30
    • 2017-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多