react绑定详解(React列表栏及购物车组件使用详解)
类别:编程学习 浏览量:2017
时间:2021-10-20 08:48:41 react绑定详解
React列表栏及购物车组件使用详解本文实例为大家分享了React列表栏及购物车组件的具体代码,供大家参考,具体内容如下
一、组件介绍
商家详细界面(StoreDetail组件):
import React from 'react'; import axios from 'axios'; import GoBack from '../smallPage/GoBack'; import '../../Assets/css/storeDetail.css'; import MenuList from '../../Mock/MenuList'; import Order from '../menuPage/Order'; import Evaluate from '../menuPage/Evaluate'; import Business from '../menuPage/Business'; class StoreDetail extends React.Component { constructor(props) { super(props); this.state = { food:null, menulist:MenuList }; } componentDidMount(){ axios.get("/food").then((res)=>{ this.setState({ food:res.data.result.data }); console.log(this.state.food); }); } userSelect=(index)=>{ MenuList.forEach((val,key)=>{ val.isshow=false; if(key===index){ val.isshow=true; } }); this.setState({ menulist:MenuList }); } render() { return ( this.state.food? <li> <GoBack title={this.state.food.poi_info.name}/> <li className="foodimage"> <img src={this.state.food.poi_info.pic_url} alt=""/> <img src={this.state.food.poi_info.head_pic_url} alt=""/> <span>{this.state.food.poi_info.name}</span> </li> <li> <ul className="menulist"> { this.state.menulist.map((value,index)=>{ return ( <li key={index} onClick={this.userSelect.bind(this,index)}> {value.title} <span className={value.isshow?'foodline':''}></span> </li> ) }) } </ul> </li> { this.state.menulist.map((value,index)=>{ if(value.isshow&&index===0){ return <Order toprice={this.state.food.poi_info.shipping_fee_tip} orderlist={this.state.food.food_spu_tags} key={index}/> }else if(value.isshow&&index===1){ return <Evaluate key={index}/> }else if(value.isshow&&index===2){ return <Business key={index}/> }else{ return ''; } }) } </li> :'' ); } } export default StoreDetail;
点单界面(Order组件):
import React from 'react'; import '../../Assets/css/order.css'; import AddCut from '../smallPage/AddCut'; import Cart from '../smallPage/Cart'; class Order extends React.Component { constructor(props) { super(props); this.state = { list:[], leftindex:0 }; } scrollRight=(e)=>{ let scrolltop=e.target.scrollTop; let listheight=this.state.list; for(let i=0;i<listheight.length-1;i++){ if(scrolltop<listheight[i]){ // 在滑动的时候取其数组中的第某个集合并且修改索引值 this.setState({ leftindex:i }); break; }else if(scrolltop>=listheight[i]&&scrolltop<listheight[i+1]){ // 当右边滑动值大于整个高的一半时,左边的索引需要往下走 if(i+1>=listheight.length/2){ // 获取左边的ul,让其scrollTop往下顶 this.refs.leftul.scrollTop=listheight[i+1]; }else{ // 让其scrollTop往上顶 this.refs.leftul.scrollTop=0; } this.setState({ leftindex:i+1 }); break; } } } // 用户点击时,让当前索引变色 userClick=(index)=>{ this.setState({ leftindex:index }); this.refs.order_scroll.scrollTop=index-1>=0?this.state.list[index-1]:0; } componentDidMount(){ let order_block=document.getElementsByClassName("order_block"); let listinfo=this.state.list; // 循环遍历li,拿到每个li的偏移量,再将其push进this.state中进行修改显示,修改后得到listinfo // 若为第一个li,则只拿其自身的偏移量;否则,则拿其自身+listinfo[i-1]的偏移量 for(let i=0;i<order_block.length;i++){ if(i===0){ listinfo.push(order_block[i].offsetHeight); }else{ listinfo.push(order_block[i].offsetHeight+listinfo[i-1]); } } this.setState({ list:listinfo }); // console.log(listinfo); (11) [550, 612, 1284, 1712, 2628, 5496, 7083, 8609, 9099, 9465, 10747] } // 调用子组件Cart里的强制刷新方法,在AddCut组件里执行方法 refComponent=()=>{ let ele=this.refs.cart; ele.update(); } render() { return ( <li className="order"> <li className="order_left"> <ul ref="leftul"> { this.props.orderlist.map((value,index)=>{ return ( // 按照索引来判断左边li的颜色 <li onClick={this.userClick.bind(this,index)} className={this.state.leftindex===index?'leftli leftli_color':'leftli'} key={index}> <img src={value.icon} alt=""/> <span>{value.name}</span> </li> ) }) } </ul> </li> <li onScroll={this.scrollRight} className="order_right"> <li ref="order_scroll" className="order_scroll"> { this.props.orderlist.map((value,index)=>{ return ( <li className="order_block" key={index}> <ul> { value.spus.map((v,k)=>{ return ( <li key={k}> <li className="order_block_img"> <img src={v.picture} alt=""/> </li> <li className="order_block_word"> <li className="order_block_word_name">{v.name}</li> <li className="order_block_word_zan">{v.praise_content}</li> <li className="order_block_word_price"> <span>¥{v.min_price}</span>/份 <AddCut parent={this} name={v.name} price={v.min_price}/> </li> </li> </li> ) }) } </ul> </li> ) }) } </li> </li> <Cart ref="cart" toprice={this.props.toprice}/> </li> ); } } export default Order;
加减页面(AddCut组件):
import React from 'react'; import '../../Assets/css/addCut.css'; import CartData from '../../Mock/CartData'; class AddCut extends React.Component { constructor(props) { super(props); this.state = { num:0 }; } userAdd=()=>{ let addnum=this.state.num; addnum++; this.setState({ num:addnum }); this.addCart(addnum); this.props.parent.refComponent(); } userCut=()=>{ let cutnum=this.state.num; cutnum--; if(cutnum<0){ cutnum=0; } this.setState({ num:cutnum }); this.addCart(cutnum); this.props.parent.refComponent(); } addCart=(num)=>{ // 产生一个对象集合 let list={ name:this.props.name, price:this.props.price, num:num }; let same=false; if(CartData.length===0){ CartData.push(list); } for(let i=0;i<CartData.length;i++){ if(CartData[i].name===this.props.name){ CartData[i].num=num; same=true; } } if(!same){ CartData.push(list); } } render() { return ( <li className="addcut"> <img onClick={this.userCut} className={this.state.num>0?'show':'showhidden'} src={require("../../Assets/image/minus.edae56b865f90527f2657782f67d9c3e.jpg" alt="react绑定详解(React列表栏及购物车组件使用详解)" border="0" />
购物车页面(Cart组件):
import React from 'react'; import '../../Assets/css/cart.css'; import CartData from '../../Mock/CartData'; class Cart extends React.Component { constructor(props) { super(props); this.state = { cart:[], totalprice:0 }; } update=()=>{ // 读取数据 this.setState({ cart:CartData }); // 计算总价 let prices=0; for(let i=0;i<CartData.length;i++){ prices+=CartData[i].price*CartData[i].num; } this.setState({ totalprice:prices }); } render() { return ( <li className="cart"> <li className="cart_left"> <img src={require("../../Assets/image/shop-icon.3a615332a0e634909dc3aa3a50335c8f.jpg" alt="react绑定详解(React列表栏及购物车组件使用详解)" border="0" />
二、效果展示
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持开心学习网。
您可能感兴趣
- reactnative ios(详解React Native与IOS端之间的交互)
- react定时任务(手把手带你用React撸一个日程组件)
- 使用react生命周期的常见情况(react+ts实现简单jira项目的最佳实践记录)
- react教程简介(react入门级详细笔记)
- react表单组件怎么写(react antd实现动态增减表单)
- react事件绑定的方式和区别(react合成事件与原生事件的相关理解)
- react绑定详解(React列表栏及购物车组件使用详解)
- react循环有几种方法(React forwardRef的使用方法及注意点)
- reactnative混合开发教程(教你使用vscode 搭建react-native开发环境)
- vscode react插件(基于visual studio code + react 开发环境搭建过程)
- react和antd项目教程(React引入antd-mobile+postcss搭建移动端)
- react配置上下文路由(React中Portals与错误边界处理实现)
- react 组件如何发布(React如何创建组件)
- react跳转页面并传参数(react 跳转后路由变了页面没刷新的解决方案)
- vue3.0 如何使用useroute(详解vue3中setUp和reactive函数的用法)
- react自适应布局如何实现(React实现分页效果)
- 阴生植物为什么不怕照不到阳光(阴生植物为什么不怕照不到阳光)
- 阴生环境 耐阴地被植物,你知道哪些(阴生环境耐阴地被植物)
- 常见的喜阴植物有哪些 养室内盆栽就在这里选(常见的喜阴植物有哪些)
- 这8种耐阴植物,营造阴生植物花境,也是一个不错的选择(营造阴生植物花境)
- 览邦G08 Plus SMART WATCH 测评⑱ 全独立这才是智能手表该有的样子(览邦G08PlusSMART)
- 荣耀手表 GS 3 真机亮相 不支持无线充电(荣耀手表GS3)
热门推荐
- react组件分析(react-diagram 序列化Json解读案例分析)
- java实现数据库备份(MySQL基于java实现备份表操作)
- datatable添加行列
- web服务器的配置教程(服务器的配置 web服务器配置方法步骤详解)
- pythontime模块有哪些(Python3.5内置模块之time与datetime模块用法实例分析)
- python 多进程读取文件(Python实现的多进程拷贝文件并显示百分比功能示例)
- vue端口号是什么原理(解决vue前后端端口不一致的问题)
- vue中如何判断请求状态码(关于VUE的编译作用域及slot作用域插槽问题)
- nginx代理转发域名(Nginx域名转发使用场景代码实例)
- thinkphp怎么输出二维值(thinkphp 表名 大小写 窍门)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9