【问题标题】:Are action names part of the public API in redux-form?动作名称是 redux 形式的公共 API 的一部分吗?
【发布时间】:2018-11-10 16:33:50
【问题描述】:

首先,我不完全确定我在 React/Redux 应用程序中安装的大多数第三方包的操作中的 @@ 前缀是什么意思——如果它们的意思是“私有”,那么答案我的问题很明显。我在 Chrome 的 Redux devtools 扩展中看到了它们。

如果这只是一个范围约定@@<package>/<action>,那么我有一个关于redux-form 包中的操作的具体问题。操作显然是not documented,所以我不确定我是否可以在我的减速器中安全地使用它们而不用担心破坏性更改。

如果我的方法完全错误(仍在找出模式)的更多上下文:我想删除注册表并在成功完成后显示成功消息。 redux-form 调度 @@redux-form/SET_SUBMIT_SUCCEEDED 类型的操作,meta.form 告诉我这是我命名为 register 的表单。所以我会在我的 RegisterPage 减速器中使用它来设置布尔值 isSuccess 并使用它来更改视图。

【问题讨论】:

    标签: reactjs redux redux-form


    【解决方案1】:

    如果它们没有明确记录,我会认为它们是私有的,而不是直接使用它们。尽管没有在任何地方正式声明,@@ 前缀通常表示不应由其他减速器代码处理的私有操作。我认为它起源于@@redux/INIT_{random string} 动作(关于命名的讨论可以在这个github thread 中找到):

    在新的文档 (#140) 中,我们应该澄清任何以动作为前缀的 @@ 不意味着要处理。例如,你永远不应该尝试 处理@@INIT。

    redux code itself 中也明确声明了隐私:

    /**
     * These are private action types reserved by Redux.
     * For any unknown actions, you must return the current state.
     * If the current state is undefined, you must return the initial state.
     * Do not reference these action types directly in your code.
     */
    

    针对您的具体问题:您可以向 HOC 提供 onSubmitSuccess function 并调度您自己的操作来更新您自己的 reducer,或者您可以直接依赖 redux 表单状态并通过 hasSubmitSucceeded selector 获取此布尔标志。我个人认为第二种选择更好,因为它不会在您的商店中引入冗余状态 - redux 表单已经存储了表单是否成功提交的信息,您自己在另一个子减速器中这样做可能会导致两者布尔值无意中发散。

    【讨论】:

    • 感谢您的回答。 “并调度你自己的动作来更新你自己的减速器”——我想我应该避免这种情况,以便利用一个动作在整个商店中传播的事实(而不是将一个动作与商店的特定部分联系起来) .在我看来,触发一个动作是因为触发了另一个动作正是 Redux 试图解决的问题(一堆触发其他事件的事件),但似乎第三方 reducer 与此作斗争。
    • @LazarLjubenović 严格来说,您不是因为另一个动作而触发一个动作,而是为同一个用户事件触发两个动作。但是你当然是对的,这也是一种冗余。第二个选项(简单地使用 redux-form 通过已经准备好的选择器 hasSubmitSucceeded 提供的值)绝对是可取的。
    • redux FAQ 并没有严格禁止发送multiple actions in a row。尽量避免,但有合法的情况
    • 很好的建议。谢谢!
    猜你喜欢
    • 2021-11-04
    • 2021-04-26
    • 1970-01-01
    • 2011-02-15
    • 2017-03-23
    • 1970-01-01
    • 1970-01-01
    • 2017-04-09
    • 2011-12-16
    相关资源
    最近更新 更多