【问题标题】:How to make dynamic state for multiple Collapse如何为多个折叠制作动态状态
【发布时间】:2019-04-14 08:07:20
【问题描述】:

我需要从数组数据中制作折叠菜单,

现在我点击任何菜单但展开所有子菜单

我认为我的问题是我不能为主菜单设置唯一状态“打开”

我不想被分配“状态” 为了支持将来可能有 3 或 4 个的附加数据

我正在使用 React.js,material-ui

请帮帮我

非常感谢

const myData = [
  {
    id: '1',
    nameHeader: 'Header1',
    subMenu: [{ id: '1', name: 'subMenu1' }, { id: '2', name: 'subMenu2' }]
  },
  {
    id: '2',
    nameHeader: 'Header2',
    subMenu: [{ id: '1', name: 'subMenu1' }, { id: '2', name: 'subMenu2' }]
  }
]

class Myclass extends Component {
  state = { open: false }

  handleClick = () => {
    this.setState(state => ({ open: !state.open }))
  }

  render() {
    const { open } = this.state
    return (
      <div style={{ marginRight: '15px' }}>
        <List component="nav">
          {myData.map(each => (
            <React.Fragment key={each.id}>
              <ListItem button onClick={this.handleClick}>
                <ListItemText inset primary={each.nameHeader} />
                {open ? <ExpandLess /> : <ExpandMore />}
              </ListItem>
              <Divider />
              <Collapse in={open} timeout="auto" unmountOnExit>
                <List component="div" disablePadding>
                  {each.subMenu.map(subData => (
                    <ListItem key={subData.id} button>
                      <ListItemText inset primary={subData.name} />
                    </ListItem>
                  ))}
                </List>
              </Collapse>
            </React.Fragment>
          ))}
        </List>
      </div>
    )
  }
}
export default Myclass

【问题讨论】:

    标签: javascript reactjs material-ui


    【解决方案1】:

    我认为我的问题是我不能为主菜单设置唯一状态“打开”

    不知何故,是的。您有两个不同的(子)菜单,您喜欢折叠/展开而不影响另一个菜单。记住这一点,您需要为每个菜单分别保存当前的“打开”状态。

    您已经为不同的菜单设置了唯一的 ID,您可以使用它们来实现您的目标。一种方法是使用菜单的相关设置来扩展您的状态:

    state = { settings: [{ id: "1", open: false }, { id: "2", open: false }] };
    

    这使您可以了解每个菜单的折叠状态。

    因此,您需要稍微扩展一下您的 handleClick 函数,以便仅更改您单击的菜单项的状态:

    handleClick = id => {
      this.setState(state => ({
        ...state,
        settings: state.settings.map(item =>
          item.id === id ? { ...item, open: !item.open } : item
        )
      }));
    };
    

    在您的渲染函数中,您需要确保将您单击的菜单项的正确 id 传递给您的 handleClick 函数,并确保您选择正确的打开状态。

    <React.Fragment key={each.id}>
      <ListItem button onClick={() => this.handleClick(each.id)}>
        <ListItemText inset primary={each.nameHeader} />
        settings.find(item => item.id === each.id).open
        ? "expanded"
        : "collapsed"}
      </ListItem>
      <Divider />
      <Collapse
        in={settings.find(item => item.id === each.id).open}
        timeout="auto"
        unmountOnExit
      >
      <List component="div" disablePadding>
        {each.subMenu.map(subData => (
          <ListItem key={subData.id} button>
            <ListItemText inset primary={subData.name} />
          </ListItem>
         ))}
       </List>
     </Collapse>
    </React.Fragment>
    

    在这里查看它的工作原理:https://codesandbox.io/s/6xjz837j9z

    【讨论】:

    • 改进了句柄点击功能。 :)
    • 感谢您的帮助 我的意思是如果我不想被分配状态 为了支持将来可能有 3 或 4 个额外菜单的其他数据 我需要做什么?
    • 您的菜单数据从何而来?我想它来自道具。在安装“MyClass”组件的那一刻,您可以相应地定义您的状态:对于每个菜单,您可以在设置数组中创建一个对象,让您控制每个菜单的折叠状态。
    猜你喜欢
    • 2021-12-06
    • 2021-11-29
    • 2019-04-20
    • 1970-01-01
    • 2019-01-09
    • 1970-01-01
    • 2021-05-19
    • 2012-11-25
    • 1970-01-01
    相关资源
    最近更新 更多