Redux使用实例/学习笔记
一. 纯原生 redux 的使用
Redux 是常用的状态管理容器,能够帮助我们对一些全局变量进行有效管理。首先,举一个场景:我正在开开心心的逛淘宝商城,点进了一个淘宝店家的商品 A 的详情页,觉得不错,于是点击 ”加入购物车“,接着我又点进了一个天猫店家的商品 B 的详情页,也觉得不错,又点击了 ”加入购物车“,最终我打开购物车发现有 A B 两件商品。假设淘宝商品详情页和天猫商品是两个相互独立的组件,那么要实现上述场景,购物车就应当是一个共享组件,此时就可以使用 redux 对购物车实现统一管理。那么以当前这个场景,使用原生 redux 应该怎么实现呢?废话不多说,看如下实现:
-
安装 redux
redux 支持 npm 等包管理工具,故而进入项目目录中,执行
npm install redux --save / yarn add redux
-
建立一个仓库来存储数据
// store.js import {createStore} from 'redux' // 声明一个实际的操作函数,响应操作 const cartReducer = (state = { goods: [] }, action) => { switch (action.type) { case 'add': return {...state, goods: [...state.goods, action.good]} case 'delete': let deletedGoodIdx = action.good.index let newGoods = [...state.goods] newGoods.splice(deletedGoodIdx, 1) return {...state, goods: newGoods} default: return state } } // 创建 store 实例并导出 const store = createStore(cartReducer) export default store
-
在组件中使用 store
读取:
store.getState()
即可获取到 reducer 中的 state修改:
store.dispatch(action)
通过 dispatch 一个 action 来触发 reducer 中的修改行为/********** App.js **************/ import React from 'react' import {Link, Route} from 'react-router-dom' import store from './store' // 淘宝商品详情组件 function TbItem() { return ( <div> <h2>这是淘宝详情页</h2> <p>当前购物车内商品数量:{store.getState().goods.length}</p> <button onClick={() => store.dispatch({type: 'add', good: {title: `淘宝商品${Date.now()}`, price: 100}})}>添加购物车</button> </div> ) } // 天猫商品详情组件 function TmItem() { return ( <div> <h2>这是天猫详情页</h2> <p>当前购物车内商品数量:{store.getState().goods.length}</p> <button onClick={() => store.dispatch({type: 'add', good: {title: `天猫商品${Date.now()}`, price: 200}})}>添加购物车</button> </div> ) } // 购物车组件 function Cart() { let goods = store.getState().goods return ( <ul> { goods.map((good, index) => { return ( <li key={index}> <span>{good.title}</span> <button onClick={() => store.dispatch({type: 'delete', good: {index}})}>删除</button> </li> ) }) } </ul> ) } // 使用 react-router-dom 配置两个页面 function App() { return (