defaultState内部的属性应为null还是''

use*_*421 3 reactjs redux

在线大多数教程显示,initialState内部的属性应为”(如果是字符串),例如:

let defaultState = Immutable.fromJS({
    viewData: {
        id: '',
        name: '',
        alist: []
    }
});
Run Code Online (Sandbox Code Playgroud)

但是,如果您习惯于明确说明某个组件使用什么属性,例如:

function mapStateToProps(state) {
    return viewData: state.someReducer.get('data');
}

someContainer.propTypes = {
    data: ImmutablePropTypes.mapContains({
        id: React.PropTypes.string.isRequired,
        name: React.PropTypes.string.isRequired,
        aList: ImmutablePropTypes.list.isRequired
    }),
};
Run Code Online (Sandbox Code Playgroud)

比我将获得“ Failed propType”的唯一方法是是否从reducer中删除了任何属性,并且以isRequired某种方式感到多余,因为它将始终提供一个空字符串,然后将其传递给someContainer子组件。

但是,如果我这样做:

let defaultState = Immutable.fromJS({
    data: {
        id: null,
        name: null,
        aList: null
    }
});
Run Code Online (Sandbox Code Playgroud)

如果减速器不填充状态,那么我将获得失败的原型,这是不是想要的?但是,由于我很少看到其他人将道具设置为null,所以我觉得有充分的理由不这么做。

另外,使用null方法将Maps嵌套在状态中会造成混乱,因为它甚至比viewData应该为null,但是如果不显示它真正会得到什么数据,则会丢失信息:

let defaultState = Immutable.fromJS({
    viewData: { // Shouldnt this be null than as well?
        id: null,
        name: null,
        hierarchies: { // and this
            one: null,
            two: null
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

Chr*_*ris 5

null 是默认状态的一种完全可以接受的形式-它是一个赋值,表示此特定属性没有值。

有一个更大的问题在起作用,它完全取决于您的特定应用程序(只有您可以回答才可以null),但是要回答您的特定问题“还可以”-是的,可以。

我不喜欢使用空字符串作为默认状态,我发现它会误导应用程序。例如,我的消耗组件“理解”一个null值意味着尚未提供一个值,而一个空字符串表示确实已设置了一个值,但是它只是空的(例如,没有中间名的用户-该值是“”)。这使应用程序可以更适当地处理应用程序的当前状态。

顺便说一句-这是一个非常出色的问题,在教程中(如您所提到的)通常不会明确探讨。