深度理解redux(一)

1、redux作为react技术栈系列中解决数据管理的一种架构,我们非常有必要学会它,理解它。

2、为什么要用redux?很多人很疑惑。有这么一句话,我觉得很经典,就是当你不知道要不要用redux的时候,那就不需要使用redux。只有当你遇到你解决不了的问题的时候,redux可能就是你的解决方案。

3、如果一个人开始学习redux,他最好记住这么一套逻辑,redux的核心是一个数据容器,用store描述,一个相同的store数据容器必定对应一个相同的界面view,一个单页面的应用从用户的角度出发,只能通过用户的行为(使用action描述)来改变数据,而处理用户的这种行为的函数我们叫reducer。

总的来说,就是用户发出action,我们reducer处理用户行为,然后store数据改变,引发界面发生相应的改变。(上面的一段描述非常重要,这是理解redux的关键,不管怎么样,必须有一个整体的印象,没有印象就再读一遍。)

4、redux几乎没有任何强制性的规定,没有教你该怎么写,怎么做,它只提供了少量的API,但是没有强制性规定的东西,才是我们理解的痛点!!redux的一些基本概念如下:

5、store
store是我们创建的数据容器,它是一个对象,里面存放的是我们的数据。它的基本API使用方式如下:

import { createStore } from "redux";
const store = createStore(todoApp);
//store就是我们创建的数据容器,是一个对象,如果console.log就会发现,它还有一些方法,如比较常用的dispatch()方法,getState()方法等等。
//todoApp是我们的reducer函数,用于处理用户action行为。后面会详细说明。
   
   
  • 1
  • 2
  • 3
  • 4

6、action
action是一种描述用户行为的一个对象!!
如何描述用户行为?redux把每个用户的不同操作都描述成为一个带有type属性的对象,类似于:

{
    type:"TODO" }
   
   
  • 1
  • 2
  • 3

其中,type是这个对象必须有的一个属性,描述的是用户“todo”类型的行为。
一般而言,我们把用户的行为类型定义成常量。像下面这样:

const TODO = "TODO";
let action = {
    type:TODO,
}
   
   
  • 1
  • 2
  • 3
  • 4

7、action creater
一般而言,用户的同种类型的行为很可能携带某些信息,就比如我们购买我们喜欢的衣服,可能一件不够,我多买几件,这样就重复的点击淘宝上的“+”按钮,同一种行为,但是每次有个+1的操作,这时候就是action creater的存在意义了。
action creater是一个函数,可接受参数,返回的是一个action对象。使用方式如下:

const TODO = "TODO";
function todo(text){
    return {
        type:TODO,
        text:text
    }
}
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

8、reducer
reducer是处理用户行为的函数。它的逻辑就是根据用户的行为,把store里面的数据跟新为新的状态。
old state—>reducer处理(通过action行为)—->new state;
所以这个reducer函数的参数就可想而知了。一个是旧的状态,一个是用户action行为,返回值是新的state。
类似下面这样:

function todos(state=0,action){
    switch (action.type){
        case "ADD":
            return state+1;
        case "DEC":
            return state-1;
        default:
            return state;
    }
}
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

这个处理函数是这样的,旧的状态是state,用户行为是action,state我们给的初始值是0,也就是我们在什么都不做的情况下,我们存储到store中的数据的值,action是我们用户的行为,它有一个必须的属性type,如果这个type是”ADD”的时候,我们把state更新为state +1,如果是”DEC”的时候,我们把state更新为state-1。默认情况下返回原值state。

这里的todos就是我们之前创建的数据容器,所接受的那个函数,我之前写的是todoApp。

9、在这里,个人觉得有必要再描述一个整体上的运行过程。
我们规定了一种行为叫action,这种行为通过它的属性type进行区分,用户通过这种行为,redux就会自动识别并且处理这种行为,就是上面的reducer函数,从而数据进行更新。

10、到这里,我们还有问题没有解决!用户如何发出这种行为action?数据刷新之后界面如何进行更新?我们如何读取store中的数据?
这就要牵扯到store的一些方法了。
store.getState(),获取store中存储的数据!
store.dispatch(action),发出用户行为。action是个对象,不多说。
store.subscribe(handleEvent),对store中的数据进行监听,如果更新了数据,就会自动触发handleEvent函数,handleEvent是一个回调函数。

11、实践是检验真理的唯一标准,我们看一个示例:
首先要明白一点,redux是一种数据管理的架构,它不针对react,仅仅是很适合react,我们在任何地方都可以使用redux。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://unpkg.com/redux@latest/dist/redux.min.js"></script>
</head>
<body>
    <button id="add">add</button>
    <p id="value"></p>
    <button id="dec">de</button>
</body>
<script>
    function reducer(state,action) {

        if(state === 'undefined'){
            state = 0;
        }
        console.log(state);
        switch (action.type){
            case 'ADD':
                return state + 1;
            case 'DEC':
                return state - 1;
            default:
                return 0;
        }
    }
    var store = Redux.createStore(reducer);//创建store
    console.log(store.getState());
    var op = document.getElementById('value') ;
    renders();//先执行op.innerHTML = store.getState()

    //点击行为,描述用户action
    document.getElementById('add').onclick = function () {
        store.dispatch({type:"ADD"});
    }
    document.getElementById('dec').onclick = function () {
        store.dispatch({type:"DEC"});
    }

    //subscribe的回调函数
    function renders() {
        op.innerHTML = store.getState()
    }
    store.subscribe(renders);//监听
</script>
</html>
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48

这是在js中应用redux的实例,其要点有这么几点
第一、使用redux,必须引入redux库。
第二、创建了reducer函数,有两种行为,”ADD”和”DEC”。
第三、创建了store数据容器。
第四、store.getState()获取数据存入数据。
第五、store.dispatch()发出用户行为action。
第六、store.subscribe()监听数据变动。

猜你喜欢

转载自blog.csdn.net/qq_36486737/article/details/82454009