在Redux中清除阵列状态

nwnhqdif  于 2022-11-12  发布在  其他
关注(0)|答案(4)|浏览(163)

如何在Redux中清除一个数组状态?我有一个空数组的初始状态,并且正在添加内容。我想有一个只清除它的操作,我尝试了下面的方法,但是它给我一个关于“action.payload”的“Unexpected token”错误,我给了CLEAR_THINGS操作:

export default (state=[], action) => {
switch (action.type) {
    case "RECEIVE_THING":
        return [
            ...state,
            action.payload
        ];
    case "CLEAR_THINGS":
        return {
            ...state,
            action.payload // payload here is []...
        };
    default:
        return state;
}}

如果我只使用[]而不是通过action.payload,它也会抛出错误。

o4hqfura

o4hqfura1#

export default (state=[], action) => {
switch (action.type) {
    case "RECEIVE_THING":
        return [
            ...state,
            action.payload
        ];
    case "CLEAR_THINGS":
        return [];
    default:
        return state;
}}

RECEIVE_THING操作使用对象扩展表示法返回一个状态,该状态是一个数组([]),其中包含先前的状态([...state]),并向该状态添加一个新项([...state, action.payload])。用于此新项的键/属性名只是数组的下一个索引。毕竟,它是一个数组。
CLEAR_THINGS的代码中,您将创建一个对象({}),其中包含旧状态(假设它是['item1']),因此它看起来像{ '0': 'item1' }.接下来,您继续使用对象速记符号来添加更多状态,但这要求您使用单个标识符(一个单词)但你用的是带点的概念(限定标识符)来访问属性。您可能是在指示创建一个名为action.payload的属性,但这是非法的,这就是错误的来源。它在数组的情况下工作的原因是因为在这种情况下只需要一个值,因为键是从数组的索引派生的。
你要做的是总是返回相同类型的对象,在你的例子中,是一个数组。从return {开始,你已经走错了路。

vdgimpew

vdgimpew2#

您只需在“CLEAR_THINGS”处理程序中返回一个空数组:

export default (state=[], action) => {
switch (action.type) {
    case "RECEIVE_THING":
        return [
            ...state,
            action.payload
        ];
    case "CLEAR_THINGS":
        return [];
    default:
        return state;
}}

由于您只想清除不需要引用现有状态的所有内容,因此您只想将新状态设置为空数组。
另一件值得一提的事情是,我可能会把数组嵌套在一个对象中。如果你的reducer在未来变得更复杂,那么很难像你现在这样添加功能,这种方法会让你的应用在需要的时候变得更复杂。当然,你总是可以添加reducer,但是我喜欢用这种方法让我的reducer变得更灵活。看起来像这样:

export default (state = { myArray: [] }, action) => {
switch (action.type) {
    case "RECEIVE_THING":
        return {
            ...state,
            myArray: state.myArray.concat([action.payload]),
        };
    case "CLEAR_THINGS":
        return {
            ...state,
            myArray: [],
        };
    default:
        return state;
}}
dsekswqp

dsekswqp3#

操作的ES6简写

{thing}

传播到

{"thing": thing}

在你的例子中,这会导致一个语法错误,因为键包含一个句点,并且不清楚键应该是什么。

return {
    action: {
        payload: action.payload
    }
}

但这并不能解决眼前的问题:如果你想用这个动作清除数组,你不应该把现有的状态扩展到下一个状态。相反,你应该只返回与你现有状态相同形状的东西,但是语义上有空的意思(在这个例子中,只是一个空数组)。我想你想要的是

case "RECEIVE_THING":
    return [
        ...state,
        action.payload
    ];
case "CLEAR_THINGS":
    return [];
pgccezyw

pgccezyw4#

我最终在另一个stackoverflow线程上找到了答案here
这个问题是因为函数'map'只能用于数组,而不能用于对象。

this.props.filtered.map((pic)

this.props.filtered.filtered.map((pic)

相关问题