react-redux的异步action跨域获取数据(中间件thunk以及redux-promise-middleware的使用)

react中跨域获取数据的过程

首先进行跨域的设置
在项目src目录下添加一个setupProxy.js的文件

const proxy = require("http-proxy-middleware");

module.exports = (app) => {
    app.use("/api", proxy({//api是随便写的
        target: "",//这里写要代理的地址必须写
        changeOrigin: true,
        pathRewrite: {
            "^/api": ""//将路径中的api替换掉
        }
    }))
}

这样跨域就可以了

接下来就是创建仓库保存数据了,这里用到了redux、redux-immutable、immutable以及redux-thunk
在src文件夹下创建store文件夹(类似于vue),在store目录下创建index.js
在这个里面使用redux的createStore()方法创建store仓库,里面的参数需要reducers,在这里我们是根据reducers中的state的只读的特点使用了immutable来创建的,他可以保证数据的只读性,如果想要了解immutable中数据的特点可以去看一下他的官网。

Reducers 指定了应用状态的变化如何响应 actions 并发送到 store 的,记住 actions 只是描述了有事情发生了这一事实,并没有描述应用如何更新 state。
处理 Reducer 关系时的注意事项
开发复杂的应用时,不可避免会有一些数据相互引用。建议你尽可能地把 state 范式化,不存在嵌套。把所有数据放到一个对象里,每个数据以 ID 为主键,不同实体或列表间通过 ID 相互引用数据。把应用的 state 想像成数据库。
上代码

import {
    createStore,
    applyMiddleware
} from "redux"; //引入创建仓库和使用中间件的方法
import {combineReducers} from "redux-immutable"//引入合并
import reducersa from "./reducers/a"  
  //引入reducersa.js
import reducersb from "./reducers/b" 
   //引入reducersa.js
import thunk from "redux-thunk"		
//引入thunk中间件处理异步action
import reduxPromiseMiddleware from "redux-promise-middleware"
 //引入redux-promise-middleware中间件处理异步action
//需要注意,以上两个中间件的action的要求不同,在下面以会详细介绍

const reducers = combineReducers({reducersa ,reducersb});
//将两个reducers合并

const store = createStore(reducers, applyMiddleware(reduxPromiseMiddleware));
//创建仓库并使用reducers以及使用中间件
export default store;

reducersa.j
reducersb.js与reducersa的结构一样只是里面的数据不同

import Immutable from "immutable"
//引入immutable对

const defaultState = Immutable.fromJS({
        val:"111"
})

export default (state=defaultState,action)=>{
  //要导出一个纯函数(输入一定,输出也一定)
    switch(action.type){
      // 根据action.type进行数据的操作,返回操作后的新的newState;
    }
    return state;
}

然后就到了页面进行操作的时候了
创建一个页面
在这里使用到了react-redux中的两大组件Provider 以及connect

App.js

import React, { Component } from 'react';
import {Provider} from "react-redux"
//引入provider 属性store会将数据添加到每一个组件中,在组件中通过connect函数获取数据
 import Com_Afrom "./components/Com_A"

import store from "./store"
//引入store

class App extends Component {
  render() {
    return (
      <Provider store={store}>
        <div>
        <Com_A/>
        </div>
     </Provider>
    )
  }
}

export default App;

Com_A.js组件

import React from "react"
import {connect} from "react-redux"
//在组件中引入connect来接受app.js传递的store

import { getData,getData2} from "../store/action/actionCreator"
引入getData以及getData2(这是两个action函数)

class ComA extends React.Component{

    render() {
        let { val} = this.props;
        return (
      			<div>
      				{val}
      			</div>
        )
    }
    componentDidMount() {
        this.props.handleData();
        //调用方法获取数据
    }


}
const mapStateToProps= (state)=>({
        val.getIn(["reducersa","val"])
})
const  mapDispatchToProps=(dispatch)=>({
    handleData() {
        // dispatch(getData());
			第一种方式使用的是redux-thunk直接调用getData(),使用thunk时他会检测到dispatch里面的参数是一个函数然后会在getData函数里面的到两个参数dispatch和getState在里面可以进行派发action,详细看一下actionCreator代码。
			
        getData2(dispatch);
     //   第二种方式使用的是redux-promise-middleware 将dispatch方法传过去,然后在函数里面派发action,详细看一下actionCreator代码。
        }
})
export default connect(mapStateToProps,mapDispatchToProps)(ComA);

ActionCreator.js

import { fetch } from 'whatwg-fetch';

export const getData = () => {
    let action = (data) => ({
        type: "GET_DATA",
        val: data
    });
    //action函数用来创建action
    return (dispatch, getState) => {
        let url = "";
        fetch(url).then((res)=>{
            return res.json();
        }).then((result)=>{
            dispatch(action(result));//派发action
        })
    }
}
export const getData2 =(dispatch)=>{
    dispatch({
    //里面的参数固定,必须是tyoe以及payload而且payload的值是一个promise对象
        type:"GET_DATA",
        payload:new Promise(resolve=>{
                        let url = "";
                        fetch(url).then((res)=>{
                            return res.json();
                        }).then((result)=>{
                            // console.log(result);
                           resolve( result)
                        })
        })
    })
}

最后在reducers里面就可以对数据进行修改了
记得数据类型是immutable类型的
还有一个方法是投机取巧就是在componentDIdMount生命周期里面进行数据的请求然后请求到数据后进行action的派发,over

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
最新版的 react-redux 使用方法如下: 首先,确保你的项目已经安装了 react-redux 依赖包。你可以使用以下命令安装它: ``` npm install react-redux ``` 或 ``` yarn add react-redux ``` 接下来,你需要创建一个 Redux store。你可以使用 Redux Toolkit 来简化这个过程。首先,导入 `configureStore` 和 `getDefaultMiddleware` 函数: ``` import { configureStore, getDefaultMiddleware } from '@reduxjs/toolkit'; ``` 然后,创建一个 rootReducer 来合并你的所有 reducer: ``` import { combineReducers } from 'redux'; const rootReducer = combineReducers({ // 这里是你的 reducer }); ``` 接着,使用 `configureStore` 函数创建 Redux store。你可以通过传入一个对象来配置 store,例如指定 reducer、middleware 等等。以下是一个示例: ``` const store = configureStore({ reducer: rootReducer, middleware: getDefaultMiddleware() }); ``` 现在,你可以使用 `<Provider>` 组件来将 Redux store 提供给你的整个应用程序。在你的根组件中,导入 `<Provider>` 组件和你的 Redux store,然后将其包裹在应用的最外层: ``` import { Provider } from 'react-redux'; ReactDOM.render( <Provider store={store}> <App /> </Provider>, document.getElementById('root') ); ``` 通过将 Redux store 提供给整个应用程序,你可以在应用的任何地方使用 `useSelector` 和 `useDispatch` 钩子来访问 Redux store 中的状态和分发 action。例如,在你的组件中,你可以这样使用: ``` import { useSelector, useDispatch } from 'react-redux'; const MyComponent = () => { const counter = useSelector(state => state.counter); const dispatch = useDispatch(); // 使用 counter 和 dispatch }; ``` 这就是最新版的 react-redux使用方法。你可以根据你的具体需求,自定义配置和使用其他相关的 react-redux API。希望对你有帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值