react闲谈——10分钟学会react-redux异步
你可以结合这份redux官方的异步源码来看:Redux Async Example 一、选择一种你喜欢的异步方案,fetch,jQuery,或者是我正在使用的axios npm i --save-dev axios 2、新建一个fetchData.js文件,封装基本的post和get接口。axios官方还提供了很多配置选项,比如超时配置等。 import axios from 'axios' //BASE_URL是默认的url地址,如果你安装了webpack,可以在webpack配置全局变量 axios.defaults.baseURL = BASE_URL; /* 如果没有安装webpack,就使用下面这种写法 axios.defaults.baseURL = http://ip:端口 */ export const getData = (url,param) => { return ( axios.get(`${url}`) ) } export const postData = (url,param) => { return ( axios.post(`${url}`,param) ) } 3、你的异步代码将写在action。 //导入fetchData文件 import { getData,postData } from './fetchData' //返回一个action对象,用来关联对应的reducer,将data保存到store。 const saveReducer = (data) => ({ type: 'SAVE_REDUCER',data }) //get接口测试,传入一个参数id,请求/test/:id接口,返回response并且将数据通过指定的action保存到store。 export const getTest = (id) => async (dispatch,getState) => { try { let response = await getData(`/test/${id}`) await dispatch(saveReducer(response.data)) } catch (error) { console.log('error: ',error) } } /* post接口测试,params参数格式 let params = { id: 23 } */ export const postTest = (params) => async (dispatch,getState) => { try { let response = await postData(`/test`,params) await dispatch(saveReducer(response.data)) } catch (error) { console.log('error: ',error) } } 4、在reducer中定义action type保存data。 //注意,这里不需要再import action了。 //定义一个初始化状态的state,假设现在有一个空数组testData let initState = { testData: [] } //定义一个叫做test的reducer,更新state。 export function test(state = initState,action) { switch (action.type) { case 'SAVE_REDUCER': return { ...state,testData: action.data } default: return state; } } 5、现在你还需要定义一个store的配置文件,把reducer合并成store,并且关联action。 import { createStore,applyMiddleware } from 'redux'; import thunkMiddleware from 'redux-thunk'; import createLogger from 'redux-logger'; import rootReducer from './reducers'; let createStoreWithMiddleware; // store负责管理所有reducer,module.hot.accept表示支持热更新 const logger = createLogger({ collapsed: true }); createStoreWithMiddleware = applyMiddleware( thunkMiddleware,logger )(createStore); export default function configureStore(initialState) { const store = createStoreWithMiddleware(rootReducer,initialState); if (module.hot) { module.hot.accept('./reducers',() => { const nextRootReducer = require('./reducers/index'); store.replaceReducer(nextRootReducer); }); } return store; } 6、单向数据流部分现在已经完成了,接着就在组件触发action去异步请求服务器的数据,返回给前端,然后action会自动把数据保存到内存store中。 import React,{ Component } from 'react'; import { bindActionCreators } from 'redux'; import { connect } from 'react-redux'; /*actions*/ import * as testActions from 'action/test'; //让组件关联state和action @connect( state => state,dispatch => bindActionCreators({testActions},dispatch) ) export default class Home extends React.Component { constructor(props) { super(props); } componentWillMount() { let params = { id: 23 } this.props.postTest(params) //发送post请求 let id = 23 this.props.getTest(id) //发送get请求 } render() { return( <div> {/*你的dom*/} </div> ); } } 7、如果你的异步是click或者hover之类的事件触发的,则只需要通过事件绑定来发送action就行了。 <div onClick={() => this.props.getTest(id)}> </div> 还有更多需求 ,可以看看 react-redux-webpack架构 提问环节: 小白:你骗人,你就是个骗子,我看完这篇文章花了11分钟,为什么要写10分钟学会? 。。。 我:。。。下课。。。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 强大的正则表达式
- 使用Unity依赖注入的时候,最上层的类是Resolve还是New的问
- xml – java.lang.NoSuchMethodError:org.springframework
- Swift 4:使用Codable`通用参数’T’无法推断
- c# – 按int []定义的顺序迭代List的最快方法
- Cocos2d-x 3.0 开发(七)在程序中处理cocoStudio导出动画
- ruby-on-rails – Postgres Rails适配器正在考虑Bigint / V
- cocos2dx使用python创建项目
- c# – 从WPF / XBAP应用程序检测网络连接?
- React Native集成极光推送