redux ,react-redux梳理,以及源码的学习

Posted yayaxuping

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

以上是关于redux ,react-redux梳理,以及源码的学习的主要内容,如果未能解决你的问题,请参考以下文章

react-redux 源码浅析

正式学习React react-redux源码分析

React入门之Redux:react-redux基本使用

React入门之Redux:react-redux基本使用

使用通过 react、redux 和 react-redux 完成的组件以及在 react 应用程序中使用 webpack 构建时出错

180React15.6.0ReactDOM15.6.0和React-Redux.4.0.0.js源码结构