37.React redux的使用(2) - yiqunkeke/react-jianshu-shangguigu-zty GitHub Wiki

使用react-redux

  • 安装 react-redux
yarn add react-redux

// 或者npm
npm i react-redux
  • 创建store
    import {createStore} from 'redux'
    import reducer from './reducer'

    const store = createStore(reducer)

    export default store
  • 创建reducer
   const defaultState = {
      inputValue: '',
      list: []
   }
   export default (state = defaultState, action) => {
      return state
   }
  • index.js入口文件中
   import React from 'react'
   import ReactDOM from 'react-dom'
   import TodoList from './TodoList'
   import { Provider } from 'react-redux'
   import store from './store'
   
   const App = (
    // Provider提供器连接了store,则Provider内部的所有组件就都有能力获取到store中的内容了
    <Provider store={store}>
        <TodoList/>
    </Provider>
   )
   
   ReactDOM.render(App, document.getElementById('root'))
   
  • 组件中使用store中数据
   import React, {Component} from 'react'
   import stroe from './store'
   import { connect } from 'react-redux'

   class TodoList extends Component {
      render() {
        reture (
         // 3.这里使用 this.props.inputValue就可以直接调用到store中的inputValue
         // 以前不使用react-redux时(只使用redux),我们在使用store数据的时候, 当store数据改变的时候,我们还需要在组件中订阅store.
         // 现在【使用了react-redux,当store中的数据发生了变化时,组件会自动跟着变化】。
         <input value={this.props.inputValue} onChange={this.props.changeInputValue}/>
        )
      }
   }
   
   // 2.连接规则:把store里面的数据映射到组件的props
   const mapStateToProps = (state) => {
      // state 指的就是store里数据
      return {
         inputValue: state.inputValue
      }
    }
  
   // 4.把changeInputValue方法写在mapDispatchToProps的原因是:
     // 这个方法要去改变store中的内容,也就是说要去派发action,而mapDispatchToProps里面就有现成的dispatch方法。
    // 所以,我们把changeInputValue方法写在这里。
   const mapDispatchToProps = (dispatch) => {
      // dispatch方法指的就是store.dispatch()
      return {
          changeInputValue(e) {
             // dispatch() // 可以直接调用dispatch来改变store中的数据
             console.log(e.target.value)
             
             const action = {
                type: 'change_input_value'
                value: e.target.value
             }
             dispatch(action)
          }
      }
   }
   
   export default connect(mapStateToProps, mapDispatchToProps)(TodoList)
   // 1.connect()方法作用:让TodoList 组件和store进行连接
   // 同时符合mapStateToProps和 mapDispatchToProps这两个映射关系
   // 第一个映射关系是用来映射数据的
   // 第二个映射关系是让store.dispatch映射到了props上

总结:

  • react-redux 两个核心API: Provider 和 connect

  • connect 是做连接----> 谁和谁做连接? TodoList组件与store做连接

  • 怎么做连接?--->mapStateToProps是连接规则。其中参数state指的是store里的数据。把state里面的数据映射到组件的props里面

  • 使用store数据----就可以直接使用 this.props.xxx来使用

重点:

  • react-redux不是redux的内置,所以需要单独安装。而且一般react-redux会与redux一起使用
⚠️ **GitHub.com Fallback** ⚠️