博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
redux原理
阅读量:6445 次
发布时间:2019-06-23

本文共 2480 字,大约阅读时间需要 8 分钟。

npm install --save redux

Redux是将整个应用状态存储到一个地方,称为store,里面保存一棵状态树state tree。组件可以派发(dispatch)行为(action)给store,而不是直接通知其它组件。组件内部通过订阅store中的状态(state)来刷新自己的视图。

subscribe 这个函数是用来去订阅 store 的变化,比如你每次对 store 进行 dispatch(action)都会触发 subscribe 注册的函数调用,这个在实际情况不是必须要的,看自己的应用场景,比如你想监控 store 的全局变化时 可以用 subscript 订阅一下,然后作一些反应 复制代码

下图是非redux方式和redux方式:

redux工作流程:

图解:

redux

dispatch  发送命令action   dispatch发送的命令actionreducer   处理器,处理action ,改变state >------storestate ,被reducer处理器的action命令改变例:组件1:发送命令,dispatch---action:{
type:'changeColor',color:'red'}处理器收到action后改变state其他组件根据state刷新自己复制代码

redux实现步骤:

1 创建仓库,存储state 和 reducer 获取最新状态 向仓库发送action 订阅仓库内的状态变化(订阅完成后取消订阅)

一个简单的例子:

//redux.js  封装的redux库/** * redux跟react并没必然的关系 * createStore 创建仓库 **///let {createStore} = require('redux');let createStore = (reducer) => {  let state;//定义初始状态  let getState = () => state;//用来获取最新的状态  let listeners = [];//监听函数数组  //向仓库发关action  let dispatch = (action) => {    //传入老状态和本次的action,返回新状态    state = reducer(state,action);    //通知所有的监听者,让所有的监听函数依次执行    //依次调用所有的订阅函数    listeners.forEach(listener=>listeners());  }  //订阅仓库内的状态变化事件,当状态发生变化后会监听函数  //订阅方法执行后会返回一个取消订阅的函数,调用它订阅  let subscribe = listener =>{    listeners.push(listener);    //订阅方法执行后会返回一个取消订阅的函数,调用它订阅    return ()=>{      listeners = listeners.filter(l=>listener!==l);    }  }  //在创建仓库的时候就直接派发一次空的action,确保state有初始值  dispatch({});  return {    getState, //获取最新的状态对象    subscribe, //原来订阅状态变化事件    dispatch //发身action   }}export {createStore}复制代码
//index.jsimport {createStore} from './1.redux'import $ from 'jquery'const INCREASE = 'INCREASE';const DECREASE = 'DECREASE'$('#body').append(`    

`);//state是状态树,可以是任意的结构 //action是一个纯对象{type:'INCREASE',amount:2} {type:'DECREASE'}let reducer = (state = {number:0},action)=>{ if(action === undefined) return state; switch(action.type){ case INCREASE: return {
number:state.number+action.amount}; case DECREASE: return {
number:state.number-action.amount}; default: return state; }}//调用仓库let store = createStore(reducer);console.log(store.getState());//undefined 需要执行一次dispatchlet render = ()=>{ $('#counter').html = store.getState().number;}//当仓库里的state发生变化的时候,会重新执行render,读取最新的状态数据并更新视图//订阅store.subscribe(render);//点击函数的时候,发身一个INCREASE的action,会得到一个新的state,$('#increaseBtn').click(()=>store.dispatch({
type:INCREASE,amount:3}));$('#decreaseBtn').click(()=>store.dispatch({
type:DECREASE,amount:2}));render();复制代码

转载地址:http://gutwo.baihongyu.com/

你可能感兴趣的文章