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)文章
React router動(dòng)態(tài)加載組件之適配器模式的應(yīng)用詳解
這篇文章主要介紹了React router動(dòng)態(tài)加載組件之適配器模式的應(yīng)用 ,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-09-09
React報(bào)錯(cuò)map()?is?not?a?function詳析
這篇文章主要介紹了React報(bào)錯(cuò)map()?is?not?a?function詳析,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-08-08
react使用antd的上傳組件實(shí)現(xiàn)文件表單一起提交功能(完整代碼)
最近在做一個(gè)后臺(tái)管理項(xiàng)目,涉及到react相關(guān)知識(shí),項(xiàng)目需求需要在表單中帶附件提交,怎么實(shí)現(xiàn)這個(gè)功能呢?下面小編給大家?guī)砹藃eact使用antd的上傳組件實(shí)現(xiàn)文件表單一起提交功能,一起看看吧2021-06-06

