【发布时间】:2019-04-10 11:09:15
【问题描述】:
我正在尝试找到一种良好、干净、几乎没有样板的方法来处理 React 的全局状态
这里的想法是有一个 HOC,利用 React 的新 Hooks & Context API,它返回一个 Context 提供者,其值绑定到它的状态。我使用 rxjs 来触发存储更改的状态更新。
我还从我的商店中导出了更多对象(特别是:原始 rxjs 主题对象和始终返回最新值的商店代理)。
这行得通。当我在全局商店中更改某些内容时,我会在应用程序的任何地方(无论是 React 组件还是 React 外部)获得更新。然而,为了实现这一点,HOC 组件会重新渲染。
这是无操作吗?
我认为可能有问题的代码/逻辑是 HOC 组件:
const Provider = ({ children }) => {
const [store, setStore] = useState(GlobalStore.value)
useEffect(() => {
GlobalStore.subscribe(setStore)
}, [])
return <Context.Provider value={store}>{children}</Context.Provider>
}
GlobalStore 是一个 rxjs BehaviorSubject。每次更新主题时,Provider 组件的状态都会更新,从而触发重新渲染。
这里有完整的演示:https://codesandbox.io/s/qzkqrm698q
真正的问题是:这不是一种糟糕的全局状态管理方式吗?我觉得可能是因为我基本上在状态更新时重新渲染了所有内容......
编辑:我认为我已经编写了一个性能更高的版本,它不是那么轻量级(取决于 MobX),但我认为它产生的开销要少得多(演示地址:https://codesandbox.io/s/7oxko37rq) - 现在有相同的最终结果,但放弃 MobX 会很酷——这个问题不再有意义
【问题讨论】:
-
您的演示不起作用。
-
怎么样?有什么问题?
-
TypeError Cannot create proxy with a non-object as target or handlerstore.js 第 44 行 -
糟糕,感谢您指出这一点。这是因为我也在尝试将存储保存到本地存储,并且由于我的存储中已经有一个存储,它运行良好,但它有一个错误。现在已经修好了。对不起
-
Checkout MobX 和 MST 特别是它体现了您在此处尝试实现的内容。
标签: reactjs rxjs react-hooks react-context