React(10)

news/2025/2/26 9:30:52

项目实践--创建项目

在store的modules中创建相关的子仓库暴露到仓库index文件中

导入creatSlice和axios

创建仓库 和数据的异步修改方法

// 编写store
// 导入createSlice和axios
import { createSlice } from "@reduxjs/toolkit";
import axios from "axios";
// 创建slice
const foodsStore = createSlice({
  name: "foods",
  initialState: {
    foodsList: [],
  },
  //修改foods的数据 需要配合异步请求函数
  reducers: {
    setFoodsList(state, action) {
      state.foodsList = action.payload;
    },
  },
});

编写异步请求函数

// 导出actions和reducer
const { setFoodsList } = foodsStore.actions;
const reducer = foodsStore.reducer;

// 异步获取
const fetchFoodsList = () => {
  return async (dispatch) => {
    const res = await axios.get("http://localhost:3004/takeaway");
    const data = res.data;
    dispatch(setFoodsList(data));
  };
};

这存在一个后端接口返回值count 不准确的情况  使用双重foreach 将count变成1初始化

// 异步获取
const fetchFoodsList = () => {
  return async (dispatch) => {
    const res = await axios.get("http://localhost:3004/takeaway");
    const data = res.data;

    //将每一个子项里的foods里的每一项的的count都修改为1
    data.forEach((item) => {
      item.foods.forEach((food) => {
        food.count = 1;
      });
    });

    console.log(data);
    dispatch(setFoodsList(data));
  };
};

导出

// 导出fetchFoodsList
export { fetchFoodsList };
export default reducer;

store的index注册使用

// 导入 configureStore 和 foodsReducer
// 使用 configureStore 创建 store
import { configureStore } from '@reduxjs/toolkit';
import foodsReducer from './modules/takeaway';

const store= configureStore({
  reducer: {
    foods: foodsReducer,
  },
});
export default store;

在App.js中调用仓库方法映射数据

// 导入useDispatch和useEffect和fetchFoodsList
import { useDispatch } from "react-redux";
import { useEffect } from "react";
import { fetchFoodsList } from "./store/modules/takeaway";

在App函数中调用

 // 触发异步请求
  // 使用useDispatch获取dispatch
  const dispatch = useDispatch();
  // 使用useEffect触发异步请求
  useEffect(() => {
    dispatch(fetchFoodsList());
  },[dispatch]);

使用仓库数据进行渲染

渲染数据 使用useSelector进行渲染

  const {foodsList}=useSelector((state)=>state.foods);

MENU菜单的渲染和点击出发css事件

1、仓库中新建一个控制点击事件的activeIndex变量

const foodsStore = createSlice({
  name: "foods",
  initialState: {
    foodsList: [],
    activeIndex:0
  },
  //修改foods的数据 需要配合异步请求函数
  reducers: {
    setFoodsList(state, action) {
      state.foodsList = action.payload;
    },
    setActiveIndex(state,action){
      state.activeIndex=action.payload;
    }
  },
});

导出相关函数方法

import classNames from 'classnames'
import './index.scss'
import { useDispatch, useSelector } from 'react-redux';
import { setActiveIndex } from '../../store/modules/takeaway';

const Menu = () => {
  const { activeIndex,foodsList } = useSelector(state => state.foods);
  const menus = foodsList.map(item => ({ tag: item.tag, name: item.name }))
  const dispatch=useDispatch();

  return (
    <nav className="list-menu">
      {/* 添加active类名会变成激活状态 */}
      {menus.map((item, index) => {
        return (
          <div
          onClick={()=>dispatch(setActiveIndex(index))}
            key={item.tag}
            className={classNames(
              'list-menu-item',
              activeIndex===index && 'active'
            )}
          >
            {item.name}
          </div>
        )
      })}
    </nav>
  )
}

export default Menu

使用activeIndex和index匹配方法进行css样式控制

并且使用这个值控制菜单列的显示(记得导入activeIndex)

  {/* 外卖商品列表 */}
              {foodsList.map((item,index) => {
                return (
                  activeIndex===index &&  <FoodsCategory
                    key={item.tag}
                    // 列表标题
                    name={item.name}
                    // 列表商品
                    foods={item.foods}
                  />
                );
              })}

