【问题标题】:Action creator data is not syncing correctly动作创建者数据未正确同步
【发布时间】:2019-07-22 08:31:04
【问题描述】:

我有一个使用 redux thunk 的动作创建者,但发生了一些奇怪的事情

获取此代码:

export const updateShowing = name => {
    return (dispatch, getState) => {
        console.log(getState().codeToRender.contents, 'first consolelog')
        const paramFound = getState().codeToRender.contents.find(param => param.name === name)
        console.log(paramFound, 'second consolelog')
        dispatch({ type: UPDATE_SHOWING, name })
        dispatch(push(`?${updateParamHelper(getState)}`))
    }
}

当我查看第一个 console.log 时,我正在使用我正在寻找的密钥获取对象 render: true

但是第二个console.log(我所做的只是在同一个数组上查找),我得到render: false 的意思是在同一时间点由于某种原因我看到了2个不同的值,即使我我正在访问相同的getState

知道为什么会这样吗?

【问题讨论】:

    标签: javascript reactjs asynchronous redux


    【解决方案1】:

    UPDATE_SHOWING 或其他操作处理程序必须处于变异状态。您的 console.logs 看起来不同,因为一个可能在记录时按原样显示元素,而另一个在展开控制台时按原样显示。

    尝试在控制台中运行以下命令:

    const arr = [{name:'Ben'}];
    console.log('expand and name is Jerry',arr);
    console.log('as is when logged:',arr[0]);
    arr[0].name='Jerry';
    

    输出示例:

    expand and name is Jerry  ▼[{…}]
                                ▶ 0:{name: "Jerry"}
                                  length: 1
                                ▶ __proto__: Array(0)
    as is when logged: {name: "Ben"}
    

    您可以将 console.logs 更改为:

    console.log(JSON.stringify(getState().codeToRender.contents,undefined,2), 'first consolelog');
    

    您可能会发现第一个和第二个控制台日志会记录相同的日志。

    【讨论】:

    • 这就是浏览器中控制台日志的全部内容不是准确的表示吗?
    • @RedBaron 如果您 JSON.stringify 您记录的值,您肯定会知道。我看不出它是怎么回事,你有 2 个 console.logs 一个接一个,没有异步代码;但是一个嵌套值与另一个不同。发生的唯一方法是使用我在答案中提供的代码,突变必须发生在动作处理程序中:UPDATE_SHOWING 或推送函数返回的任何动作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-03
    • 2019-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    相关资源
    最近更新 更多