redux(三)02-商品条目组件获取store数据-返回值会把数据提供给组件的props & 视图组件处理事件-将action进行分发

商品条目组件获取store数据-返回值会把数据提供给组件的props & 视图组件处理事件-将action进行分发

商品条目组件获取store数据
import { connect } from 'react-redux'

// 参数一:表示唯一的数据源store
// 参数二:表示组件的所有属性
function mapStateToProps (state, ownProps) {
  let num = state[ownProps.pname]
  // 该函数的返回值会把数据提供给组件的props
  return {
    num: num
  }
}

export default connect(mapStateToProps)(Item)
视图组件处理事件
let { handleSub, handleAdd, pname, num } = this.props
<div>
  <span>【{pname}】商品的数量是【{num}】</span>
  <button onClick={handleSub}>-</button>
  <button onClick={handleAdd}>+</button>
</div>
function mapDispachToProps(dispatch, ownProps) {
  return {
    increment: () => {
      // 发送action,先生成Action对象:
      let inAction = Actions.increment(ownProps.pname);
      // inAction实际上是对象{type:'increment':pname:'first'}
      dispatch(inAction);
    },
    decrement: () => {
      // 发送action
      let deAction = Actions.decrement(ownProps.pname);
      // inAction实际上是对象{type:'decrement':pname:'first'}
      dispatch(deAction);
    }
  }
}

实例

新建文件src/views/Item.js

/*
  商品列表组件
*/
import React from 'react'
import { connect } from 'react-redux'
// 导入创建Action的相关方法
import * as Actions from '../Actions.js'

// 傻瓜组件
function Item (props) {
  let { pname, num, handleSub, handleAdd } = props
  return (
    <div>
      <span>{pname}】商品数量数据是【{num}</span>
      <button onClick={handleSub}>-</button>
      <button onClick={handleAdd}>+</button>
    </div>
  )
}

// class Item extends React.Component {
//   // constructor (props) {
//   //   super(props)
//   //   this.state = {
//   //     num: 0
//   //   }
//   // }

//   // handleAdd = () => {
//   //   // 控制数据添加
//   //   this.setState({
//   //     num: this.state.num + 1
//   //   })
//   //   // 触发父组件中总数的修改
//   //   this.props.handleTotal(1)
//   // }

//   // handleSub = () => {
//   //   // 控制数据减少
//   //   let { num } = this.state
//   //   if (num > 1) {
//   //     this.setState({
//   //       num: num - 1
//   //     })
//   //     // 触发父组件中总数的修改
//   //     this.props.handleTotal(-1)
//   //   }
//   // }

//   render () {
//     let { pname, num, handleAdd, handleSub } = this.props
//     return (
//       <div>
//         <span>【{pname}】商品数量数据是【{num}】</span>
//         <button onClick={handleSub}>-</button>
//         <button onClick={handleAdd}>+</button>
//       </div>
//     )
//   }
// }
/*
  参数一表示唯一的数据源
  参数二表示组件本身的props
*/
function mapStateToProps (state, ownProps) {
  // 获取商品名称
  let pname = ownProps.pname
  // 根据商品名称获取state中对应的数量
  let num = state[pname]
  return {
    num: num
  }
}

/*
  处理事件:把事件处理函数映射到View组件中
  参数一用于进行acting分发
  参数二表示组件本身的props属性
*/
function mapDispachToProps (dispatch, ownProps) {
  return {
    // 这里要产生action,并且将action进行分发
    handleAdd: () => {
      let action = Actions.addProduction(ownProps.pname)
      dispatch(action)
    },
    handleSub: () => {
      let action = Actions.subProduction(ownProps.pname)
      dispatch(action)
    }
  }
}

// export default Item
export default connect(mapStateToProps, mapDispachToProps)(Item)

src/Actions.js文件

/*
  产生action

  action的本质其实就是一个普通对象,该对象描述了一个操作行为:
*/
import * as an from './ActionName.js'
// 用于产生一个添加商品数量的Action
export const addProduction = (production) => {
  return {
    type: an.ADD_ACTION,
    pname: production
  }
}

// 用于产生一个减少商品数量的Action
export const subProduction = (production) => {
  return {
    type: an.SUB_ACTION,
    pname: production
  }
}

src/ActionName.js

export const ADD_ACTION = 'add'
export const SUB_ACTION = 'sub'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值