javascript - 文本编辑器的 Redux 架构 : dealing with coupled state

标签 javascript redux

我正在使用 React/Redux 构建一个在某些方面类似于文本编辑器的应用程序。它不完全是一个文本编辑器,但它是相同的通用范例。有一个用于放置新项目的光标。可以添加、选择、删除项目等。

我正在努力寻找一种符合 redux 精神的最佳方式来构建我的 reducer。我有单独的状态切片来表示选择状态、文本本身、光标状态和其他设置。我认为“redux”方法是为每个状态切片设置缩减器,独立地改变状态以响应 Action 。

然而,在文本编辑器中,这些状态片比乍看之下更加耦合。当你按下一个键时,有时会在光标所在的位置添加一个字母,并且光标会向前移动。但是,如果选择了文本,则将首先删除所选文本。如果您处于“插入”模式,右侧的文本将被“消耗”。或者可能按下了修改键,根本没有添加文本。

换句话说,不同的状态切片是非常耦合的,其中一个发生的事情取决于其他状态的当前状态。

我读过 "Beyond Combine Reducers" section in the Redux manual并且知道如何在 slice reducer 之间共享状态,但是如果最终结果是将整个状态传递给每个 slice reducer,这似乎并不优雅。我不喜欢他的方法的另一件事是,每个 reducer 都必须查看整体状态,并独立得出相同的结论,即它对特定操作的正确响应应该是什么。那是我应该做的还是我应该以某种方式以不同的方式构建我的状态?

一个集中化简器告诉光标、选择状态、内容等如何改变的替代方案在概念上更容易,但似乎不能很好地扩展。

I've also read that many times coupled state is a sign that your state isn't minimal并且您应该重组并使用内存选择器。然而,这里似乎并非如此。光标的位置不能从文本中导出,选择状态也不能。

最后,我还考虑了 Thunk 中间件,因为这是我看到的用于处理多个/更复杂操作的建议。我很犹豫,因为它似乎更适合异步调度,但事实并非如此。

我想了解设计这种最符合“redux”设计模式的应用程序的正确方法,并了解如果有多种前进方式可能存在的任何权衡。

最佳答案

我写了"Structuring Reducers"文档部分,很高兴看到人们至少在阅读它并发现它很有用:)

你是对的,Redux reducer 逻辑的惯用意图方法是小型 reducer 函数,按状态切片组织,独立响应相同的操作。然而,这不是一个固定的要求,而且肯定有一些时候将一些逻辑整合到一个地方更有意义。

如果不了解您的状态结构是什么以及您要解决的问题到底是什么,很难给出绝对具体的建议,但总的来说,您应该随意以任何方式构建您的状态和 reducer 逻辑对您的 应用程序最有意义。如果将其中的一些逻辑放在一个更集中的 reducer 函数中,一次更新多个嵌套的状态片段会更好,那就去做吧!

作为其他一些观察结果:

根据 Redux FAQ question on "sharing state across reducers" ,一种方法是将更多信息放入已派发的操作中。例如,您可以发送 {type : "KEYSTROKE", key : "A", cursorPos : 12345,而不是发送 {type : "KEYSTROKE", key : "A"}, ctrl:真,alt:假

此外,虽然 thunk 是基本异步逻辑的好地方,但它们对于复杂的同步逻辑也很有用,包括检查当前应用程序状态。我有 a gist that demonstrates some common thunk use cases .

让我抛出一些更多的资源,可能对您有一般帮助:

(作为旁注,我目前还在撰写一篇博文,讨论 Redux 需要哪些实际技术限制以及原因,以及您“打算”使用 Redux 的方式,以及如何可能使用 Redux。我需要一段时间才能完成它,但如果您有兴趣,请关注我的博客。)

最后,如果您想进一步讨论,Discord 上的 Reactiflux 聊天 channel 是闲逛、提问和学习的好地方。邀请链接在https://www.reactiflux.com .请随时到访那里并提出问题 - 我通常在美国时间晚上在那里,但总是有一群人乐于闲逛讨论事情。

关于javascript - 文本编辑器的 Redux 架构 : dealing with coupled state,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43600076/

相关文章:

javascript - DataTables 的格式正确的表抛出错误

php - 对于粗体文本,打印速度较慢

javascript - 更新嵌套 Redux reducer 对象的值

javascript - 我的 React 选项卡代码运行良好,但我需要更改 html 结构

javascript - 带有反应导航的 Redux (reactnavigation.org)

javascript - 绝对最简单的服务器端Javascript机制?

javascript - javascript中的换行符

reactjs - 将两个 react 应用程序合并为一个

Redux:通用更新操作

javascript - 在 AngularJS 中延迟实例化 && 单例?