react通過組件拆分實(shí)現(xiàn)購物車界面詳解
頁面組件拆分圖
功能點(diǎn)
- 實(shí)現(xiàn)全選反選
- 數(shù)量的增加和減少
- 選中刪除,單獨(dú)刪除
- 商品總價(jià)和商品總數(shù)量的變化
首先在根組件中把頁面的布局以及功能先實(shí)現(xiàn),然后再拆分組件,最后通過組件傳值進(jìn)行屬性和方法的傳遞
代碼展示
app.js組件
import axios from 'axios'; import React, { Component } from 'react'; import './App.css'; import Cartfoot from './Component/Cartfoot'; import CartList from './Component/CartList'; export default class App extends Component { constructor() { super() this.state = { list: [], checked:false } this.getCart() } getCart = async () => { let res = await axios.get('http://127.0.0.1:3002/getCart') console.log(res.data.data); let carts = res.data.data carts.map(item => { return item.checked = false }) this.setState({ list: carts }) } // 全選 qx=(e)=>{ let {list}=this.state list.map(item=>item.checked=e.target.checked) this.setState({ list:list, checked:e.target.checked }) } // 反選 fx=(index)=>{ let {list}=this.state list[index].checked = !list[index].checked this.setState({ list:list, checked:list.every(item=>item.checked) }) } // 選中刪除 checkDel=()=>{ let {list}=this.state let delAll=list.filter(item=>!item.checked) this.setState({ list:[...delAll] }) } // 數(shù)量加減操作 handlerNum=(index,type="jia")=>{ let {list}=this.state type==='jia'?list[index].num++ :list[index].num-- this.setState({ list:list }) } // 計(jì)算操作 count=()=>{ let total=0 let nums=0 let {list}=this.state list.forEach(item=>{ if(item.checked){ total+=item.num*item.prize nums+=item.num } }) return [total,nums] } // 刪除按鈕 Del=(index)=>{ let {list}=this.state list.splice(index,1) this.setState({ list:list }) } render() { let { list ,checked} = this.state return ( <div className='App'> <table className='table'> <thead> <tr> <th><input type="checkbox" checked={checked} onChange={this.qx}/></th> <th>ID</th> <th>名字</th> <th>圖片</th> <th>價(jià)格</th> <th>數(shù)量</th> <th>操作</th> </tr> </thead> <CartList list={list} fx={this.fx} qx={this.qx} handlerNum={this.handlerNum} Del={this.Del} checked={checked}></CartList> <Cartfoot count={this.count} checkDel={this.checkDel}></Cartfoot> </table> </div> ) } }
在app組件中,我們把所有的方法和請(qǐng)求到的數(shù)據(jù)接口寫在這里,然后再通過props屬性進(jìn)行組件間的通信
CartList.js組件
import React from 'react' import CartItem from './CartItem' export default function CartList(props) { return ( // <div> <tbody> { props.list.map((item, index) => { return ( <CartItem {...props} item={item} index={index} key={index}/> ) }) } </tbody> // </div> ) }
上面的{...props}是因?yàn)榻M件在傳遞屬性時(shí),如果傳遞的時(shí)候是一個(gè)對(duì)象屬性,我們可以使用擴(kuò)展運(yùn)算符傳遞數(shù)據(jù)
Cartfoot.js組件
import React from 'react' export default function Cartfoot(props) { return ( <tfoot> <tr> <td colSpan={7}> 商品總價(jià)格:<strong>{props.count()[0]}</strong> 商品總數(shù)量:<strong>{props.count()[1]}</strong> <button onClick={props.checkDel}>選中刪除</button> </td> </tr> </tfoot> ) }
CartItem.js組件
import React from 'react' import CartColltract from './CartColltract' export default function CartItem(props) { let {item,index}=props return ( <tr> <td><input type="checkbox" checked={item.checked} onChange={()=>props.fx(index)}/></td> <td>{item._id}</td> <td>{item.name}</td> <td><img src={item.phopo} alt="" /></td> <td>{item.prize}</td> <td> <CartColltract {...props} item={item} index={index}></CartColltract> </td> <td><button onClick={()=>props.Del(index)}>刪除</button></td> </tr> ) }
CartColltract.js組件
import React from 'react' export default function CartColltract(props) { let {index,item}=props return ( <div> <button className='danger' disabled={item.num === 1} onClick={()=>props.handlerNum(index,'jian')}>-</button> <input type="text" value={item.num} readOnly /> <button onClick={()=>props.handlerNum(index,'jia')}>+</button> </div> ) }
像我們上面組件那樣,組件之間層層嵌套,我們不僅可以使用普通父?jìng)髯?,子傳父的組件通信方式進(jìn)行組件傳值,也可以使用context兄弟組件通信
到此這篇關(guān)于react通過組件拆分實(shí)現(xiàn)購物車界面詳解的文章就介紹到這了,更多相關(guān)react組件拆分內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解如何優(yōu)雅地在React項(xiàng)目中使用Redux
這篇文章主要介紹了詳解如何優(yōu)雅地在React項(xiàng)目中使用Redux,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-12-12詳解關(guān)于React-Router4.0跳轉(zhuǎn)不置頂解決方案
這篇文章主要介紹了詳解關(guān)于React-Router4.0跳轉(zhuǎn)不置頂解決案,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-05-05React Native使用百度Echarts顯示圖表的示例代碼
本篇文章主要介紹了React Native使用百度Echarts顯示圖表的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-11-11React Refs轉(zhuǎn)發(fā)實(shí)現(xiàn)流程詳解
Refs是一個(gè) 獲取 DOM節(jié)點(diǎn)或React元素實(shí)例的工具,在React中Refs 提供了一種方式,允許用戶訪問DOM 節(jié)點(diǎn)或者在render方法中創(chuàng)建的React元素,這篇文章主要給大家介紹了關(guān)于React中refs的一些常見用法,需要的朋友可以參考下2022-12-12使用ReactJS實(shí)現(xiàn)tab頁切換、菜單欄切換、手風(fēng)琴切換和進(jìn)度條效果
這篇文章主要介紹了使用ReactJS實(shí)現(xiàn)tab頁切換、菜單欄切換、手風(fēng)琴切換和進(jìn)度條效果的相關(guān)資料,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2016-10-10React通過useContext特性實(shí)現(xiàn)組件數(shù)據(jù)傳遞
本文主要介紹了React如何通過useContext特性實(shí)現(xiàn)組件數(shù)據(jù)傳遞,文中有相關(guān)的代碼示例供大家參考,對(duì)我們學(xué)習(xí)React有一定的幫助,需要的朋友可以參考下2023-06-06