react闲谈——10分钟学会react-redux异步

前端之家收集整理的这篇文章主要介绍了react闲谈——10分钟学会react-redux异步前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

你可以结合这份redux官方的异步源码来看:Redux Async Example

一、选择一种你喜欢的异步方案,fetch,jQuery,或者是我正在使用的axios
1、安装axios插件

  1. npm i --save-dev axios

2、新建一个fetchData.js文件,封装基本的post和get接口。axios官方还提供了很多配置选项,比如超时配置等。

  1. import axios from 'axios'
  2. //BASE_URL是默认的URL地址,如果你安装了webpack,可以在webpack配置全局变量
  3. axios.defaults.baseURL = BASE_URL;
  4. /*
  5. 如果没有安装webpack,就使用下面这种写法
  6. axios.defaults.baseURL = http://ip:端口
  7. */
  8.  
  9. export const getData = (url,param) => {
  10. return (
  11. axios.get(`${url}`)
  12. )
  13. }
  14.  
  15. export const postData = (url,param) => {
  16. return (
  17. axios.post(`${url}`,param)
  18. )
  19. }

3、你的异步代码将写在action。

  1. //导入fetchData文件
  2. import { getData,postData } from './fetchData'
  3.  
  4. //返回一个action对象,用来关联对应的reducer,将data保存到store。
  5. const saveReducer = (data) => ({
  6. type: 'SAVE_REDUCER',data
  7. })
  8.  
  9. //get接口测试,传入一个参数id,请求/test/:id接口,返回response并且将数据通过指定的action保存到store。
  10. export const getTest = (id) => async (dispatch,getState) => {
  11. try {
  12. let response = await getData(`/test/${id}`)
  13. await dispatch(saveReducer(response.data))
  14. } catch (error) {
  15. console.log('error: ',error)
  16. }
  17. }
  18.  
  19. /*
  20. post接口测试,params参数格式
  21. let params = {
  22. id: 23
  23. }
  24. */
  25. export const postTest = (params) => async (dispatch,getState) => {
  26. try {
  27. let response = await postData(`/test`,params)
  28. await dispatch(saveReducer(response.data))
  29. } catch (error) {
  30. console.log('error: ',error)
  31. }
  32. }

4、在reducer中定义action type保存data。

  1. //注意,这里不需要再import action了。
  2. //定义一个初始化状态的state,假设现在有一个空数组testData
  3. let initState = {
  4. testData: []
  5. }
  6.  
  7. //定义一个叫做test的reducer,更新state。
  8. export function test(state = initState,action) {
  9. switch (action.type) {
  10. case 'SAVE_REDUCER':
  11. return {
  12. ...state,testData: action.data
  13. }
  14.  
  15. default:
  16. return state;
  17. }
  18. }

5、现在你还需要定义一个store的配置文件,把reducer合并成store,并且关联action。

  1. import { createStore,applyMiddleware } from 'redux';
  2. import thunkMiddleware from 'redux-thunk';
  3. import createLogger from 'redux-logger';
  4. import rootReducer from './reducers';
  5.  
  6. let createStoreWithMiddleware;
  7. // store负责管理所有reducer,module.hot.accept表示支持热更新
  8. const logger = createLogger({ collapsed: true });
  9. createStoreWithMiddleware = applyMiddleware(
  10. thunkMiddleware,logger
  11. )(createStore);
  12.  
  13. export default function configureStore(initialState) {
  14. const store = createStoreWithMiddleware(rootReducer,initialState);
  15. if (module.hot) {
  16. module.hot.accept('./reducers',() => {
  17. const nextRootReducer = require('./reducers/index');
  18. store.replaceReducer(nextRootReducer);
  19. });
  20. }
  21. return store;
  22. }

6、单向数据流部分现在已经完成了,接着就在组件触发action去异步请求服务器的数据,返回给前端,然后action会自动把数据保存到内存store中。

  1. import React,{ Component } from 'react';
  2. import { bindActionCreators } from 'redux';
  3. import { connect } from 'react-redux';
  4.  
  5. /*actions*/
  6. import * as testActions from 'action/test';
  7.  
  8. //让组件关联state和action
  9. @connect(
  10. state => state,dispatch => bindActionCreators({testActions},dispatch)
  11. )
  12. export default class Home extends React.Component {
  13.  
  14. constructor(props) {
  15. super(props);
  16. }
  17.  
  18. componentWillMount() {
  19. let params = {
  20. id: 23
  21. }
  22. this.props.postTest(params) //发送post请求
  23. let id = 23
  24. this.props.getTest(id) //发送get请求
  25. }
  26.  
  27. render() {
  28. return(
  29. <div>
  30. {/*你的dom*/}
  31. </div>
  32. );
  33. }
  34. }

7、如果你的异步是click或者hover之类的事件触发的,则只需要通过事件绑定来发送action就行了。

  1. <div onClick={() => this.props.getTest(id)}>
  2.  
  3. </div>

还有更多需求 ,可以看看 react-redux-webpack架构

提问环节:

小白:你骗人,你就是个骗子,我看完这篇文章花了11分钟,为什么要写10分钟学会?

。。。

我:。。。下课。。。

猜你在找的React相关文章