Redux自定义封装connect和usedispatch 和useSelector
Posted 我是真的不会前端
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redux自定义封装connect和usedispatch 和useSelector相关的知识,希望对你有一定的参考价值。
前言
多的不多说 直接上代码 说实话,不太懂redux建议先看看文档 一切知识优先看文档和源码 看不懂的再去看一些机构的视频或者看某些大佬的文章
封装connect
本质上自己创建了一个上下文来取出数据state再派发出去。封装该层语法
connect语法
connect(mapStateToprops,mapDispatchToprops)(WrappedComponent)
mapStateToProps
类型是个函数,作用是吧store的数据放在props上 在上下文中…props解构
function mapStateToProps({test}) {
return {
msg: test.msg
}
}
mapDispatchToProps
类型也是一个函数,起作用是把那些派发的信号方法放在props上
function mapDispatchToProps(dispatch) {
return {
// 行为的封装
updateMsg: payload => dispatch(updateMsg(payload))
}
}
代码
上下文写法
自定义上下文
import React from 'react'
import store from '@/store'
const Mycontext =React.creactContext(null)
function MyProvider({ children }){
return(
<Provider context={Mycontext} store={myStore}>
{children}
</Provider>
)
}
export default(mapStateToProps,mapDispatchToProps)=>{
let state =mapStateToProps(store.getState())
store.subscribe(function(){
state=mapStateToProps(store.getState())
})
const actions=mapDispatchToProps(store.dispatch)
}
return WrappedComponent =>{
return props =>{
return (
<WrappedComponent {...props} {...state} {...actions} />
)
}
}
hooksAPI 写法
function Myconnect(mapStateToProps, mapDispatchToProps) {
const actions = mapDispatchToProps(store.dispatch)
return WrappedComponent => {
return props => {
const [state, setState] = useState(mapStateToProps(store.getState()))
useEffect(()=>{
// 订阅监听store的数据变化
const unsubscribe = store.subscribe(()=>{
console.log('store changed', store.getState())
setState(mapStateToProps(store.getState()))
})
return ()=>unsubscribe()
}, [])
}
}
}
封装hooks api
封装useDispatch
这个比较简单,直接抛出store.dispatch
function useMyDispatch() {
return store.dispatch
}
封装useSelector
function useQfSelector(fn) {
// 参考react-redux中的useSelector的源码
const [, dispatch] = useReducer(s=>s+1,0)
store.subscribe(()=>dispatch())
return fn(store.getState())
}
以上是关于Redux自定义封装connect和usedispatch 和useSelector的主要内容,如果未能解决你的问题,请参考以下文章
react封装自定义Hooks完成日常loading与error俘获,以及登录状态管理useContext代替redux
React×Redux——react-redux库connect()方法与Provider组件