redux / react-redux学习

107 阅读1分钟

redux

1675403781055.png

/*
 * 该文件store.js只为了暴露store
 */

import { legacy_createStore,applyMiddleware } from "redux";
// 异步中间件
import thunk from 'redux-thunk'
import reducers from "./reducers.js";

export default legacy_createStore(reducers,applyMiddleware(thunk));
//creators.js
export const ChangeUser = data => ({type:"CHANGE_USER",payload:data})

export const asyncChangeUser = (data,time) =>{
    return (dispatch)=>{
        setTimeout(()=>{
            dispatch(addnum(data))
        },time)
    }
}
/*
 * reducers.js 该文件只暴露reducer函数   用于初始化状态、加工状态
 * reducer函数接受两个参数 之前的状态state,动作对象action
 */
const initState = {
    user:'曹操'
};

function reducer(state = initState, action: action) {
    const { type, payload } = action;
    switch (type) {
        case 'CHANGE_USER':
            state.userName = payload
            return state
        default:
            return state
    }
}

export default reducer
// 组件获取获取redux数据 store.getState()
store.getState().user = 曹操
//改变redux中状态
store.dispatch(ChangeUser('改变后的user'))
// 检测redux中状态改变重新渲染页面 实现数据响应式
store.subscribe(()=>{
    render
})

react-redux

image.png reactui组件和容器组件 redux不能直接和ui组件通信,只能和容器组件通信,所以需要在容器组件使用connect把ui组件和redux连接起来

在容器组件使用store={store} 由于后期组件多 直接在顶级组件中使用 解耦合

mapStateToProps将redux的state传给ui组件 mapDispatchToProps将redux的action传给ui组件 ui组件通过props接收

//组件
const mapStateToProps = (state) => {
  return {
  };
};
const mapDispatchToProps = (dispatch) => {
  return {
    changeUser: (data) => {
      dispatch();
    },
  };
};

const Child = (props) => {
 
};

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

后续开发一个模块就有一个reducer,使用多个reducer,使用combineReducers整合

import { composeWithDevTools } from "redux-devtools-extension";
const store = legacy_createStore(
  combineReducers({  //整合所有reducer
    user: reducer,
    count: countReducer,
  }),
  composeWithDevTools() //可视化插件
);