Redux实现简单购物车

购物车页面

import React,{Component, useState} from 'react'
import store from '../../store'

class Ct extends Component{
    constructor(){
        super()
        this.state ={
            //组件自身的数据 store.getState() 回去仓库中数据的方法 是方法
            name: store.getState().name,
            cards: store.getState().cards
        }
        // store.subscribe()  该方法在仓库数据发生变化时执行
        store.subscribe(()=>{
            this.setState({
                //在仓库数据变化时,更新组件数据
                name:store.getState().name,
                cards:store.getState().cards
            })
        })
      
    }
    render(){
        return(
            <div>
                <table>
                    <thead>
                        <tr>
                            <th>序号</th>
                            <th>名称</th>
                            <th>价格</th>
                            <th>
                              数量
                            </th>
                            <th>操作</th>
                        </tr>
                    </thead>
                    <tbody>
                       {
                           this.state.cards.map(item =>{
                               return(
                                <tr key={item.id}>
                           <td>{item.id}</td>
                               <td>{item.name}</td>
                               <td>{item.price}</td>
                                <td>
                                    <button onClick={
                                        ()=>{this.jian(item)}
                                    } 
                                    style={{width:'40px'}}
                                    >-</button>
                                        {item.num}
                                    <button onClick={
                                        ()=>{this.handleAdd(item)}
                                    }>+</button>    
                                </td> 
                                </tr>
                               )
                           })
                       }
                    </tbody>
                </table>
            </div>
        )
    }
    handleAdd=(item) =>{
        // 提交动作
        store.dispatch({
            // 提交的验证
            type: 'ADD_TODO',
            // 提交的数据
            good:item
        })
    }
    jian=(item)=>{
         // 提交动作
         store.dispatch({
            // 提交的验证
            type: 'JIAN_TODO',
            // 提交的数据
            good:item
        })
    }
}


const Cart = ()=>{
    const [gooods,setGooods] =useState([
        {id:1,name:'手机',price:2000},
        {id:2,name:'笔记本电脑',price:5000},
        {id:3,name:'手表',price:12000},
    ])
    
  function add(item){
        store.dispatch({
            // 提交的验证
            type: 'ADD_TODO',
            // 提交的数据
            good:item
        })
    }
    return(
        <div>
            <h2>商品展示页</h2>
            <ul>
                {
                    gooods.map(item=>{
                        return (
                            <li key={item.id}>
                                {item.name}
                                <button onClick={()=>{
                                    add(item)
                                }}>+</button>
                            </li>
                        )
                    })
                }
            </ul>
            <hr/>
            <Ct></Ct>
        </div>
    )
 
}

export default Cart

Redux页面

import {createStore} from 'redux'
// 返回新的数据不直接修改
const reducer = (state,action)=>{
//  验证 action.type 提交动作的验证属性type
    if(action.type === 'ADD_TODO'){
        // 做一个拷贝 因为不能直接修改所以需要拷贝用新的数据去退换旧的数据
        //  拷贝要做深拷贝不然新旧数据都会变
        //  1. 深拷贝 
        let  newState = JSON.parse(JSON.stringify(state))
        // 2 判断当前点击的商品是否存在购物车中
        let index = state.cards.findIndex(item=>item.id ===action.good.id)
        if(index> -1){
            newState.cards[index].num++
        }else{
            newState.cards.push({
                id:action.good.id,
                name:action.good.name,
                price: action.good.price,
                num: 1
            })
        }
        return newState
    }else if(action.type ==='JIAN_TODO'){
        let newState = Object.assign({},state,{})
        console.log(newState)
        let index = state.cards.findIndex(item =>item.id ===action.good.id)
        if(index > -1){
            if(newState.cards[index].num>1){
                newState.cards[index].num--
            }else{
                newState.cards[index].num=1
            }
            return newState
        }
    }else {
        // 初始化
        return {
          name: '张三',
          cards: [
            {id: 1, name: 'Apple', price: 10, num: 1}
          ]
        }
      }
}
//创建仓库实例  接受reducer
const store = createStore(reducer, window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__())
export default store
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335

推荐阅读更多精彩内容

  • 文中的蓝色字体是相关内容的超链接,网址不另外列出,请放心点击。 本文内容适合 Redux 和 React 新手,也...
    Mscorolla阅读 757评论 0 1
  • 背景 在Redux出现之前,在构建复杂任务时管理状态是相当痛苦的事情。受Flux应用程序设计模式的启发,Redux...
    这个前端不太冷阅读 679评论 0 2
  • 作者:来源 sf 的小智 你知道 Redux 真正的作用远不止状态管理吗? 你是否想要了解 Redux 的工作原理...
    勿忘巛心安阅读 473评论 0 7
  • 1.为什么会出现redux 前端技术越来越强,开发者对于前端页面的体验要求也越来越高,大家开始琢磨着怎么才能提升页...
    DanD丶榆木稚年阅读 10,482评论 1 5
  • 一. 纯原生 redux 的使用 Redux 是常用的状态管理容器,能够帮助我们对一些全局变量进行有效管理。首先,...
    林木木road阅读 1,950评论 0 2