浅谈react-redux
redux使用
核心
Provider是React Redux提供的一个组件,它的作用是将Redux的store注入到React应用中的所有组件中,并且会通过React的context机制将store传递给后代组件
Provider组件的实现原理如下:
1.Provider组件会接收一个
store
属性 ,该属性就是Redux Store对象2.Provider组件会在组件的
state
中创建一个store
属性,将传入store
属性值赋值给它3.Provider组件会利用React 的Context机制,将
store
属性的值作为上下文传递给他的后代组件
import { Provider } from 'react-redux' import store from './store' ReactDOM.createRoot(document.getElementById('root')).render( ?<Provider store={store}> ? ?<Router> ? ? ?<App /> ? ?</Router> ?</Provider> )
createStore(reducer , [preloadedState] , [enhancer])
reducer(FUnction): 接收两个参数 , 分别为当前的state树和要处理的action , 返回新的state树
[preloadedState] 初始化时的state , 如果使用了combineReducers 创建reducer , 它必须是一个普通对象,与传入的keys保持同样的结构。 否则,你可以自由传入任何reducer可理解的内容
enhancer (Function) : Store enhancer , 可以选择指定它使用的第三方功能,如middleware、时间旅行、持久化来增强store, Redux中唯一内置的store enhancer是applyMiddleware()
返回值 : store : 保存了应用程序所有state的对象。改变state的唯一方法就是dispatch action 也可以使用subscribe state的变化,然后更新UI
combineReducers
用redux库中提供的combineReducers方法,可以将多个拆分reducer函数合并成统一的reducer函数,提供给createStore来使用。
//combineReducers创建reducer import { combineReducers } from 'redux' ? //导入纯函数 import cate from './modules/cate'; export default combineReducers({ ? ?// key : value ? ?cate })
/** * 定义纯函数进行导出 */ //纯函数定义 import cloneDeep from 'lodash/cloneDeep' //初始化数据 const initState = { ? ?categoryList: null, ? ?materialList: null, } const reducer = (state = initState, { type, payload }) => { ? ?const newState = cloneDeep(state) ? ?if (type === 'cate/setCate') { ? ? ? ?newState.categoryList = payload.category ? ? ? ?newState.materialList = payload.material ? } ? ?//返回新的state ? ?return newState } export default reducer
connect
connect:它是一个高阶租价, 负责连接React和Redux , 用于在数据中操作redux数据
有两个参数第一个
第一个参数: 把redux中的state数据映射到当前组件的this.props对象中, 传入一个函数 state=> ({})
第二个参数: 把dispath操作的方法映射到当前组件的this.props对象中 obj | dispatch => ({})
/** * categoryAction.js文件 * 是redux中的方法,主要用于处理异步请求 * 根据返回结果,调用dispatch方法,修改数据 */ ? //引入网络请求 import { getCateGoryApi } from '@/services/category' //用于处理异步操作,调用dispatch方法函数 //thunk中间件会执行会返回一个函数,可以获取到dispatch, getState方法 export const getCategoryAction = () => async (dispatch, getState) => { ? ?let state = getState() ? ?if (state.cate.categoryList === null) { ? ? ? ?let res = await getCateGoryApi() ? ? ? ?if (res.code === 0) { ? ? ? ? ? ?dispatch({ type: 'cate/setCate', payload: res.data }) ? ? ? } ? } }
/** * connect文件 * 高阶组件,用于连接redux和组件 * 便于在组件中使用redux数据和方法 */ import { connect } from 'react-redux' import * as action from '@/actions/categoryAction' export default connect(state => state.cate, action)
/** *需要映射数据的组件 */ ? import React, { Component } from 'react'; //引入处理之后的connect import connect from './connect'; class Category extends Component { ? ?render(){ ? ? ? ?//使用connect注入之后,可以在此处获取到redux中的内容 ? ? ? ?console.log(this.props) ? } } //用connect将组件进行包裹 export default connect(Category);
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!