zoukankan      html  css  js  c++  java
  • redux ,react-redux梳理,以及源码的学习

    React
    Store:提供的方法{
    store.dispatch()
    store.subscribe(() => {
    this.forceUpdate();
    // this.setState({});
    });
    store.getState()
    }
    // import { createStore, applyMiddleware } from "redux";
    import { createStore, applyMiddleware } from "../kredux";
    // import thunk from "redux-thunk";
    // import logger from "redux-logger";
    // 初始话,状态的修改
    function counterReducer(state = 0, action) {
    console.log("state", state);
    switch (action.type) {
    case "add":
    return state + 1;
    case "minus":
    return state - 1;
    default:
    return state;
    }
    }
    // const store = createStore(counterReducer, applyMiddleware(thunk, logger));
    const store = createStore(counterReducer, applyMiddleware(thunk, logger));
    function logger() {
    return dispatch => action => {
    console.log(action.type + "执行了!");
    return dispatch(action);
    };
    }
    function thunk() {
    return dispatch => action => {
    console.log(555)
    if (typeof action === "function") {
    return action(dispatch);
    }
    return dispatch(action);
    };
    }
    export default store;
    //中间间做了什么处理
    Reducer:传入的对象直接更新状态
    如果传入的是function,需要中间见thunk,然后执行reducer
    源码解析
    export function createStore(reducer, enhancer) {
    if (enhancer) {
    return enhancer(createStore)(reducer);
    }
    let currentState = undefined;
    const listeners = [];
    function getState() {
    return currentState;
    }
    function dispatch(action) {
    currentState = reducer(currentState, action);
    listeners.map(listener => listener());
    }
    function subscribe(listener) {
    listeners.push(listener);
    }
    dispatch({ type: "@@REDUX/OOOOOOO" });
    return {
    getState,
    dispatch,
    subscribe
    };
    }
    export function applyMiddleware(...middlewares) {
    return createStore => (...args) => {
    const store = createStore(...args);
    let dispatch = store.dispatch;
    const midAPi = {
    getState: store.getState,
    dispatch
    };
    const chain = middlewares.map(mw => mw(midAPi));
    console.log('chain....'+chain)
    dispatch = compose(...chain)(dispatch);
    return { ...store, dispatch };
    };
    }
    function compose(...funcs) {
    const len = funcs.length;
    if (len === 0) {
    return arg => arg;
    }
    if (len === 1) {
    return funcs[0];
    }
    return funcs.reduce((a, b) => (...args) => a(b(...args)));
    }
    1,react-redux
    1,通过Provider,存储store={store}
    <Provider store={store}>
    <App />
    </Provider>,
    // 源码的解析,定义context,用于传递store
    const ReduxContext = React.createContext();
    export function Provider({ store, children }) {
    return (
    // children 组件复合
    <ReduxContext.Provider value={store}>{children}</ReduxContext.Provider>
    );
    }
    2,
    2,export default connect(
    //mapStateToProps
    state => ({ counter: state.counter }),//通过一个函数,传递state,返回一个state
    //mapDispatchToProps
    {
    add // 函数一个对象返回,定义函数,函数返回action
    }
    )(ReactReduxPage); //外面调用一个类或者function,的处理,返回 dispatch(add())
    源码解析
    import React, { useContext, useState, useEffect } from "react";
    export const connect = (
    mapStateToProps = state => state,// 1,初始化,一个函数传入一个state,返回一个state
    mapDispatchToProps = {} 2,初始化,由一个空对象返回的方法
    ) => Cmp => props => {
    const store = useContext(ReduxContext); //3,获取store
    const getMoreProps = () => {
    const stateProps = mapStateToProps(store.getState()); //4,获取state,用于把state映射到props上
    const dispatchProps = bindActionCreators(
    mapDispatchToProps, //这是一个方法组成的对象,如add方法等
    store.dispatch
    );// 返回的是dispatch(action)
    return {
    ...stateProps, //存储的是state
    ...dispatchProps //存储的是dispatch方法,比如add等
    };
    };
    // 函数的副作用,当state,发生变化,执行setMoreProps
    useEffect(() => {
    store.subscribe(() => {
    setMoreProps({
    ...moreProps,
    ...getMoreProps()
    });
    });
    }, []);
    const [moreProps, setMoreProps] = useState(getMoreProps());
    return <Cmp {...props} {...moreProps} />;
    };
    //actionCreator是add方法
    //,执行add,返回的不就是一个action,比如{type: 'add'}
    function bindActionCreator(actionCreator, dispatch) {
    return (...args) =>{
    console.log('args=====',...args)
    dispatch(actionCreator(...args));
    }
    }
    //给actionCreators所有的方法绑定上dispatch
    function bindActionCreators(actionCreators, dispatch) {
    let obj = {};
    for (let key in actionCreators) {
    obj[key] = bindActionCreator(actionCreators[key], dispatch);
    }
    return obj;
    const store = createStore(
    combineReducers({ // 封装多个reducer
    counter: counterReducer,
    user: loginReducer
    })
    );
    useEffect的第二个参数必须传空数组,这样它就等价于只在componentDidMount的时候执行。如果不传第二个参数的话,它就等价于componentDidMount和componentDidUpdate

  • 相关阅读:
    住建部第一批城市更新试点名单
    新城建试点城市
    日常笔记
    简单的C++配置模块
    C++ 异常 OR 错误码
    数独的暴力破解法
    MySQL语法数据库操作 Test
    Python中的staticmethod和classmethod Test
    Python中的__init__()、__new__()、__del__()方法 Test
    MySQL语法数据库表操作 Test
  • 原文地址:https://www.cnblogs.com/yayaxuping/p/12182080.html
Copyright © 2011-2022 走看看