React学习笔记_shoping_cart
购物车
一、商品列表
1.初始化加载商品列表
- 异步加载 需要引入中间件 thunk
- store.dispatch(getAllProducts())
const middleware = [thunk];const store = createStore(reducer,applyMiddleware(...middleware) )store.dispatch(getAllProducts()) render(<Provider store={store}><App/></Provider>,document.getElementById('root') )
- action 中调用API shop.getProducts 获取数据
- 获取数据后回调 dispath:receiveProducts
export const getAllProducts = () => dispatch => {shop.getProducts(products => {dispatch(receiveProducts(products))}) }const receiveProducts = products => ({type: types.RECEIVE_PRODUCTS,products })
API
export default {getProducts: (cb, timeout) => {setTimeout(() => cb(_products), timeout || TIMEOUT)},buyProducts: (payload, cb, timeout) => setTimeout(() => cb(), timeout || TIMEOUT) }
2.商品列表页面
ProductsContainer
const App = () => (<div><h2>购物车</h2><hr/><ProductsContainer/><hr/><CartContainer /></div> )
const ProductsContainer = ({products, addToCart}) => (<ProductsList title="商品列表">{products.map(product =><ProductItemkey={product.id}product={product}onAddToCartClicked={() => addToCart(product.id)}/>)}</ProductsList> )const mapStateToProps = state => {return {products: getVisibleProducts(state.products)} }export default connect(mapStateToProps,{addToCart} )(ProductsContainer)
二、添加商品到购物车
action
- 先验证商品是否库存为0。 如果不为0则发送dispatch: addToCartUnsafe
export const addToCart = productId => (dispatch, getState) => {if (getState().products.byId[productId].inventory > 0) {dispatch(addToCartUnsafe(productId))} }const addToCartUnsafe = productId => ({type: types.ADD_TO_CART,productId })
- 商品库存减一
const products = (state, action) => {switch (action.type) {case ADD_TO_CART:return {...state,inventory: state.inventory - 1}} }
- 商品的state数据结构:products.byId products.visibleIds
products.byId
{1: {"id": 1, "title": "iPad 4 Mini", "price": 500.01, "inventory": 2},2: {"id": 2, "title": "H&M T-Shirt White", "price": 10.99, "inventory": 10} }
products.visibleIds
[1,2]
- 购物车添加商品
const addedIds = (state = initialState.addedIds, action) => {switch (action.type) {case ADD_TO_CART:if (state.indexOf(action.productId) !== -1) {return state}return [ ...state, action.productId ]default:return state} }const quantityById = (state = initialState.quantityById, action) => {switch (action.type) {case ADD_TO_CART:const { productId } = actionreturn { ...state,[productId]: (state[productId] || 0) + 1}default:return state} }
- 购物车 state数据结构
cart.addedIds
[1,2]
cart.quantityById
//ID:quantity 购物车中商品数量 {1: 1 }
三、购物车页面
显示购物车中商品列表。和“check”购买按钮
const CartContainer = ({ products, total ,checkout}) => (<Cartproducts={products}total={total}onCheckoutClicked={() => checkout(products)} /> )const mapStateToProps = (state) => ({products: getCartProducts(state),total: getTotal(state) })export default connect(mapStateToProps,{ checkout } )(CartContainer)
const Cart = ({products, total, onCheckoutClicked}) => {const hasProducts = products.length > 0const nodes = hasProducts ? (products.map(product =><Producttitle={product.title}price={product.price}quantity={product.quantity}key={product.id}/>)) : (<em>Please add some products to cart.</em>)return (<div><h3>Your Cart</h3><div>{nodes}</div><p>Total: ${total}</p><button onClick={onCheckoutClicked}disabled={hasProducts ? '' : 'disabled'}>Checkout</button></div>) }export default Cart
四、购买
- 用户点击购买按钮:dispatch(action): check
- 先清空购物车 发送dispath:CHECKOUT_REQUEST
- 异步调用API 购买商品。回调函数:如果购买成功则dispatch:CHECKOUT_SUCCESS. 如果失败:types.CHECKOUT_FAILURE 恢复购物车中数据
export const checkout = products => (dispatch, getState) => {const { cart } = getState()dispatch({type: types.CHECKOUT_REQUEST})shop.buyProducts(products, () => {dispatch({type: types.CHECKOUT_SUCCESS,cart})// Replace the line above with line below to rollback on failure:// dispatch({ type: types.CHECKOUT_FAILURE, cart })}) }
shop.buyProducts
buyProducts: (payload, cb, timeout) => setTimeout(() => cb(), timeout || TIMEOUT)
React学习笔记_shoping_cart相关推荐
- react学习笔记1--基础知识
什么是react A JAVASCRIPT LIBRARY FOR BUILDING USER INTERFACES[React是一个用于构建用户界面的JavaScript库.] React之所以快, ...
- react render没更新_web前端教程分享React学习笔记(一)
web前端教程分享React学习笔记(一),React的起源和发展:React 起源于 Facebook 的内部项目,因为该公司对市场上所有 JavaScript MVC 框架,都不满意,就决定自己写 ...
- react组件卸载调用的方法_好程序员web前端培训分享React学习笔记(三)
好程序员web前端培训分享React学习笔记(三),组件的生命周期 React中组件也有生命周期,也就是说也有很多钩子函数供我们使用, 组件的生命周期,我们会分为四个阶段,初始化.运行中.销毁.错误处 ...
- React学习笔记:入门案例
React学习笔记:入门案例 React 起源于 Facebook 内部项目,因为市场上所有 JavaScript MVC 框架都不令人满意,公司就决定自己写一套,用来架设 Instagram 的网站 ...
- React学习笔记(五) 状态提升
状态提升究竟是什么东西呢?别急,下面让我们一步一步来看看究竟要怎么使用状态提升 假设我们有这样一个需求,提供两个输入框(分别属于两个组件),保证输入框里面的内容同步 好,下面我们先来封装一个输入框组件 ...
- React学习笔记 - 组件Props
React Learn Note 4 React学习笔记(四) 标签(空格分隔): React JavaScript 三.组件&Props 组件可以将UI切分成一些独立的.可复用的部件,这样你 ...
- React学习笔记八-受控与非受控组件
此文章是本人在学习React的时候,写下的学习笔记,在此纪录和分享.此为第八篇,主要介绍非受控组件与受控组件. 目录 1.非受控组件 1.1表单提交案例 1.2案例的总结 2.受控组件 2.1受控组件 ...
- React学习笔记二:实现一个数字时钟
<!DOCTYPE html> <html lang="zhm"><head><meta charset="UTF-8" ...
- React学习笔记_从create-react-app学习webpack
从create-react-app学习webpack 更多干货 分布式实战(干货) spring cloud 实战(干货) mybatis 实战(干货) spring boot 实战(干货) Reac ...
最新文章
- oracle将多行转成多列,oracle 多行转多列查询
- softirq/tasklet/workqueue的区别
- Aspose.Cells.dll操作exel
- [No000022]他们说:得诺贝尔奖到底有多难?
- CWE 4.3:强化你的数据自我保护能力
- 易语言html实现报表打印,易语言报表统计功能例程可打印
- 【实习之T100开发(1),韩顺平Java视频教程百度云盘
- 大数据技术原理与应用(第八章HBase测试)
- reg文件导入注册表后出现中文乱码的解决方法
- Hexo | yilia主题安装
- k8s使用volume将ConfigMap作为文件或目录直接挂载_【大强哥-k8s从入门到放弃06】Secret详解...
- SSM框架中 出现的406 (Not Acceptable)
- 关于神经网络的轻量化
- 关于Debug.Log的一点儿小知识
- 更新或卸载VisualSVN时出现0x8004401e错误,或完全卸载VisualSVN
- kubernetes之探针
- 【朝花夕拾】Android自定义View篇之(十一)View的滑动,弹性滑动与自定义PagerView...
- python经典类和新式类_python中经典类和新式类的区别
- 读《STRENGTHNET: DEEP LEARNING-BASED EMOTION STRENGTH ASSESSMENT FOR EMOTIONAL SPEECH SYNTHESIS》
- 测试开发的瓶颈在哪儿?