【问题标题】:How to make a child component of a sibling component refresh when a button is pressed in ReactJS?在 ReactJS 中按下按钮时,如何使兄弟组件的子组件刷新?
【发布时间】:2020-08-20 20:43:40
【问题描述】:

所以我已经搜索了解决方案,但似乎找不到适合我正在做的事情的解决方案。这是我网站的结构:

https://ibb.co/Xz27rgK

如您所见,我在路由器之外有我的“NavBar”组件,因为我总是希望它被渲染。但是我在导航栏上有一个暗模式切换,当我点击它时,我希望它更新图表组件的刷新(它是一个 react-chartjs-2 图表)。

我知道您可以使用 setState(); 重新渲染,但是当我运行其中的 onClick(); 函数时,如何告诉图表组件从导航栏执行此操作?

【问题讨论】:

    标签: javascript reactjs chart.js react-chartjs


    【解决方案1】:

    对于一个组件要触发兄弟组件或兄弟组件的子组件的重新渲染,它们必须触发某些共享父组件的重新渲染。在这种情况下,所有组件都成为单个根组件的子组件是有意义的,因为主题应该在整个项目中保持一致,除非您有一些特定的用例。

    可能最简单的方法是从最顶层组件传入回调setTheme 以及theme 属性。在setTheme 回调中,您应该调用最顶层父组件的setState,这将触发使用新主题重新渲染每个子组件。

    查看here 了解如何更改 React 组件主题的更详细说明。

    【讨论】:

    • 那么您会建议我将页面的其余部分作为导航栏的子项吗?这是好习惯吗?或者是否应该有另一种方式来构建我没有意识到的项目。如果这是一个愚蠢的问题,我深表歉意,因为这是我第一次接触 React。
    • 我不会把它放在导航栏下。通常所有的 react 组件都是一些根组件的子组件,它们只为每个页面提供一些公共状态和组件,例如页眉和页脚,并可能确定要渲染哪些其他组件并从那里委托所有内容。您可以将根组件视为一个空白画布,在其上绘制反应组件。所以导航栏可能是那些常见的组件之一,根组件将保存theme 状态。
    • 好的,所以我在父组件中有一个函数,它导入NavBar和Home,其中home导入图表组件并显示它。我在父对象中使用了this.setState(this.state);,但它没有重新加载图表对象。我通过在图表组件中尝试console.log() 对此进行了测试,但它仅从初始加载中获取输出。如果这是我犯的一个简单错误或误解,我深表歉意,感谢您的帮助。
    • 这些组件中的每一个都采用theme 属性?如果他们不这样做,则不会为他们更新任何状态,并且 DOM 的整个分支将在重新渲染中被忽略并保持不变
    • 如果我明白你的建议,我相信。我有 View.jsx,它将主题元素从其状态传递给 Home.jsx,然后将其传递给 Chart.jsx。更改主题的函数在 View.jsx 中,当单击 NavBar 中的按钮时会触发该函数。 NavBar.jsx 也是 View.jsx 的子级。当函数被调用时,它会调用this.setState(this.state);,它再次位于 Views.jsx 中。
    猜你喜欢
    • 2019-09-17
    • 2018-03-06
    • 2018-03-06
    • 2017-06-13
    • 2019-04-06
    • 2018-10-08
    • 2016-08-21
    • 2017-11-11
    • 1970-01-01
    相关资源
    最近更新 更多