react技术全家桶(45)redux使用

redux是一个专门用于做状态管理的js库 (不是react插件库)
作用:集中式管理react应用中多个组件共享的状态。

什么情况下使用redux?
某个组件的状态需要让其他组件可以随时拿到数据
一个组件需要改变另一个组件的状态 通信

redux的使用:
安装:
npm i redux

redux迷你版使用:
新建一个redux目录
新建一个count_reducer.js count是一个组件名称 这个文件就是对count组件的某些状态进行集中管理。
该文件使用于创建一个为Count组件服务的reducer,reducer的本质就是一个函数
reducer函数会接到两个参数,分别为:之前的状态(preState),动作对象(action)

export default function countReducer(preState=0,action){
const {type,data} = action;
switch(type){
case ‘increment’:
return preState+data;
case ‘decrement’:
return preState -data;
default:
retrun preState;
}
}
新建一个count_stroe.js 这个是redux的核心组件之一 必须要有 作用就是修改状态 需要接受一个参数 参数必有操作类型 操作数。
import {createStore} from ‘redux’;
import countReducer from ‘./count_reducer’
export default createStore(countReducer );

这两个文件该如何管理:
import store from ‘./redux/count_stroe’
获取管理的状态:
store.getState();//获取的就是初始状态的值 初始状态的值是在count_reducer.js中设置的 就是preState=0
store会自己调用count_reducer的方法 来修改管理的状态。

如何通知store修改管理的状态
store.dispatch({type:'increment',data:'操作数'});//需要action对象

react的setState方法 会修改状态数据 也会调用render方法 重新挂载组件
但是store的dispatch只会修改管理状态的数据 不会调用render方法 重新挂载组件

解决方案:
使用挂载组件的生命周期的函数:在组件挂载的时候监听 store的数据是否发生改变,如果改变了就调用render,
componentDidMount(){
store.subscribe(()=>{
//this.render();//我们自己调用的render没用
this.setState({})//意思是啥也不改 但是react会调用render方法。
});
}

redux完整版使用:

比精简版多几个文件:
在redux中添加count_action.js文件 改文件专门为count组件生成action对象。

export const createIncrementAction = data => ({type:‘increment’,data})
export const createDecrementAction = data => ({type:‘decrement’,data})

使用:
import {createIncrementAction,createDecrementAction} from ‘./redux/count_action’

store.dispatch(createIncrementAction(操作数));

异步action
action 的值可以是一般对象 也可以是函数
值为一般对象就是 就是同步action
值为函数 就是异步action

export const createDecrementASyncAction = (data,time) => {
return (dispatch) =>{
setTimeout(()=>{
dispatch(createIncrementAction(data))
},time)
}
}

store不支持action是函数 必须要有中间件。
安装插件
npm i redux-thunk
store.js文件修改:
import {appluMiddleware} from ‘redux’
import thunk from ‘redux-thunk’

export default createStore(countReducer,applyMiddleware(thunk));

这时store就支持action的值为函数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值