Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript reducer中的扩展语法与仅返回来自操作的数组有什么不同?_Javascript_Reactjs_Redux - Fatal编程技术网

Javascript reducer中的扩展语法与仅返回来自操作的数组有什么不同?

Javascript reducer中的扩展语法与仅返回来自操作的数组有什么不同?,javascript,reactjs,redux,Javascript,Reactjs,Redux,我不能理解这一部分,我知道如果我有这样一个数组: const x = [1, 2, 3, 4] const y = [...x]; 应该是这样的: const x = [1, 2, 3, 4] const y = [...x]; 这在redux中如何不同: 我有一个类似这样的操作,它获取一个产品和cartProducts(前一个状态),并检查cartProducts数组中是否存在该产品(通过比较ID),如果该产品不存在,则将其推送到购物车,如果存在,则增加找到的产品的数量: 这是我的行动

我不能理解这一部分,我知道如果我有这样一个数组:

const x = [1, 2, 3, 4]
const y = [...x];
应该是这样的:

const x = [1, 2, 3, 4]
const y = [...x];
这在redux中如何不同:

我有一个类似这样的操作,它获取一个产品和cartProducts(前一个状态),并检查cartProducts数组中是否存在该产品(通过比较ID),如果该产品不存在,则将其推送到购物车,如果存在,则增加找到的产品的数量:

这是我的行动

export const addToCart = (product, cartProducts) => {
    if (!product.quantity) {
        product.quantity = 1;
    }
    const index = cartProducts.findIndex(p => p.id === product.id);
    if (index < 0) {
        cartProducts.push(product);
    }
    else {
        cartProducts[index] = {
            ...cartProducts[index],
            quantity: cartProducts[index].quantity + 1
        }
    }
    return {
        type: ADD_TO_CART,
        payload: cartProducts
    }
}

不起作用的减速器(cartProducts无法正常渲染,不知道原因??):


spread syntax如何改变这里的一切,在这两种情况下都应返回具有相同产品的相同阵列???

因为spread syntax正在创建一个新阵列,以便订阅者知道它已改变。返回修改后的原始数组,订阅者不会知道它已更改

数组(和对象)通过它们的引用传递,因此,如果返回对同一数组的引用,不管插入或删除了什么,javascript都会认为它是同一个数组。这不适用于reducer,因为根据设计,应用商店的订阅者只会对更改做出反应,因此他们只会在数组实际更改时做出反应,唯一的方法是返回不同的(新的)数组


这就是为什么通常建议避免在这种存储框架(或一般情况下)中改变数组或对象,并将对象和数组视为不可变的。

因为扩展语法正在创建一个新数组,以便订阅者知道它已更改。返回修改后的原始阵列,订阅者不会知道它发生了更改。请您添加答案并进行详细解释,好吗?我一直知道,一旦状态发生更改,将进行重新渲染,但这是第一次了解更改的真实性质,谢谢!!