美文网首页
React:react-redux及redux-thunk的使用

React:react-redux及redux-thunk的使用

作者: 春暖花已开 | 来源:发表于2021-01-28 11:58 被阅读0次

    安装标题上的两个库。

      1. 在App的index.js里增加如下代码:
    import React from 'react'
    import ReactDOM from 'react-dom'
    import App from './App'
    + import { Provider } from 'react-redux'
    + import store from './store'
    
    ReactDOM.render(
    +  <Provider store={store}>
        <App />
    +  </Provider>,
      document.getElementById('root')
    )
    
      1. 创建4个文件:index.js、actionCreators.js、constants.js、reducer.js

    index.js

    import { createStore, applyMiddleware, compose } from 'redux'
    import thunkMiddleware from 'redux-thunk'
    
    import reducer from './reducer.js'
    
    const composeEnhancers = /*window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({ trace: true }) ||*/ compose
    
    const storeEnhancer = applyMiddleware(thunkMiddleware)
    const store = createStore(reducer, composeEnhancers(storeEnhancer))
    
    export default store
    

    actionCreators.js

    import axios from 'axios'
    import { ADD_NUMBER, SUB_NUMBER, CHANGE_BANNERS, CHANGE_RECOMMENDS } from './constants'
    
    export const addAction = num => ({
      type: ADD_NUMBER,
      num
    })
    
    export const subAction = num => ({
      type: SUB_NUMBER,
      num
    })
    
    export const changeBannerAction = banner => ({
      type: CHANGE_BANNERS,
      banner
    })
    
    export const changeRecommendAction = recommend => ({
      type: CHANGE_RECOMMENDS,
      recommend
    })
    
    export const getRemoteDataAction = dispatch => {
      axios.get('http://123.207.32.32:8000/home/multidata').then(res => {
        const data = res.data.data
        dispatch(changeBannerAction(data.banner.list))
        dispatch(changeRecommendAction(data.recommend.list))
      })
    }
    

    constants.js

    const ADD_NUMBER = 'ADD_NUMBER'
    const SUB_NUMBER = 'SUB_NUMBER'
    const CHANGE_BANNERS = 'CHANGE_BANNERS'
    const CHANGE_RECOMMENDS = 'CHANGE_RECOMMENDS'
    
    export { ADD_NUMBER, SUB_NUMBER, CHANGE_BANNERS, CHANGE_RECOMMENDS }
    

    reducer.js

    import { ADD_NUMBER, SUB_NUMBER, CHANGE_BANNERS, CHANGE_RECOMMENDS } from './constants'
    
    const defaultState = {
      counter: 0,
      banner: [],
      recommend: []
    }
    
    function reducer(state = defaultState, action) {
      switch (action.type) {
        case ADD_NUMBER:
          return { ...state, counter: state.counter + action.num }
        case SUB_NUMBER:
          return { ...state, counter: state.counter - action.num }
        case CHANGE_BANNERS:
          return { ...state, banner: action.banner }
        case CHANGE_RECOMMENDS:
          return { ...state, recommend: action.recommend }
        default:
          return state
      }
    }
    
    export default reducer
    
      1. 组件内使用

    home.js

    import React, { PureComponent } from 'react'
    import { connect } from 'react-redux'
    import { addAction, subAction, getRemoteDataAction } from './store/actionCreators'
    
    class Home extends PureComponent {
      componentDidMount() {
        this.props.getRemoteData()
      }
    
      render() {
        return (
          <div>
            <h2>当前计数: {this.props.counter}</h2>
            <button onClick={this.props.increment}>+1</button>
            <button onClick={this.props.decrement}>-1</button>
          </div>
        )
      }
    }
    
    const mapStateToProps = state => ({
      counter: state.counter
    })
    
    const mapDispatchToProps = dispatch => ({
      increment() {
        dispatch(addAction(1))
      },
      decrement() {
        dispatch(subAction(1))
      },
      getRemoteData() {
        dispatch(getRemoteDataAction)
      }
    })
    
    export default connect(mapStateToProps, mapDispatchToProps)(Home)
    

    about.js

    import React, { PureComponent } from 'react'
    import { connect } from 'react-redux'
    
    import { addAction, subAction } from './store/actionCreators'
    
    class About extends PureComponent {
      render() {
        return (
          <div>
            <h2>当前计数: {this.props.num}</h2>
            <button onClick={this.props.add}>+2</button>
            <button onClick={this.props.sub}>-2</button>
    
            <h2>banner</h2>
            <ul>
              {this.props.banner.map(item => {
                return <li key={item.acm}>{item.title}</li>
              })}
            </ul>
    
            <h2>recommend</h2>
            <ul>
              {this.props.recommend.map(item => {
                return <li key={item.acm}>{item.title}</li>
              })}
            </ul>
          </div>
        )
      }
    }
    
    const mapStateToProps = state => ({
      num: state.counter,
      banner: state.banner,
      recommend: state.recommend
    })
    
    const mapDispatchToProps = dispatch => ({
      add() {
        dispatch(addAction(2))
      },
      sub() {
        dispatch(subAction(2))
      }
    })
    
    export default connect(mapStateToProps, mapDispatchToProps)(About)
    

    参考:王老师的react。

    相关文章

      网友评论

          本文标题:React:react-redux及redux-thunk的使用

          本文链接:https://www.haomeiwen.com/subject/gjiazktx.html