页面三种状态 success , request, failure
import React from 'react';import {connect} from 'react-redux'import {bindActionCreators} from 'redux'import * as userActions from '../actions/user'class User extends React.Component{render() {let {error, isFetching, user} = this.props.userlet dataif (error) {data = error} else if (isFetching) {data='loading....'} else {console.log(this.props.user.userInfo)data = user.title}return (<div className='container' ><p className='text-center'>我是 user {this.props.name}</p><p className='text-center'>userInfo: {data}</p><button onClick={() => this.props.userActions.getUser()}>获取数据</button></div>)}}const mapStateToProps = (state) => {// console.log(state)return {user: state.user}}const mapDispatchToProps = (dispatch) => {return {userActions: bindActionCreators(userActions, dispatch)}}export default connect(mapStateToProps, mapDispatchToProps)(User)
- actions/index.js
import {FETCH_USER, FETCH_FAILURE, FETCH_SUCCESS,FETCH_REQUEST} from '../constants'export function fetchUser(user) {return {type: FETCH_SUCCESS,user}}export function fetchRequest() {return {type: FETCH_REQUEST}}export function fetchFailure(error) {return {type: FETCH_FAILURE,error}}// 触发函数执行一定要用dispatchexport const getUser = () => {return dispatch => {dispatch(fetchRequest())fetch('https://douban.uieee.com/v2/movie/in_theaters').then(res => res.json()).then(data => {dispatch(fetchUser(data))}).catch(err => {// console.log(err)dispatch(fetchFailure(err))})}}
- reducer/user.js
import {FETCH_USER, FETCH_SUCCESS, FETCH_FAILURE,FETCH_REQUEST} from '../constants'// reducer是个纯函数, 改变store数据的// 数据在action 中// 改变对象const initState = {user: {title: 1},isFetching: false,error: null}// state 只读的,必须返回一个新对象const counter = (state = initState, action) => {switch(action.type) {case FETCH_SUCCESS:return {isFetching: false,error: null,user: action.user}case FETCH_REQUEST:return {isFetching: true,error: null,user: {}}case FETCH_FAILURE:return {isFetching: false,error: action.error,user: {}}default:return state}}export default counter
- 组件中使用
import React from 'react';import {connect} from 'react-redux'import {bindActionCreators} from 'redux'import * as userActions from '../actions/user'class User extends React.Component{render() {let {error, isFetching, user} = this.props.userlet dataif (error) {data = error} else if (isFetching) {data='loading....'} else {console.log(this.props.user.userInfo)data = user.title}return (<div className='container' ><p className='text-center'>userInfo: {data}</p><button onClick={() => this.props.userActions.getUser()}>获取数据</button></div>)}}const mapStateToProps = (state) => {// console.log(state)return {user: state.user}}const mapDispatchToProps = (dispatch) => {return {userActions: bindActionCreators(userActions, dispatch)}}export default connect(mapStateToProps, mapDispatchToProps)(User)
