【问题标题】:Toggle dropdown list of only one div from list of multiple divs when clicked in react在反应中单击时,从多个 div 列表中切换仅一个 div 的下拉列表
【发布时间】:2021-06-14 21:51:02
【问题描述】:

我试图在单击其兄弟 div 时切换隐藏和显示无序列表。起初我的代码是切换所有 div,我为每个列表添加了唯一标识符并修改了我的代码,但现在没有任何东西被切换。 非常感谢您的帮助。

子组件

import React from 'react';

const List = ({toggle, type, sum, i, hidden}) => {
    let visibility = {hidden} ? 'block' : 'none';
 
    return(
        <div>
            <div onClick={() => toggle(i)} style={{background: 'blue'}}>{type}</div>
            <ul>
            {
                sum.map((item) => {
                    return  <div style=style={{ display: visibility}}>{item}</div> 
                })
            }
            </ul>
        </div>
    )
}

export default List;

父组件

import React from 'react'
import List from './List';
import listData from './listData.js';

class App extends React.Component {
    constructor(){
        super();
        this.state = {
            show: listData.map((element) => true)
        }
    }

    hideShow = (index) => {
        const newShowStatus = [...this.state.show];
        newShowStatus[index] = !this.state.show[index];
        this.setState({show: newShowStatus});       
    }
render(){
        const list = listData.map((item, index) => {
            return <List 
            type={item.type} sum={item.summary} 
            i={index} 
            toggle={this.hideShow.bind(this)}
            hidden={this.state.show[index]}/>                 
        })
        return(
            <div className="tc ma4">
                {list}
            </div>
        )
    }
}

export default App;

【问题讨论】:

    标签: reactjs


    【解决方案1】:

    您可以使用动态渲染,而不是动态更改 css 属性。

    当您拥有hidden = false 时,告诉List 呈现ul 标记。

    {!hidden && (
      <ul>
        {sum.map((item, index) => (
          <div key={item + index}>{item}</div>;
        )}
      </ul>
    )}
    

    记得为使用map 函数渲染的每个标签添加一个唯一键,这非常重要!

    A working example

    【讨论】:

    • 完美运行。非常感谢您的帮助。
    • 当一个列表打开时,有没有办法让所有其他打开的列表都折叠起来?
    • 如果每个列表都有一个唯一的标识符,你可以在app(父)组件中保存一个状态与打开列表的id,并在渲染每个列表时检查id以确定列表是否打开与否。 I did answer something similar
    • 谢谢,我想通了。在更新要打开的列表之前,我只需要恢复所有列表状态以关闭。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-14
    • 1970-01-01
    • 1970-01-01
    • 2020-04-14
    相关资源
    最近更新 更多