具有一个主下拉菜单的多个下拉菜单实现

ZhaZha

我正在使用来自的下拉菜单PrimeReact我必须实现它们,以便从第一个较高的主下拉列表中的值更改所有较低的值,而我已经这样做了,但是然后我需要从较低的块中每个动态下拉列表都必须仅更改更改其独特的价值:

屏幕截图

我不知道如何实现它。

这是我的代码:

    class LeagueCard extends Component {

  state = {
    selectedItemDefaultDropDown: this.props.cardContent.insuranceVariants[0],
    selectedItemPersonallyDropDown: null
  };

  createOptions = (arr) => {
    return arr.map(item => ({label: item, value:item}))
  };


  render() {
    const {
      cardIndex, cardContent: {
        insuranceVariants,
        price,
      },
    } = this.props;


    const insuranceOptions = this.createOptions(insuranceVariants);


    return (
        <>
          <div className={styles.header}>
            <h4>League {cardIndex + 1}</h4>
            <h4>Total {price.reduce((a, b) => a + b)} PLN</h4>
          </div>
          <div className={styles.defaultDropDownWrapper}>
            <p>Default variant of the insurance program</p>
            <Dropdown //MAIN DROPDOWN WORKS PERFECTLY
                value={this.state.selectedItemDefaultDropDown}
                options={insuranceOptions}
                onChange={e => {
                  this.setState({ selectedItemDefaultDropDown:e.value });
                }}
            />
          </div>
          <table>
            <thead>
            <tr>
              <th className={styles.columnName}>#</th>
              <th className={styles.columnName}>FIRST AND LAST NAME</th>
              <th className={styles.columnName}>AGE</th>
              <th className={styles.columnName}>VARIANT OF THE INSURANCE PROGRAM</th>
            </tr>
            </thead>
            <tbody>
            {insuranceVariants.map((item, index) =>
                <tr key={index} className={(index + 1) % 2 === 0 ? styles.evenTabStyle : styles.baseTabStyle}>
                  <td>{index + 1}</td>
                  <td>Jan Nowak</td>
                  <td>20</td>
                  <td>
                    <Dropdown //SECONDARY DYNAMICALLY DROPDOWNS WITH TROUBLES
                        value={this.state.selectedItemDefaultDropDown}
                        options={insuranceOptions}
                        onChange={e => {
                          this.setState({ selectedItemDefaultDropDown: e.value});
                        }}
                    />
                  </td>
                </tr>)}
            </tbody>
          </table>
        </>
    );
  }
}
Tripurari香卡

有多种方法可以实现这一目标,但是我现在想到的最简单的方法是

因为您有3个下拉菜单(在这种情况下),所以您需要为每个下拉菜单保持3个条目的状态

这样保持你的状态

{
  primaryDropdown: 'selected option',
  secondaryDropdowns: ['selected value for first', 'selected value for second']
}

我保留数组,因为您可以动态更改辅助下拉列表的数量

现在onChangeHandler主下拉菜单将如下所示

primaryOnChangeHander(selected) {
 this.setState(prevState => {
  const newState = { 
    ...prevState,
    primaryDropdown: selected,
    secondaryDropdowns: prevState.secondaryDropdowns.map(item => selected )
  };
  return newState;
 })
}

当主要下拉列表发生变化时,您还将更新主要下拉列表和次要下拉列表

onChangeHander二次下拉的样子

 secondaryOnChangeHander (selected, indexOfDropdown) {
  this.setState(prevState => ({
    ...prevState,
    secondaryDropdowns: prevState.secondaryDropdowns.map((item, index) => {
      if (index === indexOfDropdown) {
        return selected;
      } else {
       return item;
      }
    })
  }))
}

当辅助下拉列表值更改时,您仅更新该垂直下拉列表值


您的代码现在将如下所示

/* important note here: assuming that insuranceVariants is a fixed length array */
class LeagueCard extends Component {

