• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
wn0615
博客园    首页    新随笔    联系   管理    订阅  订阅

useContext配合React.createContent实现传统redux功能

在以往的redux中要实现数据共享需要配置文件例如配置redux中的reducer和action文件以及根文件

在一个组件中还需要将配置的文件利用connect进行链接,对于一些项目来说这些显得略微的复杂:

就比如是实现一个对count值的改变功能:就需要:

Action文件:

import {ADD_COUNT,SUB_COUNT} from '../constent'
import store from '../index'
export const addCount = (data)=>({type:ADD_COUNT, data:data})
export const subCount = (data)=> ({type:SUB_COUNT,data:data})
export function createIncrementAsyncAction(data,time) {
return ()=>{
setInterval(()=>{
store.dispatch(addCount(data))
},time)
}
}

Reducer文件:
import {ADD_COUNT,SUB_COUNT} from '../constent'
const initState =0
//如果不想写函数名字,那么要在函数上面加上一行注释: eslint-disable-next-line
export default function changeCount(preState=initState,action){
const {type,data} = action
switch (type) {
case ADD_COUNT:
return preState+=data
case SUB_COUNT:
return preState-=data
default:
return preState
}

}
Store文件:
import {createStore,applyMiddleware} from 'redux'
import thunk from 'redux-thunk'
import {combineReducers} from 'redux'
import changeCount from './reducers/count'
const allReducer =combineReducers({
count:changeCount
})
const store=createStore(
allReducer,
applyMiddleware(thunk)

)
export default store
在组件中的使用:
import {Fragment,Component} from 'react'
import {connect} from 'react-redux'
import {addCount,subCount} from '../redux/actions/count'
class About extends Component{
render(){
const {count} =this.props
return(
<Fragment>
<h1>{count}</h1>
About...
<button onClick={
()=>{
console.log(11)
this.props.add(1)
}
}>点我加一</button>
</Fragment>
)
}
}
export default connect(
state=>({
count:state.count
}),
{
add:addCount,
sub:subCount
}
)(About)

这多少有点脱了裤子放屁了
那么看一下用useContext和React.createContext配合做出来的效果:
import React, { useState,Fragment} from 'react'
import App from '../App'
export const MyContext = React.createContext()
export function Store() {
//是不是可以再把数据和文件导出去
const [count,setCount] =useState({
name:'张三',
age:18
})
function changeCount(name,age=18) {
setCount({
name,
age
})
}
return(
<Fragment>
<MyContext.Provider value={
{
count,
changeCount
}
}>
<App/>
</MyContext.Provider>
</Fragment>
)

}
redux的思想我感觉就是将一些共有的状态保存到一个文件中,基于这个思想,利用React.createContext创建上下问对像,在Provider方法将数据和方法传入所有子组件中这样似乎也可以实现这种需求
代码如下:
import {Button} from 'antd'
import {useContext} from 'react'
import {MyContext} from "../store";
export default function Footer(props) {
const v={...useContext(MyContext)}
console.log(v);
const handelClick=()=> {
v.changeCount('李四')
}
return(
<div>
<div>
<h1>我是从App中拿到的数据---{v.count.name}</h1>
<Button onClick={handelClick}>修改App中的名字</Button>
</div>
</div>

)
}
这样看来似乎是简单多了,当然了随着工程量的变大,我们也可以将定义的数据和方法拉倒外面分别定义两个文件,这样似乎又和redux有异曲同工之妙,
我还是在慢慢探索探索吧0.0

 

posted @ 2022-07-06 09:56  大宁0615  阅读(256)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3