Redux

一.redux是什么?

状态管理器

二.redux工作流程主要包含哪些层次,每个层次的作用是什么?

在这里插入图片描述

三.redux的三大基本原则是什么?

1)单一数据源
2)State是只读的
3)使用纯函数来执行修改

四.什么情况下需要使用redux

1)总体原则:大型项目状态管理复杂才用
2)某个组件的状态,需要共享
3)某个状态需要在任何地方都可以拿到
4)一个组件需要改变全局状态
5)一个组件需要改变另一个组件的状态

五.redux的三个核心概念

1.action

1)标识要执行行为的对象
2)包含2个方面的属性
    a.type:标识属性,值为字符串,唯一,必要属性
    b.xxx:数据属性,值类型任意,可选属性
3)例子:
             const action={
                       type:'INCREMENT',
                       data:2
                    }
4)Action  Creator(创建Action的工厂函数)
   const  increment=(number)=>({type:'INCREMENT',data:number})

2.reducer

1)根据老的state和action,产生新的state的纯函数
2)样例
          exportdefaultfunctioncounter(state=0,action){
             switch(action.type){
                 case'INCREMENT':
                      returnstate+action.data
                 case'DECREMENT':
                    return  state-action.data
                 default:
                       return state
                    }
                 }
 3)注意
       a.返回一个新的状态
       b.不要修改原来的状态

3.store

1)将state,action与reducer联系在一起的对象
2)如何得到此对象?

import{createStore}from'redux'
importreducerfrom'./reducers'
conststore=createStore(reducer)

3)此对象的功能?

getState():得到state
dispatch(action):分发action,触发reducer调用,产生新的state
subscribe(listener):注册监听,当产生了新的state时,自动调用

有组件—>想要显示数据—>数据应该在仓库中存着(有且只有一个仓库)–有一个状态树(一棵树)–>

状态数据由reducer进行提供,reducer会有很多,所以会产生combimeReducer–>

状态想要传递到组件,state是没办法传递的,只有props能进行属性传递,所以只能将state转成props才能打通仓库与组件之间的关系–>真正实现props属性到组件之间的数据关联,需要利用connect进行操作–>connect是将组件与仓库建立起联系,所以会产生一个叫容器组件

对组件中的内容可能会进行操作,那么操作是由什么完成?动作!动作就是函数!–>动作是在仓库中—>事件上在reducer中—>仓库想要操作动作,分两种模式,一种是同步一种异步—>想要将动作(函数)传递到组件,需要将它们进行属性化转化操作,也就是mapDispatchToProps–>真正实现props属性到组件之间的数据关联,需要利用connect进行操作–>connect是将组件与仓库建立起联系,所以会产生一个叫容器组件

最终需要利用一个提供者,将仓库内容进行整体提供,提出Provider和store的概念,进行整个包裹。

import React, { useState, useRef, useEffect, useCallback } from "react";
import { StyleSheet, Image, Text, View, Button } from "react-native";
import { createStore } from "redux";
import { connect, Provider } from "react-redux";
/*
1.需要有一个视图组件以便显示相应的数据
2.可以创建一个store仓库,用以给组件提供数据支持
3.store仓库本身是没有数据的,所以需要有reducer给它设置数据,需要与store进行结合
4.reducer的state是无法实现数据传递的,因为它是状态,但是,它又需要与组件进行沟通,
所以需要将state转成props才能进行属性传递
5.reducer的state转props是通过mapStateToProps实现的
6.props属性与组件之间还没有建立起联系,所以需要利用connect进行关联
7.需要有一个Provider提供者,提供store仓库给所有的组件,所以容器组件的外部需要有Provider进行包裹
8.视图层中有一个按钮,而这个按钮想要触发一个事件
9.事件就是动作,动作就函数,可以定义一个mapDispatchToProps,因为事件是无法进行传递的,
唯一能够传递的内容只有属性props,而且需要注意的是事件一定会有多个,mapDispatchToProps应该是什么?是对象!
10.mapDispatchToProps也需要利用connect与组件建立起关联
11.视图组件中就可以调用该方法,但是mapDispatchToProps只做派发操作,不做具体动作执行
12.具体的操作执行交由reducer完成(reducer是数据的处理中心,数据的初始化,修改都在reducer中完成)
*/
// 3,12
const reducer = (state = { count: 0 }, action) => {
  switch (action.type) {
    case "INCREASE":
      return {
        count: state.count + 1,
      };
    default:
      return state;
  }
};

//分模块时
// 3,12
const reducer = (state = { count: 0, count1: 0 }, action) => {
  switch (action.type) {
    case "INCREASE":
      // return {
      //   count: state.count + 1, // state是只读的,只能通过纯函数进行修改
      // };

      // return Object.assign({}, state, { count: state.count + 1 });
      return { ...state, count: state.count + 1 };
    case "DECREASE":
      // return {
      //   count1: state.count1 - 1,
      // };

      // return Object.assign({}, state, { count1: state.count1 - 1 });
      return { ...state, count1: state.count1 - 1 };

    default:
      return state;
  }
};

// 2,4
const store = createStore(reducer);

// 5
const mapStateToPrpos = (state) => {
  return {
    count: state.count,
  };
};

const Count = (props) => {
  const { count, increase } = props;

  return (
    <View>
      <Text>Count:{count}</Text>
      <Button title="count++" onPress={increase}></Button>
    </View>
  );
};
// 9
const mapDispatchToProps = {
  increase() {
    return {
      type: "INCREASE",
    };
  },
};

// 6
const CountContainer = connect(mapStateToPrpos, mapDispatchToProps)(Count); // HOC

// 7
const App = () => {
  return (
    <Provider store={store}>
      <CountContainer />
    </Provider>
  );
};

export default App;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值