  state = {
    /* better would be to create a variable for `this.props.cardContent.insuranceVariants[0]` and use that */
    primaryDropdown: this.props.cardContent.insuranceVariants[0],
    secondaryDropdowns: [this.props.cardContent.insuranceVariants.map(item => this.props.cardContent.insuranceVariants[0]]
  };

  createOptions = (arr) => {
    return arr.map(item => ({label: item, value:item}))
  };

  primaryOnChangeHander(selectedValue) {
    this.setState(prevState => {
      const newState = { 
        ...prevState,
        primaryDropdown: selectedValue,
        secondaryDropdowns: prevState.secondaryDropdowns.map(item => selectedValue)
      };
      return newState;
    })
  }

  secondaryOnChangeHander (selectedValue, indexOfChangedDropdown) {
    this.setState(prevState => ({
      ...prevState,
      secondaryDropdowns: prevState.secondaryDropdowns.map((item, index) => {
        if (index === indexOfChangedDropdown) {
          return selectedValue;
        } else {
          return item;
        }
      })
    }));
  }

  render() {
    const {
      cardIndex, cardContent: {
        insuranceVariants,
        price,
      },
    } = this.props;


    const insuranceOptions = this.createOptions(insuranceVariants);


    return (
      <>
        <div className={styles.header}>
          <h4>League {cardIndex + 1}</h4>
          <h4>Total {price.reduce((a, b) => a + b)} PLN</h4>
        </div>
        <div className={styles.defaultDropDownWrapper}>
          <p>Default variant of the insurance program</p>
          <Dropdown //MAIN DROPDOWN WORKS PERFECTLY
            value={this.state.primaryDropdown}
            options={insuranceOptions}
            onChange={e => {
              this.primaryOnChangeHander(e.value);
            }}
          />
        </div>
        <table>
          <thead>
            <tr>
              <th className={styles.columnName}>#</th>
              <th className={styles.columnName}>FIRST AND LAST NAME</th>
              <th className={styles.columnName}>AGE</th>
              <th className={styles.columnName}>VARIANT OF THE INSURANCE PROGRAM</th>
            </tr>
          </thead>
          <tbody>
            {insuranceVariants.map((item, index) =>
            <tr key={index} className={(index + 1) % 2 === 0 ? styles.evenTabStyle : styles.baseTabStyle}>
              <td>{index + 1}</td>
              <td>Jan Nowak</td>
              <td>20</td>
              <td>
                <Dropdown //SECONDARY DYNAMICALLY DROPDOWNS WITH TROUBLES
                  value={this.state.secondaryDropdowns[index]}
                  options={insuranceOptions}
                  onChange={e => {
                    this.secondaryOnChangeHander(e.value, index);
                  }}
                />
              </td>
            </tr>)}
          </tbody>
        </table>
      </>
    );
  }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

独立PowerShell的输出在一个下拉菜单

如何基于另一个下拉菜单更改下拉菜单值

两个下拉菜单,一个onchange

两个具有相同值的下拉菜单。如果用户在第一个下拉菜单中选择一个值,则必须在第二个下拉菜单中禁用该值

选择上一个下拉菜单时,将显示新的下拉菜单

根据另一个下拉菜单选择过滤下拉菜单

CSS在下拉菜单中有另一个下拉菜单

使用Python + Selenium选择一个下拉菜单

禁用下拉菜单中的一个或多个选项

react-leaflet隐藏一个下拉菜单

多个下拉菜单,即使我单击另一个下拉菜单,也只有一个可用

具有自动选择一个选项的动态下拉菜单及其子下拉菜单选项

下拉菜单具有不同的背景

从Rails下拉菜单中排除一个值

下拉菜单,下拉菜单中有多个值

具有默认选定值的多个下拉菜单

试图制作一个纯CSS下拉菜单-子菜单不在主节点下

根据另一个下拉菜单更改下拉菜单

在图片上堆叠一个下拉菜单

从所有下拉菜单中选择一个时,如何禁用其他下拉菜单

创建一个下拉菜单功能

当下拉菜单具有相同的ID时,如何从下拉菜单中选择一个选项

无法从下拉菜单中选择一个选项,因为我有2个下拉菜单,且具有相同的'<select class =

我有两个下拉菜单,如果更改下拉菜单的值,它将影响另一个下拉菜单

如何设计一个 html 5 下拉菜单

单击另一个关闭下拉菜单

使用“onmouseover”创建一个简单的下拉菜单

如果单击另一个下拉菜单,如何使下拉菜单自动关闭?

实现 React 下拉菜单