arrays - React Redux,如何正确处理数组中对象的变化?

标签 arrays reactjs redux

我有一个 React Redux 应用程序,它从我的服务器获取数据并显示该数据。

我正在父容器中显示数据,如下所示:

render(){
    var dataList = this.props.data.map( (data)=> <CustomComponent key={data.id}> data.name </CustomComponent>)

    return (
        <div>
           {dataList}
        </div>
    )
}

当我与应用程序交互时,有时,我需要更新特定的自定义组件。

由于每个 CustomComponent 都有一个 id,我将其发送到我的服务器,其中包含一些有关用户选择的数据。 (即它是一个表单)

服务器使用该 ID 的更新对象进行响应。

在我的 redux 模块中,我迭代当前的 data 状态并找到 id 为

的对象
export function receiveNewData(id){
    return (dispatch, getState) => {
        const currentData = getState().data
        for (var i=0; i < currentData.length; i++){
            if (currentData[i] === id) {
                const updatedDataObject = Object.assign({},currentData[i], {newParam:"blahBlah"})
                allUpdatedData = [
                    ...currentData.slice(0,i),
                    updatedDataObject,
                    ...currentData.slice(i+1)
                ]
                dispatch(updateData(allUpdatedData))
                break
            }
        }
    }
}


const updateData = createAction("UPDATE_DATA")

createAction 来自redux-actions它基本上创建了一个 {type, Payload} 的对象。 (它标准化了 Action 创建者)

无论如何,从这个示例中您可以看到,每次发生更改时,我都会不断迭代整个数组以识别哪个对象正在更改。

考虑到我已经有了该对象的 id,这对我来说似乎效率低下。

我想知道 React/Redux 是否有更好的方法来处理这个问题?有什么建议么?

最佳答案

你的 Action 创建者做得太多了。它正在承担属于 reducer 的工作。您的 Action 创建者所需要做的就是宣布要更改的内容,而不是如何更改。例如

export function updateData(id, data) {
    return {
        type: 'UPDATE_DATA',
        id: id,
        data: data
    };
}

现在将所有逻辑移至 reducer 中。例如

case 'UPDATE_DATA':
    const index = state.items.findIndex((item) => item.id === action.id);
    return Object.assign({}, state, {
        items: [
            ...state.items.slice(0, index),
            Object.assign({}, state.items[index], action.data),
            ...state.items.slice(index + 1)
        ]
    });

如果您担心 Array#findIndex 的 O(n) 调用,请考虑使用 normalizr 重新索引您的数据。 (或类似的东西)。但是,仅当您遇到性能问题时才执行此操作;对于小数据集来说没有必要。

关于arrays - React Redux,如何正确处理数组中对象的变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34865172/

相关文章:

java - 如何比较字符串数组并计算相似单词

c - fgets 有更多的字符,它应该有

reactjs - create-react-app 无法在 Windows 10 中创建新的 React 应用程序

javascript - 如何使用 React 组件的 id 触发点击事件?

javascript - 如何使用 reactjs 添加外部 javascript 文件

unit-testing - 我应该如何在 Redux 中对 mapDispatchToProps 进行单元测试?

javascript - 连接 redux 到 react 和分派(dispatch)操作时遇到问题

javascript - 将数据推送到具有对值的数组中

c# - 如何在 C# 中使用反射调用将字符串数组作为参数的方法

reactjs - 在 react 中使用 <Link> 将对象数组传递给另一个组件