redux使用简单优化

一 目前项目使用方式:connect注入

在对函数式组件可使用connect,也可使用hook是引入import { useSelector, useDispatch } from “react-redux”;

dispatch({
        type: `${currentModel}/overrideStateProps`,
        payload: {
            number: 3,
        },
    });
    类似写法也可以在actives进行配置,基于umi写法习惯,一般直接声明active调用即可,但要确保命名空间唯一
import logo from "./logo.svg";
import "./App.css";
// import { connect } from "react-redux";
import { useSelector, useDispatch } from "react-redux";
import * as userActions from "./redux/actions/userActions";
import * as namespaces from "./redux/actions/namespaces";
const currentModel = namespaces.USER;
function App(props) {
    console.log(props);
    const dispatch = useDispatch();
    const { number, userInfo } = useSelector((state) => state.userReducers);
    console.log("number:", number, userInfo);
    const add = () => {
        console.log(99);
        dispatch({
            type: `${currentModel}/overrideStateProps`,
            payload: {
                number: 3,
            },
        });
    };
    const updatTeState = () => {
        dispatch({
            type: `${currentModel}/updateStateProps`,
            payload: {
                name: "userInfo",
                value: {
                    name: "修改对象",
                    name2: "修改对象33",
                },
            },
        });
    };
    const sagaTest = () => {
        console.log(44);
        dispatch({
            type: "USER/USER_LIST_ASYNC",
            // type:'getUserListAsync',
            payload: {
                uu: 0,
            },
        });
    };
    return (
        <div className="App">
            <p>number:{number}</p>
            <p>name:{userInfo.name}</p>
            <button onClick={add}>+</button>
            <button onClick={updatTeState}>updateStateProps</button>
            <button onClick={sagaTest}>saga</button>
        </div>
    );
}

export default App;


更多使用请看 react-redux使用hooks替代connect 地址:https://blog.csdn.net/waillyer/article/details/116479890

二、调整reducer文件

只是简化写法,对之前的写法不构成影响

import {
    handleOverrideStateProps,
    handleUpdateStateProps,
    getReducersType,
} from "./overrideAndUpdateStateProps";
import * as namespaces from "../namespaces";
//reducer.js
const namespace = namespaces.USER;
const defaultState = {
    number: 0,
    userInfo: {
        name: "wxq",
    },
};
//获取默认type
const defaultReducersType = getReducersType(namespace);

const Index = (state = defaultState, action) => {
    switch (action.type) {
        case defaultReducersType.overrideStateProps: //同步刷新
            return handleOverrideStateProps(state, action);
        case defaultReducersType.updateStateProps:
            return handleUpdateStateProps(state, action);
        default:
            return state;
    }
};
export default Index;


export const handleOverrideStateProps = (state, { payload }) => {
    return {
        ...state,
        ...payload,
    };
};

export const handleUpdateStateProps = (state, { payload }) => {
    const { name, value } = payload;
    return {
        ...state,
        ...{ [name]: { ...state[name], ...value } },
    };
};
export const getReducersType = (namespace) => {
    return {
        overrideStateProps: `${namespace}/overrideStateProps`,
        updateStateProps: `${namespace}/updateStateProps`,
    };
};

三、saga使用

异步启用saga
简单使用
src\redux\saga\index.js

import {
  call,
  put,
  take,
  all,
  fork,
} from 'redux-saga/effects';

import userSaga from './userSaga';

export default function* rootSaga() {
  yield all([fork(userSaga)]);
}

src\redux\saga\userSaga.js

import { call, put, take, all, fork, takeEvery } from "redux-saga/effects";
import * as actions from "../actions/userActions";
import * as apis from "../../apis";

function* getUserList(payload) {
  console.log("触发异步");

    try {
      const response = yield call(apis.getMerchantModule().list, payload);
      yield put({ tgetUserListype: actions.USER_LIST, payload: response });
    } catch (e) {
      yield put({ type: actions.USER_LIST, payload: e });
    }
  }
  
  function* getUserListAsync() {
   console.log("监听请求用户action");
    // while (true) {
    //     const { payload } = yield take(actions.USER_LIST_ASYNC);
    //     yield fork(getUserList, payload);
    //     console.log("payload", payload);
    // }
    yield takeEvery("USER/USER_LIST_ASYNC", function* ({ payload }) {
        console.log("payload", payload);
        yield fork(getUserList, payload);
    });
      
  }

  export default function* () {
    yield all([fork(getUserListAsync)]);
  }

详细使用请看上一篇 react_redux_saga使用
https://blog.csdn.net/waillyer/article/details/123516178

备注、新项目推荐使用umi或者dva

如果条件允许可以直接使用umi构建
也可以在项目基础上结合dva简化redux(但这只能在项目初期或者刚开始阶段,dva是对redux,react-redux,redux-saga 封装,想要同时使用dva和传统redux写法是行不通的)
umi和dva实战:
地址
https://blog.csdn.net/waillyer/article/details/116454155

react-redux-dva对普通项目实践
地址
https://blog.csdn.net/waillyer/article/details/117395599

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值