javascript - ReactJS - 组件之外的全局状态
问题描述
我一直在阅读和观看有关 Redux 的视频,并看到很多关于在组件中管理状态或使用 Redux 的争论。我没有看到关于使用标准全局变量完全在组件之外管理状态的任何内容。
例如,我可以像这样设置一个全局状态变量:
let state = {
player: {
username: "BillyBob",
score: 100
}
}
然后在一个 React 组件中,我可以有这样的东西:
incrementScore() {
state.player.score += 1
props.update()
}
然后在 App.js 中,我可以有这个:
update() {
this.forceUpdate()
}
我意识到我仍然需要通过树向下传递更新函数,但我至少能够在组件级别设置函数,而不必担心将多个状态和函数传递给子组件。
我是 React 的新手,但我能想到的唯一缺点是无法要求 propTypes。还有什么我想念的吗?
编辑:根据我澄清问题的要求,上面的实现是否有任何重大缺点,我应该考虑这会影响甚至相对简单的应用程序?
解决方案
如果您查看redux
那里的一些其他状态管理库的实现(例如mobx
or mobx-state-tree
),基本上它们都将组件外部的状态作为独立对象维护。
但是,为了有效地检测更改并触发重新渲染,他们实现了一个 HOC,它connect
位于 inredux
和inject
in 中mobx
,HOC(高阶组件)所做的是将您的组件包装在另一个可以访问 global 的组件中state
,并传递该部分您的组件通过其道具要求的状态。这样,组件只有在它需要的数据发生变化时才会重新渲染。
与这些流行的库方法相比,您提出的解决方案存在几个问题。
首先是使用forceUpdate
,基本上,您可能想做的最后一件事是调用forceUpdate
应用程序的根节点,考虑当有人输入输入并且整个应用程序重新呈现每一次击键时的场景。
第二个是将一个update
函数向下传递给多个子级,如果您只有 1 或 2 个嵌套组件会很好,但这将是您的应用程序增长的一个大问题。update
随着您的应用程序的增长和您的状态变得更加复杂,使用单个函数来控制整个state
对象可能不是最好的主意。
推荐阅读
- c# - C# 在二维图中表示二进制数据?
- python-3.x - 具有注意层 tf.keras 的双向 LSTM
- events - 使用 Prism 时如何传递和接收 Sender 事件参数?
- angular - 错误类型错误:无法读取 Object.eval [as updateRenderer] 处未定义的属性“temp”(SearchCitiesComponent.html:21)
- vue.js - VSCode 不在 .vue 文件中显示 HTML 属性,而是在 html 文件中显示
- python - Tkinter ttk Checkbutton检查未显示样式
- c# - 添加用户名后出现 ASP.Net Core Identity 错误“InvalidOperationException:序列包含多个元素”
- java - 在文件 log4j2 中记录运行时异常
- python - sys._current_frames() 中的孤立堆栈跟踪
- powershell - PowerShell 的 echo 和 CMD 的 echo 的区别