繁体   English   中英

Redux Reducer无法正确更改商店状态

[英]Redux reducer not changing the store's state properly

我正在构建一个用于收养宠物的小型应用程序,该应用程序具有在收养列表中添加和删除宠物的表格。

API

[
   {category: 'dog', pets: [{breed: 'chihuahua', name: 'bar' }, ....]},
   {category: 'cat', pets: [{breed: 'tobby', name: 'foo'}, ....]},
   ....
]

创建表格的功能

export default function petFieldset({
 petGroups, addPet, deletePet, deleteCategory,
 nameInputChange, breedInputChange, categoryInputChange
}) {

const categoryField = Object.keys(petGroups).map((keys) => (
    <Fieldset
        title={'Pet Category'}
        button={<Delete onClick={deleteCategory.bind(this, { keys })} />}
        key={keys}
    >
        <CategoryComponent
            petGroup={petGroups[keys]}
            deletePet={deletePet}
            categoryKey={keys}
            nameInputChange={nameInputChange}
            breedInputChange={breedInputChange}
            categoryInputChange={categoryInputChange}
        />
        <br />
        <AddPet onClick={addPet.bind(this, { keys })} />
    </Fieldset>
));

return (<div>{ categoryField }</div>);
}

我的减速器addPet看起来像这样

[ADD_PET]: (state, { payload }) => {
    state[payload.keys].pets.push({ breed: '', name '' });
    return { ...state };
},

AddPet组件是一个按钮,用于分派操作ADD_PET ,该操作创建一个新的表单字段,其输入namebreed在表单的底部。 这是通过将空的{ breed: '', name: '' }推入所选类别的pets数组来完成的。

问题是当我尝试多次添加宠物时。

第一次添加宠物时,它将创建一个带有breedname且带有空字段的空表格。 现在,如果添加了新宠物,则表单将包含与以前添加的字段相同的namebreed字段。

有害行为的示例:

1)从占位符的API加载表单中的数据。 [预期]

2)用户单击AddPet按钮,该按钮将创建一个新的空表单,其namebreed不带占位符。 [预期]

3)用户在新创建的表单上写下宠物名称和品种,然后单击AddPet组件。 [预期]

4)具有与步骤3)中相同namebreed的新表格。 [意外]

state[payload.keys].faqs.push({ breed: '', name '' })state[payload.keys].faqs.push({ breed: '', name '' })发生了一些事情。

推送不是一成不变的操作。 您正在更改数组本身。 因此它具有相同的状态和先前的状态。

您必须创建先前阵列的副本,然后将新项推入此新副本。

例如:

[ADD_PET]: (state, { payload }) => {
    let pets = [...state[payload.keys].pets];
    pets.push({ breed: '', name '' });
    return { ...state, payload.keys: pets };
},

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM