【问题标题】:how to toggle between two list of arrays with one button react js如何用一个按钮在两个数组列表之间切换反应js
【发布时间】:2021-12-04 03:20:40
【问题描述】:

寻找有关如何使用一个按钮的建议,当单击该按钮时,该按钮会将项目列表切换为按字母顺序排列的项目列表,并在再次单击时返回等等。截至目前,当我单击按钮时,它将显示按字母顺序排列的列表,但它只是呈现在已显示的原始列表之上。不太确定从这里去哪里

class MenuItems extends Component {

    state = {
        sortedItems: []
    }

    handleclick = (item) => {
        this.props.deleteMenuItem(item.id);
    }

    menuSort = () => {
         const ogList = [...this.props.menuItems]
        let sortedList = ogList.sort((a, b) => a.name.localeCompare(b.name));
        this.setState({sortedItems: sortedList})
    };

    render(){
        return ( 
            <div>
                <button onClick={this.menuSort}>filter a to z</button>

                {this.state.sortedItems.map((item) =>(
                    <li class="list" key={item.id}>
                        {item.name}
                        <br></br>
                        {item.body}
                        <br></br>
                        <img src={item.image}></img>
                        <br></br>
                        <button id={item.id} onClick={() => this.handleclick(item)}>delete </button>
                    </li>
                ))}

                
                {this.props.menuItems.map((item) =>(
                    <li class="list" key={item.id}>
                        {item.name}
                        <br></br>
                        {item.body}
                        <br></br>
                        <img src={item.image}></img>
                        <br></br>
                        <button id={item.id} onClick={() => this.handleclick(item)}>delete </button>
                    </li>
                ))}

            </div>
        )
    }
}

export default connect(null, {deleteMenuItem})(MenuItems)```

【问题讨论】:

  • 你是什么意思“再次回来”?项目最初是如何排序的?
  • 我希望按钮在单击时一次只显示一个列表,因此页面首先呈现 props.menuItems 地图,但是当我单击按钮时,我希望它按字母顺序组织列表按名称
  • 是的,但是当再次单击按钮时,您希望它返回到最初的未排序/排序顺序。您不应该在某处保存初始数据吗?
  • 初始数据来自我认为的 props.menuItems
  • 好的。但是除非父级传入新数据或者您使用更改的数据更新组件的状态,否则不会重新渲染组件。在某些时候,该组件必须对数据的变化负责,无论是管理该状态,还是调用父级中的函数为其提供更新的数据。

标签: javascript reactjs


【解决方案1】:

您正确地认为将排序后的版本保持在状态。但是您必须以某种方式指示组件呈现原始列表或排序的列表。

所以你可以在state 中添加一个标志来指定你想要的那个。

您还可以在 componentDidMount 生命周期事件中设置排序列表,并在 menuItems 通过 componentDidUpdate 生命周期事件更改时更新它。

类似

  state = {
    sortedItems: [],
    showSorted: false
  };

  toggleSort = () => {
    this.setState(({ showSorted }) => ({
      showSorted: !showSorted
    }));
  };

  updateSortedItems() {
    const sorted = [...this.props.menuItems].sort((a, b) =>
      a.name.localeCompare(b.name)
    );
    this.setState({
      sortedItems: sorted
    });
  }

  componentDidMount() {
    this.updateSortedItems();
  }
  componentDidUpdate(prevProps) {
    if (this.props.menuItems !== prevProps.menuItems) {
      this.updateSortedItems();
    }
  }

在你的渲染方法中

let itemsToShow = this.props.menuItems;

if (this.state.showSorted) {
  itemsToShow = this.state.sortedItems;
}

当你想显示它们时使用itemsToShow

{itemsToShow.map((item) => (

https://codesandbox.io/s/elated-heyrovsky-m3jvv 上的完整工作示例

【讨论】:

  • 这对您很有帮助,谢谢
【解决方案2】:

第一个渲染状态将是存储道具值,然后当我们单击切换按钮时,只对数组进行排序。我们可以通过切换状态来检查排序与否。像这样的最终代码

class MenuItems extends Component {

    state = {
        sortedItems: this.props.menuItems.sort((a, b) => a.name.localeCompare(b.name)),
        toggle:false,
    }

    handleclick = (item) => {
        this.props.deleteMenuItem(item.id);
    }

    menuSort = () => {
         const ogList = [...this.props.menuItems]
        let sortedList = ogList.sort((a, b) => a.name.localeCompare(b.name));
        this.setState({sortedItems: sortedList})
    };

    render(){
        return ( 
            <div>
                <button onClick={()=>{
                if(this.state.toggle==false){
                 this.setState({toggle: ture})
                 this.menuSort();
                }
                else{
                  this.setState({toggle: false})
                   this.setState({sortedItems:  this.props.menuItems})
                }
          }>filter a to z</button>

                {this.state.sortedItems.map((item) =>(
                    <li class="list" key={item.id}>
                        {item.name}
                        <br></br>
                        {item.body}
                        <br></br>
                        <img src={item.image}></img>
                        <br></br>
                        <button id={item.id} onClick={() => this.handleclick(item)}>delete </button>
                    </li>
                ))}

                
                {this.state.sortedItems.map((item) =>(
                    <li class="list" key={item.id}>
                        {item.name}
                        <br></br>
                        {item.body}
                        <br></br>
                        <img src={item.image}></img>
                        <br></br>
                        <button id={item.id} onClick={() => this.handleclick(item)}>delete </button>
                    </li>
                ))}

            </div>
        )
    }
}

export default connect(null, {deleteMenuItem})(MenuItems)

【讨论】:

  • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
猜你喜欢
  • 1970-01-01
  • 2019-02-27
  • 1970-01-01
  • 1970-01-01
  • 2022-01-09
  • 2018-09-24
  • 2021-04-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多