Skip to content
{}

进阶知识 - reac-redux

react-redux

安装

npm i react-redux

使用方法

利用 react-redux 身上的两个组件(Provider,connecst)来完成全局redux数据交互, provider用于分发全局store, connect 用于将接收组件转化成高阶-容器组件,有两个参数一个回调函数:用来接收全局store,并需要返回数据,一个对象:用来写入操作Dispatch的属性方法。connect容器组件 利用props传参的方式,供接收组件使用

  • Provider: 供应商组件 用于分发全局的store参数 供 connect容器组件 接收使用;
import { Provider } from "react-redux"; 
 import store from "../Redux/store";
 <Provider store={store}> 根组件 </Provider>
  • connect: 高级容器组件,用于将接收方组件变成容器组件,就可以用props接收数据|方法并操作。两个参数:回调参数,对象,调用返回一个函数,将组件当参数传入进入并调用该方法,就可以获得一个高阶容器组件

    • 1. 回调函数 回调函数接收一个形参(全局的store),函数内部需要返回一个对象,对象就是接收组件内部需要用到的store数据,组件内部props接收使用
    • 2. 对象 对象的属性是需要操作的dispatch方法,省去使用dispatch,直接调用方法就可以了,组件内部props接收使用
    • connect(function,object)返回值 调用会返回一个函数,这个函数接收一个参数,就是我们需要操作的组件,调用该函数,就可以获得一个高阶容器组件,组件内部就可以用props操作数据了

小demo

<!-- store.jsx -->
import { applyMiddleware, createStore, combineReducers, compose } from "redux";
import thunk from "redux-thunk"; //配置thunk形式
import promise from "redux-promise"; //配置promise形式
import { HomeReducer } from "./Reducers/Home";
const Reducer = combineReducers({ HomeReducer }); // reducer模块化合并,将模块化的reducer 合并成一个大Reducer
//配置 redux-devtools 可视化追踪工具
const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;
// 导出Store
export default createStore(
  Reducer,
  composeEnhancers(applyMiddleware(thunk, promise))
);


<!-- /Reducers/Home.jsx -->
let data = { status: true, list: [] };
export const HomeReducer = (oldData = data, action) => {
  let newData = { ...oldData };
  switch (action.type) {
    case "show":
      newData.status = true;
      return newData;
    case "hide":
      newData.status = false;
      return newData;
    case "Newlist":
      newData.list = action.newList;
      return newData;
    case "remove":
      newData.list = [];
      return newData;
    default:
      return newData;
  }
};


<!-- action.jsx -->
import axios from "axios";
export const TextShow = () => {
  return {
    type: "show",
  };
};
export const TextHide = () => {
  return {
    type: "hide",
  };
};
// react-thunk写法
export const NewListThunk = () => {
  return (dispatch) => {
    axios
      .get(
        "/api/mmdb/movie/v3/list/hot.json?ct=%E9%B9%A4%E5%A3%81&ci=239&channelId=4"
      )
      .then((res) => {
        dispatch({ type: "Newlist", newList: res.data.data.hot });
      });
  };
};
// react-promise 写法
export const NewListPromise = () => {
  return axios
    .get(
      "/api/mmdb/movie/v3/list/hot.json?ct=%E9%B9%A4%E5%A3%81&ci=239&channelId=4"
    )
    .then((res) => {
      return { type: "Newlist", newList: res.data.data.hot };
    });
};
// 清空
export const delectList = () => {
  return { type: "remove" };
};



<!-- /Redux/Home.jsx文件 -->
import { connect } from "react-redux";
import {
  TextShow,
  TextHide,
  NewListThunk,
  NewListPromise,
  delectList,
} from "../../Redux/action";
import { useEffect, useMemo } from "react";
const Home = (props) => {
  console.log(props);
  let {
    status,
    list,
    TextShow,
    TextHide,
    NewListThunk,
    NewListPromise,
    delectList,
  } = props;
  useEffect(() => {
    if (props.list.length == 0) {
      NewListThunk();
    }
  }, []);
  const newList = useMemo(() => {
    return list.map((item) => <li key={item.id}>{item.nm}</li>);
  }, [list]);
  return (
    <div>
      <div>{status && "内容"}</div>
      <button
        onClick={() => {
          TextShow();
        }}
      >
        显示文本
      </button>
      <button
        onClick={() => {
          TextHide();
        }}
      >
        隐藏文本
      </button>

      <div>
        <ul>{newList}</ul>
        <button
          onClick={() => {
            NewListThunk();
          }}
        >
          react-thunk方式获取
        </button>
        <button
          onClick={() => {
            NewListPromise();
          }}
        >
          react-promise方式获取
        </button>
        <button
          onClick={() => {
            delectList();
          }}
        >
          清空
        </button>
      </div>
    </div>
  );
};

const mapStateToProps = (state) => {
  return {
    ...state.HomeReducer,
  };
};
const mapDispacthToProps = {
  TextShow,
  TextHide,
  NewListThunk,
  NewListPromise,
  delectList,
};
export default connect(mapStateToProps, mapDispacthToProps)(Home);
// connect调用会返回一个函数,返回的函数需要传入一个组件,再次调用就可以将我们的组件变成高阶组件 - 容器组件
// connect需要两个参数,一个回调函数 跟 对象
// 回调函数需要内部需要return你需要传入你组件内需要的状态数据
// 对象里面定义你需要dispatch操作的方法 直接调用 无需在dispatch  connect帮您自动dispatch


<!-- /App.jsx文件 -->
import React from 'react';
import ReactDom from 'react-dom';
import { Provider } from "react-redux";
import store from "../Redux/store";
import Home from "./home";
const App = () => {
  return (
    <Provider store={store}>
      <Home />
    </Provider>
  );
};
ReactDom.render(<App />,document.getElementById('root'))

好好加油吧,少年!