react-redux的学习

react,taro看的头晕眼花,慢慢记录一些吧。今天记录下react-redux:

ReactDOM.render(
  <Provider store={store}>
    <App />
  </Provider>,
  document.getElementById('root')
)

  先看这里,在render渲染方法里有一个Provider组件。这是react-redux所提供的一个组件。目的是为了能让容器组件App拿到state.

那么容器组件是怎么生成的呢。通过connect方法:

import { Provider, connect } from 'react-redux'
//  传入上面两个函数参数,将Counter组件变为App组件
const App = connect(
  mapStateToProps,
  mapDispatchToProps
)(Counter)

  这里的App就是容器组件。这里connect方法里接收了两个参数,用来将Counter这个UI组件变为容器组件。

这两个参数,第一个mapStateToProps负责数据到ui的工作,第二个负责UI到数据的工作。双向处理,可以理解。

//  将state映射到Counter组件的props
function mapStateToProps(state) {
  return {
    value: state.count
  }
}

//  将action映射到Counter组件的props
function mapDispatchToProps(dispatch) {
  return {
    onIncreaseClick: () => dispatch(increaseAction)
  }
}

  这里App容器组件已经有了,那么就要创建store了。是用reducer的函数通过createStore()去创建store.

// 根据reducer函数通过createStore()创建store
const store = createStore(counter)

  这里接收一个参数。这个参数是一个函数。这个函数是基于旧的state根据action,去返回一个新的state:

// Reducer   基于原有state根据action得到新的state
function counter(state = { count: 0 }, action) {
  const count = state.count
  switch (action.type) {
    case 'increase':
      return { count: count + 1 }
    default:
      return state
  }
}

  这样的话,store我们也有了。那么我们就要创建这里的参数action了:

// Action  
const increaseAction = { type: 'increase' }

  在上面的mapDispatchToProps中,有这样一句代码

dispatch(increaseAction)。这里就是说,当UI数据改变的时候。会发送一个increaseAction.而这个action.他的type是incease。在上面的方法counter中也就有了处理。

那么我们如何把UI数据改变事件与这一切建立联系呢?

// 定义counter组件
class Counter extends Component {
  render() {
    const { value, onIncreaseClick } = this.props
    // const value = this.props.value
    return (
      <div>
        <span>{value}</span>
        <button onClick={onIncreaseClick}> +1</button>
      </div>
    )
  }
}

  可以看到我们在UI组件Counter中。建立了关联。cont { value, onIncreaseClick } = this.props.

来看下完整的自定义计时器代码:

import React, { Component } from 'react'
import PropTypes from 'prop-types'   //类型检查
import ReactDOM from 'react-dom'
import { createStore } from 'redux'
import { Provider, connect } from 'react-redux'

// 定义counter组件
class Counter extends Component {
  render() {
    const { value, onIncreaseClick } = this.props
    // const value = this.props.value
    return (
      <div>
        <span>{value}</span>
        <button onClick={onIncreaseClick}> +1</button>
      </div>
    )
  }
}
//对Counter组件接受的props进行类型检查
Counter.propTypes = {
  value: PropTypes.number.isRequired,   //要求数字类型,没有提供会警告
  onIncreaseClick: PropTypes.func.isRequired //要求函数类型
}

// Action  
const increaseAction = { type: 'increase' }

// Reducer   基于原有state根据action得到新的state
function counter(state = { count: 0 }, action) {
  const count = state.count
  switch (action.type) {
    case 'increase':
      return { count: count + 1 }
    default:
      return state
  }
}

// 根据reducer函数通过createStore()创建store
const store = createStore(counter)

//  将state映射到Counter组件的props
function mapStateToProps(state) {
  return {
    value: state.count
  }
}

//  将action映射到Counter组件的props
function mapDispatchToProps(dispatch) {
  return {
    onIncreaseClick: () => dispatch(increaseAction)
  }
}

//  传入上面两个函数参数,将Counter组件变为App组件
const App = connect(
  mapStateToProps,
  mapDispatchToProps
)(Counter)

ReactDOM.render(
  <Provider store={store}>
    <App />
  </Provider>,
  document.getElementById('root')
)

  

代码来源于:https://www.jianshu.com/p/ad7eddb23d66

posted @ 2020-10-09 15:14  呼啸而过  阅读(141)  评论(0编辑  收藏  举报