我认为我可能在概念上缺少一些有关React和Reflux的工作方式的信息。

如果设置了对象(“项目”)的状态(渲染到屏幕上(具有其现有属性)),那么如何使用相同的状态(并存储)来创建新项目?

这是我项目 View 中的一些代码:

componentWillMount: function () {

    // We need to get the project based on projectID.
    var projectID = this.props.params.projectID;

    if (projectID) {
        ProjectActions.getProject(projectID);
    }
},

这是我的项目商店中的一些代码:
data: {},

listenables: ProjectActions,

getInitialState: function() {
    return this.data;
},

onGetProject: function (projectID) {

    // Get the project based on projectID.
    $.ajax({
        type: 'GET',
        url: '/api/projects/getProject/' + projectID
    }).done(function(response){
        ProjectStore.getProjectSuccessful(response);
    }).error(function(error){
        alert('GET projects failed.');
    });

},

getProjectSuccessful: function(response) {
    for (var prop in response) {
        if (response.hasOwnProperty(prop)) {
            this.data[prop] = response[prop];
        }
    }
    this.trigger(this.data);
},

然后,说我单击“新项目”,我使用以下代码:
mixins: [Reflux.connect(ProjectStore), Router.Navigation],

getInitialState: function () {
    return {
        // Project properties:
        format: '',
        title: '',
        productionCompany: ''

    };
},

我发现,如果我从商店中删除“getInitialState”,那么在创建新项目时就没有问题。但是,一旦这样做,我将无法再编辑现有项目,因为状态没有任何附加条件(我可以使用prop进行查看,但这还不够。)

如果保留“getInitialState”,则会出现错误:
Uncaught Error: Invariant Violation: mergeIntoWithNoDuplicateKeys(): Tried to merge two objects with the same key: `format`. This conflict may be due to a mixin; in particular, this may be caused by two getInitialState() or getDefaultProps() methods returning objects with clashing keys.

我需要仅具有创建操作的“NewProjectStore”吗?我认为商店可以处理创建,获取,更新等操作。

我想念什么吗?

最佳答案

当您使用Reflux.connect时,它会将商店中的getInitialState添加到您的组件中。这就是为什么您会收到有关重复值的错误的原因。您的答案是使用Reflux.listenTo或从组件中删除getInitialState

步骤1:在商店中修复getInitialState()

只要您可以在任何给定时间只拥有一个商店,就可以拥有一个商店来保存您的编辑项目或新项目没有什么错。根据您的情况,建议您保留Reflux.connect并删除组件的getInitialState。一个问题是商店中的getInitialState没有组件中声明的默认属性。

步骤2:修复流量

这没错,因为它实际上可以工作,但是,它没有遵循通量准则。大多数人同意异步 Action 属于该 Action 。商店仅存储数据,通常还提供辅助功能,以不同方式获取所述数据。试试这个:

更新代码:

var ProjectActions = Reflux.createActions({
    getProject: {asyncResult: true}
});
ProjectActions.getProject.listen(function (projectID) {
    // Get the project based on projectID.
    $.ajax({
        type: 'GET',
        url: '/api/projects/getProject/' + projectID
    }).done(function(response){
        ProjectActions.getProject.completed(response);
    }).error(function(error){
        alert('GET projects failed.');
        ProjectActions.getProject.failed(error);
    });
});

var ProjectStore = Reflux.createStore({
    init: function () {
        // default project properties:
        this.data = {
            format: '',
            title: '',
            productionCompany: ''
        };
    },

    listenables: ProjectActions,

    getInitialState: function() {
        return this.data;
    },

    onGetProjectCompleted: function(response) {
        for (var prop in response) {
            if (response.hasOwnProperty(prop)) {
                this.data[prop] = response[prop];
            }
        }
        this.trigger(this.data);
    }
});

关于javascript - 如何清除React.js中的状态?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32406787/

10-09 21:44