当前位置: 首页 > news >正文

网站开发付款方式免费网站推广优化

网站开发付款方式,免费网站推广优化,深圳罗湖区网站开发公司,海洋公司做网站1.案例展示 2.环境搭建 克隆项目到本地(内置了基础静态组件和模版) git clone http://git.itcast.cn/heimaqianduan/redux-meituan.git 安装所有依赖 npm i 启动mock服务(内置了json-server) npm run serve 启动前端服务 npm…

1.案例展示

![](https://img-blog.csdnimg.cn/direct/b7a9604e5d274504ad630427a996aa8b.png
在这里插入图片描述

2.环境搭建

  1. 克隆项目到本地(内置了基础静态组件和模版)
git clone http://git.itcast.cn/heimaqianduan/redux-meituan.git 
  1. 安装所有依赖
npm i 
  1. 启动mock服务(内置了json-server)
npm run serve 
  1. 启动前端服务
npm run start 

3.分类和商品列表渲染

在这里插入图片描述
1.store modules 下 takeaway.js文件

// 编写store
import { createSlice } from "@reduxjs/toolkit"
import axios from "axios"const foodsStore = createSlice({name: 'foods',initialState: {// 商品列表foodsList: [],a},reducers: {// 更改商品列表setFoodsList (state, action) {state.foodsList = action.payload}}
})// 异步获取部分
const { setFoodsList} = foodsStore.actions
const fetchFoodsList = () => {return async (dispatch) => {// 编写异步逻辑const res = await axios.get('http://localhost:3004/takeaway')// 调用dispatch函数提交actiondispatch(setFoodsList(res.data))}
}export { fetchFoodsList }const reducer = foodsStore.reducer
export default reducer

2.store下index.js文件

import foodsReducer from './modules/takeaway'
import { configureStore } from '@reduxjs/toolkit'
const store = configureStore({reducer: {foods: foodsReducer}
})
export default store

3.app.js

import { useDispatch, useSelector } from 'react-redux'
import { fetchFoodsList } from './store/modules/takeaway'
import { useEffect } from 'react'
// 触发action执行// 1. useDispatch -> dispatch 2. actionCreater导入进来 3.useEffectconst dispatch = useDispatch()useEffect(() => {dispatch(fetchFoodsList())}, [dispatch])// 获取foodsList渲染数据列表// 1. useSelectorconst { foodsList } = useSelector(state => state.foods){/* 外卖商品列表 */}{foodsList.map((item, index) => {return (<FoodsCategorykey={item.tag}// 列表标题name={item.name}// 列表商品foods={item.foods}/>)})}

4.menu.js

import { useDispatch,useSelector } from 'react-redux'
const dispatch = useDispatch()
const {foodsList} = useSelector(state=>state.foods) 

5.index.js

// 注入store
import { Provider } from 'react-redux'
import store from './store'
const root = createRoot(document.getElementById('root'))
root.render(<Provider store={store}><App /></Provider>
)

4.点击分类激活实现

在这里插入图片描述
1.store modules下 takeaway.js文件


// 编写store
import { createSlice } from "@reduxjs/toolkit"
import axios from "axios"
const foodsStore = createSlice({name: 'foods',initialState: {// 商品列表foodsList: [],//激活indexactiveIndex:0,},reducers: {// 更改商品列表setFoodsList (state, action) {state.foodsList = action.payload},//更改activeIndexchangeActiveIndex(state,action){state.activeIndex = action.payload}}
})// 异步获取部分
const { setFoodsList,changeActiveIndex} = foodsStore.actions

2.menu.js

import classNames from 'classnames'
import './index.scss'import { useDispatch,useSelector } from 'react-redux'
import { changeActiveIndex} from '../../store/modules/takeaway'
const Menu = () => {const dispatch = useDispatch()const {foodsList,activeIndex} = useSelector(state=>state.foods) const menus = foodsList.map(item => ({ tag: item.tag, name: item.name }))return (<nav className="list-menu">{/* 添加active类名会变成激活状态 */}{menus.map((item, index) => {return (<divonClick={() => dispatch(changeActiveIndex(index))}key={item.tag}className={classNames('list-menu-item',activeIndex === index && 'active')}>{item.name}</div>)})}</nav>)
}export default Menu

3.app.js

const { foodsList , activeIndex} = useSelector(state => state.foods)
<div className="goods-list">{/* 外卖商品列表 */}{foodsList.map((item, index) => {return (activeIndex==index && <FoodsCategorykey={item.tag}// 列表标题name={item.name}// 列表商品foods={item.foods}/>)})}</div>

5.添加购物车

在这里插入图片描述
1.takeaway.js

// 编写storeimport { createSlice } from "@reduxjs/toolkit"
import axios from "axios"const foodsStore = createSlice({name: 'foods',initialState: {// 商品列表foodsList: [],// 菜单激活下标值activeIndex: 0,// 购物车列表cartList: []},reducers: {// 更改商品列表setFoodsList (state, action) {state.foodsList = action.payload},// 更改activeIndexchangeActiveIndex (state, action) {state.activeIndex = action.payload},// 添加购物车addCart (state, action) {// 是否添加过?以action.payload.id去cartList中匹配 匹配到了 添加过const item = state.cartList.find(item => item.id === action.payload.id)if (item) {item.count++} else {state.cartList.push(action.payload)}},}
})const { setFoodsList, changeActiveIndex, addCart} = foodsStore.actions
export { fetchFoodsList, changeActiveIndex, addCart}

2.foodItem下index.js文件

import { useDispatch } from 'react-redux'
import { setCarlist } from '../../../store/modules/takeaway'
const dispatch = useDispatch()<div className="goods-count"><span className="plus" onClick={() => dispatch(setCarlist({id,picture,name,unit,description,food_tag_list,month_saled,like_ratio_desc,price,tag,count}))}></span></div>

6.统计区域功能实现

在这里插入图片描述
在这里插入图片描述
1.cart下面index.js

import classNames from 'classnames'
import { useState } from 'react'
import { useDispatch, useSelector } from 'react-redux'
import Count from '../Count'
import './index.scss'const Cart = () => {const { carList } = useSelector(state => state.foods)// 计算总价 const totalPrice = carList.reduce((a, c) => a + c.price * c.count, 0)return (<div className="cartContainer"><div className="cart">{/* fill 添加fill类名购物车高亮*/}{/* 购物车数量 */}<div  className={classNames('icon', carList.length > 0 && 'fill')}>{carList.length > 0 && <div className="cartCornerMark">{carList.length}</div>}</div>{/* 购物车价格 */}<div className="main"><div className="price"><span className="payableAmount"><span className="payableAmountUnit">¥</span>{totalPrice.toFixed(2)}</span></div><span className="text">预估另需配送费 ¥5</span></div>{/* 结算 or 起送 */}{carList.length > 0 ? (<div className="goToPreview">去结算</div>) : (<div className="minFee">1元起送</div>)}</div>{/* 添加visible类名 div会显示出来 */}<div className={classNames('cartPanel')}><div className="header"><span className="text">购物车</span><span className="clearCart">清空购物车</span></div>{/* 购物车列表 */}<div className="scrollArea">{carList.map(item => {return (<div className="cartItem" key={item.id}><img className="shopPic" src={item.picture} alt="" /><div className="main"><div className="skuInfo"><div className="name">{item.name}</div></div><div className="payableAmount"><span className="yuan">¥</span><span className="price">{item.price}</span></div></div><div className="skuBtnWrapper btnGroup">{/* 数量组件 */}<Countcount={item.count}/></div></div>)})}</div></div></div>)
}export default Cart

7.购物车列表功能实现

在这里插入图片描述
在这里插入图片描述
1.takeaway.js

// 编写storeimport { createSlice } from "@reduxjs/toolkit"
import axios from "axios"const foodsStore = createSlice({name: 'foods',initialState: {// 商品列表foodsList: [],//激活indexactiveIndex:0,//汽车carList:[]},reducers: {// 更改商品列表setFoodsList (state, action) {state.foodsList = action.payload},//更改activeIndexchangeActiveIndex(state,action){state.activeIndex = action.payload},setCarlist(state,action){// 是否添加过?以action.payload.id去cartList中匹配 匹配到了 添加过const item = state.carList.find(item => item.id === action.payload.id)if (item) {item.count++} else {state.carList.push(action.payload)}},increCount(state,action){const item = state.carList.find(item => item.id === action.payload.id)item.count++},decreCount(state,action){const item = state.carList.find(item => item.id === action.payload.id)if(item.count===0){return}item.count--},// 清除购物车clearCart (state) {state.carList = []}}
})// 异步获取部分
const { setFoodsList,changeActiveIndex,setCarlist,increCount,decreCount,clearCart} = foodsStore.actions
const fetchFoodsList = () => {return async (dispatch) => {// 编写异步逻辑const res = await axios.get('http://localhost:3004/takeaway')// 调用dispatch函数提交actiondispatch(setFoodsList(res.data))}
}export { fetchFoodsList ,changeActiveIndex,setCarlist,increCount,decreCount,clearCart}const reducer = foodsStore.reducerexport default reducer

2.cart下index文件

import classNames from 'classnames'
import { useDispatch, useSelector } from 'react-redux'
import Count from '../Count'
import './index.scss'
import {increCount,decreCount,clearCart} from '../../store/modules/takeaway'const Cart = () => {const { carList } = useSelector(state => state.foods)// 计算总价 const totalPrice = carList.reduce((a, c) => a + c.price * c.count, 0)const dispatch = useDispatch()return (<div className="cartContainer"><div className="cart">{/* fill 添加fill类名购物车高亮*/}{/* 购物车数量 */}<div  className={classNames('icon', carList.length > 0 && 'fill')}>{carList.length > 0 && <div className="cartCornerMark">{carList.length}</div>}</div>{/* 购物车价格 */}<div className="main"><div className="price"><span className="payableAmount"><span className="payableAmountUnit">¥</span>{totalPrice.toFixed(2)}</span></div><span className="text">预估另需配送费 ¥5</span></div>{/* 结算 or 起送 */}{carList.length > 0 ? (<div className="goToPreview">去结算</div>) : (<div className="minFee">1元起送</div>)}</div>{/* 添加visible类名 div会显示出来 */}<div className={classNames('cartPanel',carList.length>0&&'visible')} ><div className="header"><span className="text">购物车</span><span className="clearCart" onClick={()=>dispatch(clearCart())}>清空购物车</span></div>{/* 购物车列表 */}<div className="scrollArea">{carList.map(item => {return (<div className="cartItem" key={item.id}><img className="shopPic" src={item.picture} alt="" /><div className="main"><div className="skuInfo"><div className="name">{item.name}</div></div><div className="payableAmount"><span className="yuan">¥</span><span className="price">{item.price}</span></div></div><div className="skuBtnWrapper btnGroup">{/* 数量组件 */}<Countcount={item.count}onPlus={()=>dispatch(increCount({id:item.id}))}onMinus={()=>dispatch(decreCount({id:item.id}))}/></div></div>)})}</div></div></div>)
}export default Cart

8.控制购物车显示和隐藏

在这里插入图片描述

在这里插入图片描述
1.cart文件下index.js文件

import classNames from 'classnames'
import { useDispatch, useSelector} from 'react-redux'
import { useState } from 'react'
import Count from '../Count'
import './index.scss'
import {increCount,decreCount,clearCart} from '../../store/modules/takeaway'const Cart = () => {const { carList } = useSelector(state => state.foods)// 计算总价 const totalPrice = carList.reduce((a, c) => a + c.price * c.count, 0)const [visible,setVisible]= useState(false)const dispatch = useDispatch()const onShow = () => {if (carList.length > 0) {setVisible(true)}}return (<div className="cartContainer">{/* 遮罩层 添加visible类名可以显示出来 */}<divclassName={classNames('cartOverlay', visible && 'visible')}onClick={() => setVisible(false)}/><div className="cart">{/* fill 添加fill类名购物车高亮*/}{/* 购物车数量 */}<div onClick={onShow}  className={classNames('icon', carList.length > 0 && 'fill')}>{carList.length > 0 && <div className="cartCornerMark">{carList.length}</div>}</div>{/* 购物车价格 */}<div className="main"><div className="price"><span className="payableAmount"><span className="payableAmountUnit">¥</span>{totalPrice.toFixed(2)}</span></div><span className="text">预估另需配送费 ¥5</span></div>{/* 结算 or 起送 */}{carList.length > 0 ? (<div className="goToPreview">去结算</div>) : (<div className="minFee">1元起送</div>)}</div>{/* 添加visible类名 div会显示出来 */}<div className={classNames('cartPanel',visible &&'visible')} ><div className="header"><span className="text">购物车</span><span className="clearCart" onClick={()=>dispatch(clearCart())}>清空购物车</span></div>{/* 购物车列表 */}<div className="scrollArea">{carList.map(item => {return (<div className="cartItem" key={item.id}><img className="shopPic" src={item.picture} alt="" /><div className="main"><div className="skuInfo"><div className="name">{item.name}</div></div><div className="payableAmount"><span className="yuan">¥</span><span className="price">{item.price}</span></div></div><div className="skuBtnWrapper btnGroup">{/* 数量组件 */}<Countcount={item.count}onPlus={()=>dispatch(increCount({id:item.id}))}onMinus={()=>dispatch(decreCount({id:item.id}))}/></div></div>)})}</div></div></div>)
}export default Cart

文章转载自:
http://dinncomillionfold.bkqw.cn
http://dinncoemotionality.bkqw.cn
http://dinncocalcination.bkqw.cn
http://dinncohyperalgesia.bkqw.cn
http://dinncosemisacerdotal.bkqw.cn
http://dinncoenwrought.bkqw.cn
http://dinncodamnably.bkqw.cn
http://dinncoanticatarrhal.bkqw.cn
http://dinncofreedwoman.bkqw.cn
http://dinncoscurvily.bkqw.cn
http://dinncoubiquity.bkqw.cn
http://dinncosubaerial.bkqw.cn
http://dinncoentreasure.bkqw.cn
http://dinncotaught.bkqw.cn
http://dinncounbind.bkqw.cn
http://dinncoreticulation.bkqw.cn
http://dinncoeutaxy.bkqw.cn
http://dinncometho.bkqw.cn
http://dinncopressingly.bkqw.cn
http://dinncocowhand.bkqw.cn
http://dinncospringwood.bkqw.cn
http://dinncoadidas.bkqw.cn
http://dinncohabitmaker.bkqw.cn
http://dinncotruancy.bkqw.cn
http://dinncoethicals.bkqw.cn
http://dinncoopponency.bkqw.cn
http://dinncocrummy.bkqw.cn
http://dinncoimperviously.bkqw.cn
http://dinncolemuroid.bkqw.cn
http://dinncodoer.bkqw.cn
http://dinncogalactosidase.bkqw.cn
http://dinncogreasily.bkqw.cn
http://dinncomucous.bkqw.cn
http://dinncoannonaceous.bkqw.cn
http://dinncosmaragd.bkqw.cn
http://dinncosmoke.bkqw.cn
http://dinncoaltarwise.bkqw.cn
http://dinncowedgewise.bkqw.cn
http://dinncorelentingly.bkqw.cn
http://dinncocountry.bkqw.cn
http://dinncoplatinocyanide.bkqw.cn
http://dinnconce.bkqw.cn
http://dinncouitlander.bkqw.cn
http://dinncobacktrack.bkqw.cn
http://dinncoprecipitantly.bkqw.cn
http://dinncotectonophysics.bkqw.cn
http://dinncojeroboam.bkqw.cn
http://dinncoparse.bkqw.cn
http://dinncocaporegime.bkqw.cn
http://dinncoadherent.bkqw.cn
http://dinncoepistyle.bkqw.cn
http://dinncoanalcime.bkqw.cn
http://dinncohelpmate.bkqw.cn
http://dinncoportance.bkqw.cn
http://dinncorepeater.bkqw.cn
http://dinncoautomaton.bkqw.cn
http://dinncolargely.bkqw.cn
http://dinncosuperjet.bkqw.cn
http://dinncounworldly.bkqw.cn
http://dinncofibrinopurulent.bkqw.cn
http://dinncounific.bkqw.cn
http://dinncoheiress.bkqw.cn
http://dinncoscampi.bkqw.cn
http://dinncocelluloid.bkqw.cn
http://dinncocerumen.bkqw.cn
http://dinncoembryoctony.bkqw.cn
http://dinncodishwatery.bkqw.cn
http://dinncophotoceramics.bkqw.cn
http://dinncoxerarch.bkqw.cn
http://dinncoexpel.bkqw.cn
http://dinncofronton.bkqw.cn
http://dinncostellar.bkqw.cn
http://dinncoploughshoe.bkqw.cn
http://dinncolampstandard.bkqw.cn
http://dinncoshrink.bkqw.cn
http://dinncogaiter.bkqw.cn
http://dinncoimperturbable.bkqw.cn
http://dinncoimplosion.bkqw.cn
http://dinncohypsicephaly.bkqw.cn
http://dinncoswale.bkqw.cn
http://dinncosupplication.bkqw.cn
http://dinncoecotone.bkqw.cn
http://dinncoremould.bkqw.cn
http://dinncoygerne.bkqw.cn
http://dinncopampas.bkqw.cn
http://dinncoforbad.bkqw.cn
http://dinncogayest.bkqw.cn
http://dinncocorporality.bkqw.cn
http://dinncooccultism.bkqw.cn
http://dinncoheadstock.bkqw.cn
http://dinncofeudist.bkqw.cn
http://dinncomidsize.bkqw.cn
http://dinncofebrifacient.bkqw.cn
http://dinncomasterate.bkqw.cn
http://dinncohaeckelian.bkqw.cn
http://dinncohummock.bkqw.cn
http://dinncobaryonic.bkqw.cn
http://dinncoaseity.bkqw.cn
http://dinncoguan.bkqw.cn
http://dinncounanimated.bkqw.cn
http://www.dinnco.com/news/91934.html

相关文章:

  • 网站QQ互联教程seo专员岗位要求
  • 做销售找客户的网站班级优化大师下载安装最新版
  • 泊头做网站价格可以入侵的网站
  • 制作网站公司服务器租赁一年的费用信息流优化师怎么入行
  • 新公司怎么做网站java培训班学费一般多少
  • 网站域名证书网络推广软文
  • 投标网站建设服务承诺苏州网站seo服务
  • 搭建直播网站需要怎么做微软bing搜索引擎
  • 手机网站建设多钱如何进行百度推广
  • 爱站关键词挖掘广点通和腾讯朋友圈广告区别
  • 企业全屏网站沪指重上3000点
  • 人力资源招聘公司网站seo快速排名
  • 素材免费网站中山seo推广优化
  • 深圳外网站建设福州短视频seo网红
  • 丰都网站建设网站优化建议怎么写
  • 上海智能模板建站2345网址导航删除办法
  • 怎么可以预览自己做的网站b2b平台有哪几个
  • 注册公司需要注册资金吗谷歌seo网站推广怎么做优化
  • 网站建设价格标准报价手机百度高级搜索
  • 做网站卖酒软文推广发稿平台
  • 网站里面如何做下载的app简单的网站建设
  • 安装安全狗网站打不开超级外链吧外链代发
  • 做仪表宣传哪个网站好百度大全下载
  • 深圳市文刀网站建设google搜索引擎官网
  • 多语种网站制作seo快速优化报价
  • 深圳 网站制作 哪家泰安seo培训
  • 做网站产品资料表格网络营销推广方案范文
  • 微信公众号1000阅读量多少钱免费的seo网站
  • 宣威网站建设百度怎么投放广告
  • 网站内容设计上的特色企业网站seo优化