redux搭配react-redux实现简易购物车

1.创建reducer

eg:./shopcarList/shopCarList.js

const initState = [  //初始状态
    {
        id: 1,
        name: "apple",
        allnum: 10,
        num: 0,
        remainnum:10,
        price: 5
    },
    {
        id: 2,
        name: "apple2",
        allnum: 9,
        remainnum:9,
        num: 0,
        price: 6
    }
]

function shopCarList(state=initState, action) { //当dispatch动作时,再这里处理数据
    console.log(action)
    switch (action.type) {
        case 'ONINCREMENT':
            return state.map(item=>{
                if(item.id === action.payload.id){
                    item.num++;
                    item.remainnum--;
                   
                }
                return item;
            })
        case 'ONDECREMENT':
            return state.map(item=>{
                if(item.id === action.payload.id){
                    item.num--;
                    item.remainnum++;
                }
                return item;
            })
        default:
            return state;

    }
}
export default shopCarList;

2.创建store

import shop from './shopcarList/shopCarList';
import {combineReducers} from 'redux';
export default combineReducers({  //一个项目当有多个reducer时,需要
    shop:shop
});

3.src/index.js

import React from 'react';
import ReactDOM from 'react-dom';
import App from './components/App';
import {Provider} from 'react-redux'; //使用react-redux进行自动连接,Provider包裹的后代组件都可以直接通过connect来获取数据。
import {createStore} from 'redux';	
import shopcar from './reducers';
const store=createStore(shopcar);	  //创建store,shopcar是reducer 
window.store=store;   				  //便于在浏览器进行调试
ReactDOM.render(
  <Provider store={store}>            //传递store,Provider包裹的后代组件都可以获取到
  <App />
  </Provider>,
  document.getElementById('root')
);

3.action的目录结构如下:

1.index.js :action目录的出口
2.actionType.js: 所有action.type都定义在这个文件,避免action重复
3.具体的action操作。

在这里插入图片描述

actionType.js:
export const ONINCREMENT="ONINCREMENT";  //shopcarList
export const ONDECREMENT="ONDECREMENT";	 //shopcarList
export const TEST= "TEST";				//test



index.js:
import {increment,decrement} from './shopcarList'
import {test} from './test'
export {
    increment,decrement,test
}


shopcarList/index.js:
import {ONINCREMENT,ONDECREMENT} from '../actionType';
export const increment=(id)=>{
    return{
        type:ONINCREMENT,
        payload:{
            id
        }
    }
}
export const decrement=(id)=>{
    return{
        type:ONDECREMENT,
        payload:{
            id
        }
    }
}


test/index.js
//暂时没有操作

4.components/shopcarList/index.js
在这里插入图片描述

import React from 'react';
import {connect} from 'react-redux';
import {increment,decrement} from '../../actions'
class ShopCarList extends React.Component{
    constructor(props){
        super(props);
        this.state={
            arr:[]
        }
    }
    componentDidMount(){
       this.renderData();
    }
    renderData=()=>{
        this.setState({
            num:this.props.num
        })
    }
    render(){  
        return (
            <div>
                {
                    this.props.arr.map(item=>{
                        return(
                            <div key={item.id}>
                            <button onClick={this.props.decrement.bind(this,item.id)} disabled={item.num <=0 ? true : false }>-</button>
                            <button >购买数量:{item.num}</button>
                            <button >支付金额:{item.price * item.num}</button>
                            <button onClick={this.props.increment.bind(this,item.id)} disabled={item.num >=item.allnum ? true : false }>+</button>
                           
                            <button >剩余量:{item.remainnum}</button>
                            <button >总量:{item.allnum}</button>
                            <hr/>
                            </div>
                        )
                    })
                }
            </div>
        )
    }
}
const mapStateToProps=(state)=>{
    console.log(state)
    return {
        arr:state.shop
    }
}
//第二种方法
// const mapDispatchToprops=dispatch=>{
//     console.log(dispatch)
//     return {
//         add:(id)=> dispatch(increment(id)),
//         jian:(id)=>dispatch(decrement(id))
//     }
// }
// export default connect(mapStateToProps,mapDispatchToprops)(ShopCarList);

//第一种方法
export default connect(mapStateToProps,{increment,decrement})(ShopCarList);

效果图如下:
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值