redux中的store,reducer,action之间的连通关系

首先文章是基于对redux概念有了一定了解基础上,我们用代码将store,reducer,action三者连通。
要具备一定的es6语法基础
看完所有的代码片段和说明后,跟着文章最后的流程走一遍思路,差不多就理解了redux的工作流程,及其store,reducer,action三者如何在代码上连通了,(如果还不明白,建议结合文档和本文反复理解,)
在这里插入图片描述
我在react中给大家举例子,这是src下的项目结构:
App.js的代码如下

import React, {Component} from 'react';
import { addTwo, deTwo} from './redux/action'//引入的这两个方法是创建acation的工厂函数,文章讲到时回来看
export default class App extends Component {
	//下面这两个方法可以先不看,文章讲到时可以回来看
    handleAddTwo = (number) =>{
        this.props.store.dispatch(addTwo(number))
    };
    handleDeTwo = (number) =>{
        this.props.store.dispatch(deTwo(number))
    };
    render() {
        const count = this.props.store.getState();//这是下面的初始计数,开始的时候就可以把他想成随便一个变量例如const count = 5
        return (
               <div>
                   <div>计数为{count}</div>
                   <div>
                       &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                       <button onClick={()=>{this.handleAddTwo(2)}} >+ 2</button>&nbsp;&nbsp;&nbsp;&nbsp;
                       <button onClick={()=>{this.handleDeTwo(2)}} >- 2</button>
                   </div>
               </div>
        );
    }
}

在这里插入图片描述
这里想实现的效果是点+2按钮计数加2,点-2按钮计数减2;
好了那么现在开始进入redux的主题吧,
store是管理所有状态(也可以说是管理所有数据)的容器,我们首先创建这个容器,在redux文件下创建store.js里面代码如下

//创建store
//用到了redux中的createStore方法
import { createStore } from 'redux'
import { reducer } from './reducer'

export default createStore(reducer);//createStore方法会接受参数,参数是reducer函数

看完上面代码,会想到两个问题:reducer哪来的呢?创建完的store放到哪去呢?先说reducer哪来的,当然是我们创建的,在redux文件下创建reducer.js文件里面代码如下

//reducer.js
//创建了reducer两个参数分别是初始状态state并附了初始值8(这也是为什么上面效果途中的初始计数为8),第二个参数action为通过dispatch派发过来的action
export function reducer(state = 8,action) {
    switch(action.type) {
        case "add":
            return state + action.number;
            break;
        case "de":
            return state - action.number;
            break;
        default:
            return state
    }
}

store放到哪去呢?答案是放到最外层的组件上去,最外层组件是谁,从目录结构也能看出当然是在index文件下引入的app组件,index文件下的代码如下

//入口文件
import React from 'react';
import ReactDOM from  'react-dom';

import App from './App'
import store from './redux/store'

ReactDOM.render(<App store={store}/>, document.getElementById("root"))//放在这了,子组件就可以通过this.props.store拿到store了
//强调一点redux是管理js状态的包,当然不仅react可以用,在写前端所有的js时都可以考虑redux的概念,并引入。

上面说完了store哪里去。reducer哪里来。下面讲 action哪来的。是我们创建的,这里我是通过函数创建的形式创建action,当然也可以每次dispatch的时候大家手动写action。(在项目中建议action由工厂函数生成)
本文的redux下的action文件代码如下

//action.js代码就两行,因为举的例子比较简单
export const addTwo = (number) =>({type:"add",number:number});
//这里函数传参的number是和最开始的app.js中两个方法中的number相互对应的
export const deTwo = (number) =>({type:"de",number:number});

好了这里对redux的基本工作原理代码已经完成了,下面传通一遍工作流程。
首先当我们启动项目时app.js中的这行代码,从store中获取到了count的初始值

const count = this.props.store.getState();
//store中的getState()方法会拿到当前store中的值
//这里大家可能想到一个问题,还没有执行reducer怎么就拿到8了呢?其实再我们用createStore()方法创建时就执行一次reducer拿到state的初始值了

当我们点击+2按钮时会触发按钮的点击事件,触发回调函数,number值传为2,此时action工厂函数会生成一个{type:“add”,number:2}的action,通过dispatch方法传给reducer函数,reducer处理后会返回生成后的state传给store,store改变了重新渲染了app组件,改变了计数值。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Redux是一个用于JavaScript应用程序的可预测状态容器,它可以帮助我们更好地管理应用程序的状态。而Reducer是Redux用于处理状态变化的函数,它接收先前的状态和一个动作对象作为参数,并返回新的状态。Reducer的设计灵感来自于JavaScript的Array.prototype.reduce()方法,因为它们都是将先前的值和当前的值组合成一个新值的过程。在ReduxReducer通常是纯函数,它们不会修改先前的状态,而是返回一个新的状态对象。 下面是一个简单的Redux应用程序,其包含一个Reducer: ```javascript // 定义初始状态 const initialState = { count: 0 }; // 定义Reducer function counterReducer(state = initialState, action) { switch (action.type) { case 'INCREMENT': return { count: state.count + 1 }; case 'DECREMENT': return { count: state.count - 1 }; default: return state; } } // 创建Redux store const { createStore } = Redux; const store = createStore(counterReducer); // 订阅状态变化 store.subscribe(() => { console.log(store.getState()); }); // 分发动作 store.dispatch({ type: 'INCREMENT' }); // 输出:{ count: 1 } store.dispatch({ type: 'INCREMENT' }); // 输出:{ count: 2 } store.dispatch({ type: 'DECREMENT' }); // 输出:{ count: 1 } ``` 在上面的例子,我们定义了一个名为`counterReducer`的Reducer函数,它接收先前的状态和一个动作对象作为参数,并返回一个新的状态对象。我们还创建了一个Redux store,并将`counterReducer`作为参数传递给`createStore`函数。最后,我们分发了一些动作,并在控制台打印了状态变化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值