1. 安装
npm install redux
npm install react-redux
npm install redux-thunk
2. store创建
import { createStore, applyMiddleware } from 'redux'
import reducer from './reducer'
import thunk from 'redux-thunk'
const store = createStore(reducer, applyMiddleware(thunk))
export default store
3. reducer函数
import * as actionTypes from './constants'
const initialState = {
counter: 0,
banners: [],
recommends: []
}
function reducer(state, action) {
switch(action.type) {
case: actionTypes.CHANGE_COUNTER:
return {...state, counter: state.counter + action.num}
case: actionTypes.CHANGE_BANNERS:
return {...state, banners: action.banners}
case: actionTypes.CHANGE_RECOMMENDS:
return {...state, recommends: action.recommends}
default:
return state
}
}
export default reducer
4. 常量文件constants
export const CHANGE_COUNTER = 'change_counter'
export const CHANGE_BANNERS = 'change_banners'
export const CHANGE_RECOMMENDS = 'change_recommends'
5. 在某个组件中使用
import React, { PureComponent } from "react"
import { connect } from 'react-redux'
export class Home extends PureComponent {
componentDidMount() {
this.props.fetchBannerList();
}
render() {
const { banners } = this.props
return (
<div className='wrap'>
<ul>
{
banners.map((item, index) => {
return <li key={index}>{item.title}</li>
})
}
</ul>
</div>
)
}
}
const mapStateToProps = (state) => ({
banners: state.banners
})
const mapDispatchToProps = (dispatch) => ({
fetchBannerList() {
console.log('Home组件在生命周期里该函数会被触发')
dispatch(fetchAsyncBannerAction())
}
}}
export default connect(mapStateToProps, mapDispatchToProps)(Home)
6. actionCreators.js
import * as actionTypes from './constants'
export function bannersAction(banners) {
return {
type: actionTypes.CHANGE_BANNERS,
banners
}
}
export function fetchAsyncBannerAction() {
return (dispatch, getState) => {
console.log('dispatch的时候该函数会自动执行')
axios.get("xxxxxxxx").then((res) => {
const banners = res.data.list
dispatch(bannersAction(banners))
})
}
}