【问题标题】:How can we customize @material ui <ExpansionPanelSummary> expandIcon with Add & Remove Icons?我们如何使用添加和删除图标自定义@material ui <ExpansionPanelSummary> expandIcon?
【发布时间】:2019-07-10 06:46:16
【问题描述】:

我对@9​​87654323@ 和@Material UI 很陌生,我尝试了不同的锻炼方式,但还没有运气。有人可以指导我如何用expandIcon的AddRemove图标覆盖ExpandLessExpandMore图标。这是代码https://stackblitz.com/edit/react-d2xrnq。我还注意到@Material UI &lt;ExpansionPanel&gt; 组件默认使用defaultExpanded 属性来展开所有扩展面板。那么,有什么方法可以通过单击折叠所有展开的扩展面板?

非常感谢您抽出宝贵时间。

【问题讨论】:

  • 不确定我是否完全理解您的问题。你想用另一个图标替换ExpandMore,是吗?并且没有ExpandLess 图标,它只是使用CSS 旋转的ExpandMore 图标。请问您为什么要用与创造性/破坏性操作相关联的图标替换在展开/折叠上下文中有意义的图标?最后,是的,您可以通过其expanded 属性控制每个面板的状态,因此您可以添加逻辑以通过单击来展开/折叠所有面板。
  • 我想解释一下我问 WHY 背后的原因。如果我点击Remove 图标,我希望面板会被完全移除,而不是折叠。如果我点击Add 图标,我希望创建一个新面板(可能在某个表单对话框之后)。因此,使用这些图标来展开/折叠面板会非常违反直觉(并且与 Material 的“哲学”完全相反)。
  • @Jaxx,感谢您抽出宝贵的时间,我完全同意您的意见,但我的应用程序 UX 团队以这种方式设计了模拟,因此在多次尝试相同且没有看到任何运气之后,我将其放在这里。是的,我需要与 UX 团队讨论同样的事情,看看情况如何。我希望你会注意到这里https://react-d2xrnq.stackblitz.io 甚至左侧列表项也有AddRemove 图标。 @Jaxx - 如果你有时间,你能分享一个示例代码 sn-p 如何通过单击来折叠扩展面板?
  • 实际上,我很困惑,以为您指的是CreateDelete 图标(笔和垃圾桶)。加号和减号并不是那么糟糕,尽管它们也不是非常适合;)

标签: reactjs material-ui


【解决方案1】:
  1. 使用不同的图标只是导入它们并使用它们代替ExpandMoreIcon 的一种情况。此外,我们跟踪每个面板的状态(参见下面的第 2 点)并使用三元组来决定根据该状态显示哪个图标。
  <ExpansionPanelSummary
    expandIcon={
      this.state.expanded[statIndex]
      ? <Remove onClick={this.handleToggleOne(statIndex)} />
      : <Add onClick={this.handleToggleOne(statIndex)} />
    }
  >
    // panel contents
  </ExpansionPanelSummary>
  1. 我们在状态中跟踪expanded 数组中的各个面板状态,并且我们还通过状态中的expandAll 布尔值跟踪“分组”切换。 expandAll 默认设置为 false,在加载面板时,expanded 数组初始化为所有 false 值(与面板一样多)。

每个可折叠面板的expanded 属性都设置为状态中对应的expanded 数组值。这决定了面板的状态(如果为假则折叠,如果为真则展开)。

我们设置了两个处理程序: handleToggleOne 与面板的索引一起使用,并附加到该面板的展开/折叠图标上。它在指定的索引处单独设置面板的状态。

  handleToggleOne = (index) => () => {
    const { expanded } = this.state
    expanded[index] = !expanded[index]
    this.setState({ expanded })
  }

handleToggleAll 用于一次打开或关闭所有面板。我们跟踪并切换状态中的expandAll 值,并将expanded 数组中的每个元素设置为该值。然后将处理程序附加到全局“Toggle All”Button

  handleToggleAll = () => {
    this.setState(state => ({ expandAll: !state.expandAll, expanded: state.expanded.map(e => !state.expandAll) }))
  }

您可以在此处找到您的代码的工作分支:https://react-wd5uxp.stackblitz.io

(代码编辑器链接:https://stackblitz.com/edit/react-wd5uxp

【讨论】:

  • 非常感谢您抽出宝贵时间 Jaxx。看起来你分享了源代码的最终布局 url,你能分享一下实际的源代码 url,这样我就可以查看完整的代码并在确认之前尝试我的结果?
  • @Venki 刚刚做到了! :)
  • 非常感谢@Jaxx 的宝贵时间。我很高兴为您的完美答案投票并打勾,也让我更能理解您的建议。您的解决方案完美解决了我的问题。当我刚开始学习 ReactJs 和 Material UI 时,我将来可能也需要你的输入 :)。我希望你能帮助我。再次感谢 Jaxx。
猜你喜欢
  • 1970-01-01
  • 2023-03-07
  • 2017-09-22
  • 2021-07-05
  • 2021-11-17
  • 2020-07-16
  • 2019-09-05
  • 2023-01-31
  • 1970-01-01
相关资源
最近更新 更多