添加购物车

点击加号 一个list数组进行添加  如果是没有相关类目的 就进行push 如果有 就进行+1处理

首先添加一个cartList[]  设置相关方法

 addCart(state, action) {
      // 判断是添加过过类目数据,如果添加过就进行add  没有就进行push
      const item = state.cartList.find((item) => item.id === action.payload.id);
      if (item) {
        item.count++;
      } else {
        state.cartList.push(action.payload);
      }
    },

导出相关字段与方法

在加法按钮中添加相关方法

 <div className="goods-count">
            <span
              className="plus"
              onClick={() =>
                dispatch(
                  addCart({
                    id,
                    picture,
                    name,
                    unit,
                    description,
                    food_tag_list,
                    month_saled,
                    like_ratio_desc,
                    price,
                    tag,
                    count,
                  })
                )
              }
            >
              +
            </span>
          </div>


http://www.niftyadmin.cn/n/5868477.html

相关文章

【10】RUST的迭代器与闭包

文章目录 闭包(Closures)定义捕获方式:迭代器(Iterator)核心方法:创建方式:适配器(Adapter)常见适配器及示例消费方法(Consumer)所有权与引用处理性能与惰性求值闭包(Closures) 类比C++里的lambda表达式 闭包是能够捕获其所在环境变量的匿名函数,支持灵活的类型推…

使用CSS3DRenderer/CSS2DRenderer给模型上面添加html标签

先放一下预览图 主要使用css2dRender和css3dRender&#xff0c;添加图片和标签。 思路&#xff1a;使用css3dRender添加一个图片&#xff0c;然后获取的位置坐标&#xff0c;使用css3dRender添加一个文字标签&#xff0c;也设置这个位置坐标&#xff0c;此外z轴设置一个高度&a…

lowagie(itext)老版本手绘PDF,包含页码、水印、图片、复选框、复杂行列合并等。

入口类&#xff1a;exportPdf ​ package xcsy.qms.webapi.service;import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.alibaba.nacos.common.utils.StringUtils; import com.ibm.icu.text.RuleBasedNumberFormat; import com.lowa…

全域旅游景区导览系统:赋能智慧旅游生态,破解行业核心难题

全域旅游景区导览系统&#xff1a;赋能智慧旅游生态&#xff0c;破解行业核心难题 ——整合旅游商城、非遗文化与全域服务的一站式解决方案 一、行业痛点&#xff1a;传统旅游服务模式的局限性 随着旅游业从单一景区游览向“全域旅游”转型&#xff0c;传统服务模式暴露出诸多…

前沿科技:改变未来生活的新趋势

人工智能在物流配送中的应用越来越广泛。它能有效优化配送路线&#xff0c;提高配送效率。很多物流公司已经开始使用这项技术&#xff0c;取得了显著成效。 首先&#xff0c;人工智能可以分析大量数据。它能获取天气、交通、货物信息等多个数据源。这些信息可以帮助系统快速制…

kafka数据拉取和发送

文章目录 一、原生 KafkaConsumer1、pom文件引入kafka2、拉取数据3、发送数据二、在spring boot中使用@KafkaListener1、添加依赖2、application.yml3、消息拉取:consumer4、自定义ListenerContainerFactory5、消息发送:producer6、kafka通过clientId鉴权时的鉴权失败问题一、…

【Python爬虫(69)】解锁游戏数据宝藏:Python爬虫实战攻略

【Python爬虫】专栏简介&#xff1a;本专栏是 Python 爬虫领域的集大成之作&#xff0c;共 100 章节。从 Python 基础语法、爬虫入门知识讲起&#xff0c;深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑&#xff0c;覆盖网页、图片、音频等各类数据爬取&#xff…

01-03基于vs2022的c语言笔记——软件安装,写程序前的准备,初识c语言

目录 前言 1.c语言编程环境的安装 安装vs2022 2.写程序前的准备 ​ 3.初识c语言 3-1第一个程序Hello World 3-2注释的使用 3-3变量 ​3-4-1 字面常量 3-4-2 用const修饰常量 3-4-3用#define来修饰常量 3-5关键字 3-6标识符 前言 本套笔记是基于英雄哪里出来c语言…