redux

106 阅读1分钟

项目中使用redux react-redux redux-thunk

1.先安装依赖

npm i redux react-redux redux-thunk

2.创建store文件夹

image.png

2.1 index.js

import {
  legacy_createStore as createStore,
  applyMiddleware,
  compose,
} from "redux";

import reducers from "./reducer";
import thunk from "redux-thunk";

// 对redux-devtools工具的设置
const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;

const store = createStore(reducers, composeEnhancers(applyMiddleware(thunk)));

export default store;

2.2 reducer.js 对分割的reducer进行合并

import { combineReducers } from "redux";

import { reducer as recommendReducer } from "@/pages/discover/c-pages/recommend/store";

const reducers = combineReducers({
  recommend: recommendReducer,
});

export default reducers;

3.对创建出来的store进行使用

import { Provider } from "react-redux";
import store from "./store";

const App = memo(() => {
  return (
    <div>
      <Provider store={store}>
        <xxx />
      </Provider>
    </div>
  );
});

export default App;

4.创建每个组件独有的store文件夹

image.png

4.1 actionCreator.js 保存对个action,redux-thunk的函数也在放里面

import * as actionTypes from "./constants";
import { getTopBanners } from "@/services/recommend";
// action
const changeTopBannerAction = (banners) => ({
  type: actionTypes.CHANGE_TOP_BANNER,
  banners,
});
// redux-thunk的函数
export const getTopBannerAction = () => {
  return (dispatch) => {
    getTopBanners().then((res) => {
      dispatch(changeTopBannerAction(res.banners));
    });
  };
};

4.2 constants.js 保存action的常量

export const CHANGE_TOP_BANNER = "CHANGE_TOP_BANNER";

4.3 index.js 对reducer进行导出

4.4 reducer.js 独有的reducer

import * as actionTypes from "./constants.js";

const defaultState = {
  topBanners: [],
};

function reducer(state = defaultState, action) {
  switch (action.type) {
    case actionTypes.CHANGE_TOP_BANNER:
      return { ...state, topBanners: action.banners };

    default:
      return state;
  }
}

export default reducer;

5.在组价中进行使用

5.1 connect的使用

import React, { memo, useEffect } from "react";

import { getTopBannerAction } from "./store/actionCreators";

import { connect } from "react-redux";

const Recommend = memo((props) => {
  const { getBanner, topBanners } = props;
  useEffect(() => {
    getBanner();
  }, [getBanner]);

  return <div>Recommend: {topBanners.length}</div>;
});

const mapStateToProps = (state) => ({
  topBanners: state.recommend.topBanners,
});

const mapDispatchToProps = (dispatch) => ({
  getBanner: () => {
    dispatch(getTopBannerAction());
  },
});

export default connect(mapStateToProps, mapDispatchToProps)(Recommend);

5.2 hooks的使用

import React, { memo, useEffect } from "react";
import { useDispatch, useSelector, shallowEqual } from "react-redux";

import { getTopBannerAction } from "./store/actionCreators";

const Recommend = memo((props) => {
  // 组件和redux关联: 获取数据和进行操作
  // useSelector对state进行操作,参数二: 性能优化(浅层比较)
  const { topBanners } = useSelector(
    (state) => ({
      topBanners: state.recommend.topBanners,
    }),
    shallowEqual
  );
  const dispatch = useDispatch();

  // 发送网络请求
  useEffect(() => {
    dispatch(getTopBannerAction());
  }, [dispatch]);

  return <div>Recommend: {topBanners.length}</div>;
});

export default Recommend;