改变实体商店中的数组会改变整个数组

问题描述 投票:0回答:1

我只是想确定一下。 我在solidjs中有这家商店:

type StoreState = {
  selectionByCondition: Array<{
    condition: BogoCondition;
    cardState: Array<{
      handle: string;
      variant: string;
    }>;
  }>;
  selectionByReward: Array<{
    reward: BogoReward;
    cardState: Array<{
      handle: string;
      variant: string;
      checked: boolean;
    }>;
  }>;
};

我是这样设置的

    setState(
      "selectionByReward",
      widgetData()?.discountData.rewards.map((reward) => {
        console.log({ sortedConditions: sortedConditions() });
        if (reward.condition === "SAME_SELECTION") {
          if ("match" in reward) {
            return {
              cardState: state.selectionByCondition[0].cardState.map((v) => ({
                ...v,
                checked: true,
              })),
              reward,
            };
          } else if (
            "combination" in reward &&
            reward.combination === "DIFFERENT_PRODUCTS"
          ) {
            return {
              cardState: getCondition(0)
                .products.slice(0, reward.quantity)
                .map((p) => ({
                  handle: p.handle,
                  variant: p.variants[0],
                  checked: true,
                })),
              reward,
            };
          } else {
            return {
              cardState: new Array(reward.quantity).fill({
                handle: getCondition(0).products[0].handle,
                variant: getCondition(0).products[0].variants[0],
                checked: true,
              }),
              reward,
            };
          }
        } else {
          if (
            "combination" in reward &&
            reward.combination === "DIFFERENT_PRODUCTS"
          ) {
            return {
              cardState: reward.products.slice(0, reward.quantity).map((p) => ({
                handle: p.handle,
                variant: p.variants[0],
                checked: true,
              })),
              reward,
            };
          } else {
            return {
              cardState: new Array(reward.quantity).map(() => ({
                handle: reward.products[0].handle,
                variant: reward.products[0].variants[0],
                checked: true,
              })),
              reward,
            };
          }
        }
      }) || []
    );

我试图只更新cardState的一个“checked”属性,但我不知道为什么它会改变数组中所有“checked”的“checked”值,即使文档中说“product应该适用”局部突变...我做错了什么?我无法改变整个数组,因为当 cardState.handle 更改时我会触发获取,并且我不想在检查更改时触发重新获取,因为它没有意义。

    setState(
      "selectionByReward",
      rewardIdx,
      "cardState",
      produce((cardState) => {
        cardState[cardIndex].checked = !cardState[cardIndex].checked;
      })
    );

arrays store mutation solid-js
1个回答
0
投票

据我所知,product 用于使用突变构建下一个状态,同时保持原始状态完整,直到提交更改。这意味着一旦声明提交,您将获得一个新对象。但这并不意味着它会随意改变一个对象。

我试图只更新cardState的一个“checked”属性,但我不知道为什么它会改变数组中所有“checked”的“checked”值。

您可能正在更改代码中的多个项目:https://www.solidjs.com/docs/latest#updating-stores

或者,您想要更新数组项,可以使用其索引或范围。

© www.soinside.com 2019 - 2024. All rights reserved.