代码之家  ›  专栏  ›  技术社区  ›  Blankman

如何在不必通过API重新加载整个json对象的情况下改变我的状态

  •  1
  • Blankman  · 技术社区  · 7 年前

    我将reactjs与redux一起使用,并且在UI上显示类别以及与它们相关联的产品。

    当用户将产品移动到另一个类别时,我不想像现在这样重新加载整个JSON文件,因为JSON实际上非常大。

    如何通过从一个类别的catProducts集合中移除productId并将productId添加到另一个类别的catProducts集合中来更改此JSON文件。

    {
      "shop" : {
    
        "categories": [
          {
            id: 1,
            name: "category1",
            "catProducts" : [
              {
                productId: 123
              }          
            ]
          },
          {
            id: 2,
            name: "category2",
            "catProducts" : [
              {
                productId: 456
              }          
            ]
          },
          {
            id: 3,
            name: "category3",
            "catProducts" : [
              {
                productId: 789
              }          
            ]
          }
        ]
    
      }
    
    }
    

    下面是我的动作和减速机,如你所见,每次移动产品时,我都会用产品重新加载整个类别。 我需要做的只是在进行API调用之后,通过从一个catProducts中删除productId并将其添加到另一个catProducts中来改变我的状态。 我该怎么做?

    行动:

    moveProduct: (data) => {
      return dispatch => {
      var url = '....'; // api to move the product in db
      axios.post(url, reqArgs)
        .then(function(resp) {
          dispatch(Actions.fetchCategoriesAndProducts(data.shopId));
        });
      };
    },
    

    减速机:

    case Constants.FETCH_CATEGORIES_AND_PRODUCTS:
      return {...state, fetching: false, shop: action.data };
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Tholle    7 年前

    假设你有一个索引 fromIndex 代表 categories 将产品从中移出的数组索引, toIndex 代表 类别 要将产品移动到的数组索引,以及 productId 对于要移动的产品,您可以这样做:

    const data = {
      shop: {
        categories: [
          {
            id: 1,
            name: "category1",
            catProducts: [
              {
                productId: 123
              }
            ]
          },
          {
            id: 2,
            name: "category2",
            catProducts: [
              {
                productId: 456
              }
            ]
          },
          {
            id: 3,
            name: "category3",
            catProducts: [
              {
                productId: 789
              }
            ]
          }
        ]
      }
    };
    
    const fromCategoryIndex = 0;
    const toCategoryIndex = 1;
    const productId = 123;
    
    const categories = [...data.shop.categories];
    
    categories[fromCategoryIndex] = {
      ...categories[fromCategoryIndex],
      catProducts: categories[fromCategoryIndex].catProducts.filter(
        product => product.productId !== productId
      )
    };
    
    categories[toCategoryIndex] = {
      ...categories[toCategoryIndex],
      catProducts: [...categories[toCategoryIndex].catProducts, { productId }]
    };
    
    console.log(categories);