购物车

一、商品列表

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: &#36;{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相关推荐

  1. react学习笔记1--基础知识

    什么是react A JAVASCRIPT LIBRARY FOR BUILDING USER INTERFACES[React是一个用于构建用户界面的JavaScript库.] React之所以快, ...

  2. react render没更新_web前端教程分享React学习笔记(一)

    web前端教程分享React学习笔记(一),React的起源和发展:React 起源于 Facebook 的内部项目,因为该公司对市场上所有 JavaScript MVC 框架,都不满意,就决定自己写 ...

  3. react组件卸载调用的方法_好程序员web前端培训分享React学习笔记(三)

    好程序员web前端培训分享React学习笔记(三),组件的生命周期 React中组件也有生命周期,也就是说也有很多钩子函数供我们使用, 组件的生命周期,我们会分为四个阶段,初始化.运行中.销毁.错误处 ...

  4. React学习笔记:入门案例

    React学习笔记:入门案例 React 起源于 Facebook 内部项目,因为市场上所有 JavaScript MVC 框架都不令人满意,公司就决定自己写一套,用来架设 Instagram 的网站 ...

  5. React学习笔记(五) 状态提升

    状态提升究竟是什么东西呢?别急,下面让我们一步一步来看看究竟要怎么使用状态提升 假设我们有这样一个需求,提供两个输入框(分别属于两个组件),保证输入框里面的内容同步 好,下面我们先来封装一个输入框组件 ...

  6. React学习笔记 - 组件Props

    React Learn Note 4 React学习笔记(四) 标签(空格分隔): React JavaScript 三.组件&Props 组件可以将UI切分成一些独立的.可复用的部件,这样你 ...

  7. React学习笔记八-受控与非受控组件

    此文章是本人在学习React的时候,写下的学习笔记,在此纪录和分享.此为第八篇,主要介绍非受控组件与受控组件. 目录 1.非受控组件 1.1表单提交案例 1.2案例的总结 2.受控组件 2.1受控组件 ...

  8. React学习笔记二:实现一个数字时钟

    <!DOCTYPE html> <html lang="zhm"><head><meta charset="UTF-8" ...

  9. React学习笔记_从create-react-app学习webpack

    从create-react-app学习webpack 更多干货 分布式实战(干货) spring cloud 实战(干货) mybatis 实战(干货) spring boot 实战(干货) Reac ...

最新文章

  1. oracle将多行转成多列,oracle 多行转多列查询
  2. softirq/tasklet/workqueue的区别
  3. Aspose.Cells.dll操作exel
  4. [No000022]他们说:得诺贝尔奖到底有多难?
  5. CWE 4.3:强化你的数据自我保护能力
  6. 易语言html实现报表打印,易语言报表统计功能例程可打印
  7. 【实习之T100开发(1),韩顺平Java视频教程百度云盘
  8. 大数据技术原理与应用(第八章HBase测试)
  9. reg文件导入注册表后出现中文乱码的解决方法
  10. Hexo | yilia主题安装
  11. k8s使用volume将ConfigMap作为文件或目录直接挂载_【大强哥-k8s从入门到放弃06】Secret详解...
  12. SSM框架中 出现的406 (Not Acceptable)
  13. 关于神经网络的轻量化
  14. 关于Debug.Log的一点儿小知识
  15. 更新或卸载VisualSVN时出现0x8004401e错误,或完全卸载VisualSVN
  16. kubernetes之探针
  17. 【朝花夕拾】Android自定义View篇之(十一)View的滑动,弹性滑动与自定义PagerView...
  18. python经典类和新式类_python中经典类和新式类的区别
  19. 读《STRENGTHNET: DEEP LEARNING-BASED EMOTION STRENGTH ASSESSMENT FOR EMOTIONAL SPEECH SYNTHESIS》
  20. 测试开发的瓶颈在哪儿?

热门文章

  1. Outlook邮箱添加163邮箱
  2. 3gpp 中的AAC和AMR
  3. 【微信小程序】搜索框样式
  4. h5移动端播放amr格式的音频文件兼容安卓IOS
  5. ⑤ESP8266 开发学习笔记_By_GYC 【ESP8266 IDF框架 使用C++编程】
  6. Swing文本域的编辑
  7. fluent旋转机械滑移网格法设置
  8. 怎么复制 Windows cmd 窗口命令行的信息
  9. [CubeMX]stm32通过wifi模块手机控制麦轮小车
  10. 接入微信、支付宝条码支付的正确姿势