我无法将产品添加到Collection 夹页面,并收到上面的错误.

我正在使用带有上下文挂钩的Reaction-Native来将产品添加到购物车和Collection 页面.问题是减速机挂钩中的所有操作都在工作,除了添加到Collection 夹操作不起作用.

上下文代码

const initialState = {
  products: ProductData, // productData is dummy data where i place all products with details
  cart: [],
  FavoritesList: [],
};
 
const reducer = (state = initialState, action) => {
  switch(action.type) {
    case 'ADD_PRODUCT_TO_FAVORITE':
      const product = action.payload;
      const index = state.products.findIndex((item)=> item?.id === product?.id)
      if (index >= 0) {
        state.splice(index, 1);
      } else {
        state.push(product)
      }

      return [...state,];

    case 'CLEAR':
      return {cart :[]}
           
    default:
      throw new Error(`unknow action.${action.type}`)
  }
}

最喜欢的屏幕代码

const Faviroute = () => {
  const { FavoritesList } = useCart();
  
  return (
    <View
      style={{
        // flex:1,
      }}
    >
      {(FavoritesList.length === 0) ?
        <View> 
          <Text>Get your favourite Coffee easily</Text>
        </View>   
      : <View> 
          {/*Card Container*/}
          <ScrollView>
            <View>
              {FavoritesList.map((item, index) => (         
                <View key={index}>           
                  <Text>{`Product Name: ${item.name}`}</Text>           
                  <Text>{`Size: ${item.size}`}</Text>           
                  <Text>{`Quantity: ${item.qty}`}</Text>           
                  <Text>{`Price: ${item.price}`}</Text>         
                </View>       
              ))}       
            </View>
          </ScrollView>
        </View>
      }
    </View>
  )
}

推荐答案

数组splicepush方法改变了现有的数组引用.创建浅层副本102,覆盖.在这种情况下,如果您想要删除元素,则过滤当前状态,并在添加元素时串联.确保您正在更新和返回正确的状态属性.

示例:

const reducer = (state = initialState, action) => {
  switch(action.type) {
    case 'ADD_PRODUCT_TO_FAVORITE':
      const product = action.payload;

      const index = state.FavoritesList.findIndex(
        (item)=> item?.id === product?.id
      );

      if (index !== -1) {
        return {
          ...state,
          products: state.FavoritesList.filter((_, i) => i !== index),
        };
      } else {
        return {
          ...state,
          products: state.FavoritesList.concat(product),
        };
      }

    case 'CLEAR':
      return { ...state, cart: [], FavoritesList: [] };
           
    default:
      console.log("unhandled action", { action });
      return state; // <-- just return current state
  }
};

建议

不是重复存储产品数据,而是应该存储just产品ID.您可以返回从Products数组派生的完整的Favorites数组,该数组由具有Collection ID的产品进行过滤.

示例:

const initialState = {
  products: ProductData,
  cart: [],
  favorites: {},
};

const reducer = (state = initialState, action) => {
  switch(action.type) {
    case 'ADD_PRODUCT_TO_FAVORITE':
      const product = action.payload;

      return {
        ...state,
        favorites: {
          ...state.favorites,
          [product.id]: !state.favorites[product.id],
        },
      };

    case 'CLEAR':
      return { ...state, cart: [], favorites: {} };
           
    default:
      console.log("unhandled action", { action });
      return state; // <-- just return current state
  }
};
const { favorites, products } = useCart();

const favoritesList = products.filter(product => favorites[product.id]);

Javascript相关问答推荐

如何在NightWatch.js测试中允许浏览器权限?

为什么我达到了时间限制!?LeetCode链接列表循环(已解决,但需要解释!)

获取表格的左滚动位置

我无法在NightWatch.js测试中获取完整的Chrome浏览器控制台日志(log)

togglePopover()不打开但不关闭原生HTML popover'

如何在Javascript中的控制台上以一行形式打印循环的结果

在vercel throws上部署带有gunjs的sveltekit应用无法找到模块./' lib/文本编码'

用JavaScript复制C#CRC 32生成器

单击ImageListItemBar的IconButton后,在Material—UI对话框中显示图像

在JS中拖放:检测文件

制作钢琴模拟器,并且在控制台中不会执行或显示该脚本

变量的值在Reaction组件中的Try-Catch语句之外丢失

我可以使用空手道用户界面来获取网页的当前滚动位置吗?

在forEach循环中获取目标而不是父对象的属性

在浏览器中触发插入事件时检索编码值的能力

将异步回调转换为异步生成器模式

图表4-堆叠线和条形图之间的填充区域

我怎样才能点击一个元素,并获得一个与 puppeteer 师导航页面的URL?

MUI-TABLE:MUI表组件中交替行的不同 colored颜色 不起作用

打字脚本中的函数包装键入