redux-form一旦组件卸载就会破坏我的状态,是什么给出的?

时间:2016-02-17 08:41:02

标签: javascript redux redux-form

我没有传递任何特殊的配置设置,也没有设置/或调用Destroy ...但我的状态正在被清理......无论如何要防止这种情况?我需要状态,因为我需要那些数据而不是我的应用程序。

prev state: I see it in there... via redux-logger
action: redux-form/Destroy
next state: it's gone.

3 个答案:

答案 0 :(得分:58)

在表单卸载时,表单的状态子树 被销毁。这是默认和预期的行为。

v6.2.1开始,有一个表单配置属性destroyOnUnmount,它明确启用/禁用特定表单上的状态清除行为(docs here

import { reduxForm } from 'redux-form';

reduxForm({
  form: 'example',
  destroyOnUnmount: false
})(...)

如果您希望保留一个表单,如果用户将其放弃一半,导航离开,然后稍后返回,则此功能非常有用。

答案 1 :(得分:2)

您可能正在将redux-forms的状态合并到您的状态中,您应该将其置于单独的密钥下。 Destroy动作返回undefined,如果redux-forms reducer只管理它是商店的一部分,这是没关系的。

确保您遵循本教程中的第1步,特别是form: formReducer部分: https://redux-form.com/7.2.3/docs/gettingstarted.md/#step-1-of-4-form-reducer

答案 2 :(得分:-1)

我最近亲自使用Redux Form遇到了同样的问题

enter image description here

enter image description here

在调度动作并通过reducer后,redux-form调度DESTROY动作。 Brennan Cheung评论帮助我意识到我在减速器中返回/修改的状态缺少被发送回商店的信息。修复此问题后,redux表单不再自动调度destroy操作。

例如: 最初,我回来了:

    [
      {
        "id": "dd8684f0-8a8a-11e7-97ac-8350cad5200c",
        "timestamp": 1503771468479,
        "body": "comment2",
        "author": "author2",
        "parentId": "ee6a6c5c-1821-4280-80b7-90fa97137137",
        "voteScore": 1,
        "deleted": false,
        "parentDeleted": false
      }
    ]

当我真的想要归还

    {
      "ee6a6c5c-1821-4280-80b7-90fa97137137": {
        "id": "ee6a6c5c-1821-4280-80b7-90fa97137137",
        "timestamp": 1502253747021,
        "title": "this is a title",
        "body": "this is another body",
        "author": "author2",
        "category": "category1",
        "voteScore": 2,
        "deleted": false,
        "comments": [
          {
            "id": "dd8684f0-8a8a-11e7-97ac-8350cad5200c",
            "timestamp": 1503771468479,
            "body": "comment2",
            "author": "author2",
            "parentId": "ee6a6c5c-1821-4280-80b7-90fa97137137",
            "voteScore": 1,
            "deleted": false,
            "parentDeleted": false
          }
        ]
      }
    }

所以一定要检查你回到商店的状态。希望这有帮助!