RN开发系列<8>--Redux(1)入门篇

2023-11-07

1.Redux的基本用法

前言

说明: 本文只针对移动端的Redux的基本用法进行描述。

  1. 希望这一篇文章,就能帮助你搞定redux的基本用法,甚至不用再去查阅其他文档。
  2. 因为我个人脑子比较笨,查阅了很多文档,看了不少视频资料才理解了。

2. 原理阐述(个人根据对官方文档理解的阐述)

  1. 关键词 store、action、reducer
  2. store是全局唯一的(在服务端可能有多个,但是我们在移动开发中,只有一个),它的作用是用来存储数据。
  3. action,翻译过来就是“动作,行动”的意思。 在我们这里,我们可以理解为对一种行动的描述,包括名字,要做的事情,参数等。
  4. reducer,翻译过来就是“减速器”的意思,个人理解为缓冲者可能比较妥当。
    (1)意思是,当有人发送一个action,会给到reducer来处理,或者作为一个缓冲地带,来进行一些数据处理。
    (2)处理后的数据会存储到store中,而且这是唯一可以改变store中的数据方法。
  5. 数据的使用
    (1)get方法,在UI界面中,数据源通过get方法获取
    (2)set方法,在这里没有直接的set方法,要修改数据,通过dispatch来set (dispatch翻译过来就是发送,派遣,邮寄的意思,我们可以理解为发送快递的方式)
    (3)这里通过dispatch发送的包裹,就是action(这里有一些我们想修改的数据相关内容)
  • 数据流向图(单一数据流向)
    在这里插入图片描述

3.脑海里大概有个上面的数据流向图即可,先看下面的代码(最好自己也写一遍,会加深印象,有助于理解)

  • 文件目录结构如下
    在这里插入图片描述

一. 我们先搭建一个简单的界面(View1–index.js)

import React, { Component } from 'react';
import {
    Button,
    Text,
    View,
    StyleSheet
} from 'react-native';

import { connect } from 'react-redux';
import * as uiAction from '../Redux/action/uiActions';

class Home extends Component {

    constructor(props) {
        super(props);

        this.state = {
            name: "张三",
            age: 18
        }
    }

    render() {
        return (
            <View style = {styles.container}>
                <Text>Hello, my name is { this.state.name },I'm {this.state.age} years old</Text>
                <Button 
                    title='增加年龄'
                    onPress={() => {
                    
                    }}
                />
                <Button 
                    title='减少年龄'
                    onPress={() => {
                    
                    }}
                />
                <Button 
                    title='修改姓名'
                    onPress={() => {
                        
                    }}
                />
            </View>
        )
    }
}

export default Home

const styles = StyleSheet.create({
    container: {
        justifyContent: 'center',
        alignItems: 'center',
        flex: 1
    }
})

在这里插入图片描述

二. 我们想做的事情很简单

  1. 点击增加或减少年龄,修改界面的年龄显示
  2. 点击修改名字,修改界面的名字显示
  • 那么我们如何通过Redux来实现呢?我们分为几个步骤。

三.Redux的使用步骤(本文核心内容)

开始之前,我们导入依赖库

一次性导入依赖库:
yarn add immutable \
react-redux \
redux \
redux-logger \
redux-promise-middleware \
redux-thunk

1.step one
  • 创建action、reducer、store
    (1) 我们创建actionType.js文件
import { ActionType } from 'redux-promise-middleware';

/*
* 编程规范建议:
* 1. 我们的每个action大类,个人觉得以ActionXX来开头命名,
*    使用的时候更能体现见名知意。
* 2. 里面对具体某个action,个人觉得以K开头,更能区分代表是具体action的key值
*/
export const actionType = {
    ActionUI: {  
        KaddAge:                 "addAge",
        KdecrementAge:           "decrementAge",
        KmodifyName:             "modifyName"
    }
}

(2) 我们创建uiActions.js文件

import { actionType } from "./actionType";

/**
 * 通常,根据action类型来命名函数
 */

/*
* type:表示是action的具体类型,我们可以直接使用我们上个actionType
* payload: 表示参数,也是外面传过来的参数
* 在这里,addAge函数,就是dispatch发送的包裹了
*/
export function addAge(age) {
    return {
        type: actionType.ActionUI.KaddAge,
        payload: age
    }
}

export function decrementAge(age) {
    return {
        type: actionType.ActionUI.KdecrementAge,
        payload: age
    }
}

export function modifyName(name) {
    return {
        type: actionType.ActionUI.KmodifyName,
        payload: name
    }
}

(3) 创建所有action的入口函数,index.js,我们这里暂时没有创建

export * from './uiAction'
export * from './xxAction'  // 如果有别的action,可以统一放到这里
export * from './xxxAction'
2.step two

(1)创建uiReducer.js文件

import { actionType } from "../action/actionType";
import { fromJS } from "immutable";

/**
 * 初始状态,不可变的,这里的state的的key,都是在UI界面中的state可以直接调用的
 * 比如:界面一个文本的名字内容,显示什么,就是直接用这里的myName
 */

function initialState() {
    return fromJS({
        myName: "张三",
        myAge: 18
    });
  }

/**
* 这里为了代码的简洁性、可读性、维护性、解耦性
* 我们不要写成switch语句,否则一个函数的行数很容易超过50行
* 个人不建议一个函数的行数超过50行
* 
*  我们这里根据prototype来定义多个函数,只是参数的类型不同
*  有点像C++里的函数重载
*/
export default function reducer(state = initialState(), action) {
    if (typeof reducer.prototype[action.type] === 'function') {
        return reducer.prototype[action.type](state, action);
    } else {
        return state;
    }
}

reducer.prototype[actionType.ActionUI.KaddAge] = (state, action) => {
    return state.set('myAge', action.payload);
}

reducer.prototype[actionType.ActionUI.KdecrementAge] = (state, action) => {
    return state.set('myAge', action.payload);
}

reducer.prototype[actionType.ActionUI.KmodifyName] = (state, action) => {
    return state.set('myName', action.payload);
}

(2)创建reducer的入口函数,index.js

import ui from './uiReducer';
import otherReducer from './otherReducer'; // 假如还有其他reducer
import { combineReducers } from 'redux';

export default combineReducers({
    ui,
    otherReducer // 如果还有其他reducer,就这样类似往里面添加
});
3.step three

创建store,也是唯一的store

import { applyMiddleware, createStore } from "redux";
import { createLogger } from "redux-logger";
import thunk from "redux-thunk";
import promise from "redux-promise-middleware";
import reducer from '../reducer';

// 分为调试环境 和 release环境,调试环境就有log日志
const middleware = __DEV__ ?
                   applyMiddleware(promise, thunk, createLogger())
                   :
                   applyMiddleware(promise, thunk)


export default createStore(reducer, middleware)
  • 到此为止,我们已经完成了80%了。如果能看到这里,提前恭喜一下你!
4.step four
  • 现在需要把redux和UI界面串联起来
  • 对于下面的没有使用过redux的UI界面,我们开始改造
class Home extends Component {

    constructor(props) {
        super(props);

        this.state = {
            name: "张三",
            age: 18
        }
    }

    render() {
        return (
            <View style = {styles.container}>
                 {...}
            </View>
            )
     }
}
export default Home

(1)去掉constructor
(2)导入connect,导入把export default Home改为:

import { connect } from 'react-redux';

export default connect((state) => {
    return {
       	 person: state.ui
        };
  })(Home);

(3) 用Provider包裹整个APP

import React from 'react';
import { Provider } from 'react-redux';
import store from './smallDemo/Redux/store/store';

const ReduxApp = () => (
    <Provider store={store}>
        <App />
    </Provider>
)
   

AppRegistry.registerComponent(appName, () => ReduxApp);

(4) dispatch的使用方法

   render() {
        return (
            <View style = {styles.container}>
                <Text>Hello, my name is { this.props.person.get('myName') },I'm {this.props.person.get('myAge')} years old</Text>
                <Button 
                    title='增加年龄'
                    onPress={() => {
                        this.props.dispatch(
                            uiAction.addAge(this.props.person.get('myAge') + 20)
                        )
                    }}
                />
                <Button 
                    title='减少年龄'
                    onPress={() => {
                        this.props.dispatch(
                            uiAction.addAge(this.props.person.get('myAge') - 10)
                        )
                    }}
                />
                <Button 
                    title='修改姓名'
                    onPress={() => {
                        this.props.dispatch(
                            uiAction.modifyName("zhangsan")
                        )
                    }}
                />
            </View>
        )
    }
  • 到此为止,我们已经阐述完了整个redux的基本使用方法
  • end~ Thanks!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RN开发系列<8>--Redux(1)入门篇 的相关文章

随机推荐

  • 浅谈Chrome开发者工具--- Console面板与常见报错类型

    Console面板 在学习JS之后 Console面板就成了我离不开的工具 在我们的程序无法达到我们所期望的效果时候 就可以在Console面板上调试我们的程序 在面板上 除了报错以外 还可以打印出我们在程序中所想要补货到的一些数据 我用的
  • npm脚本命令npm run script的使用

    npm 可以在项目package json里面自定义脚本命令 package json文件 script dev webpack w package json文件中的字段script的每一个属性都是一个自定义的脚本命令 在命令行中可以通过执
  • pyinstaller no module named ‘pkg_resources.py2_warn‘解决方法

    在用pyinstaller打包python编写好的程序时 遇到了一些问题 其中有一个是no module named pkg resources py2 warn 经过一些探索后 找到了解决方法 1 先用pyinstaller D F xx
  • 二叉树的中序遍历算法(Java三种实现方法)

    文章目录 题目 一 二叉树的节点定义 二 三种遍历方法 1 递归 算法思想 2 迭代 算法思想 3 Morris 中序遍历 算法思想 总结 题目 给定一个二叉树的根节点 root 返回它的 中序 遍历 一 二叉树的节点定义 public c
  • Linux 使用 Qt 和Occ,报错 qcoreevent.h X.h

    因为
  • [蓝桥杯][2013年第四届真题]危险系数

    题目 题目链接 题解 DFS 蓝桥杯中 一般看到图不是BFS就是DFS 代码1对应第一种方法 我的方法 根据关键点的定义 删除这个点之后 无法实现从u到v 那么我们就枚举每个点作为删除点 判断删除这个点之后还能不能实现从u到v 若不能说明删
  • 文献调研(九):基于rough set理论和深度学习算法的建筑能耗预测模型

    A building energy consumption prediction model based on rough set theory and deep learning algorithms Energy and Buildin
  • H5适配iPhoneX底部小黑线,CSS一招搞定!

    做移动端H5的同学 在你的前端开发生涯中 是否遇到过这种问题 浮在手机屏幕底部的功能区 在你的安卓和苹果的大部分机型上展示极其完美 这种 可是在iPhone上却是这种 遇到这样的情况 不要着急 不用js 不用vue css一招教你轻松搞定
  • 探索深度学习世界:掌握PyTorch,成为AI领域的行家

    探索深度学习世界 掌握PyTorch 成为AI领域的行家 PyTorch的背景介绍 PyTorch的基本概念与特点 PyTorch的基本应用 张量和自动求导 神经网络搭建 训练和测试模型 模型的保存和加载 模型保存 模型加载 模型使用 Py
  • idea开启热部署

    一 开启IDEA的自动编译 静态 具体步骤 打开顶部工具栏 File gt Settings gt Default Settings gt Build gt Compiler 然后勾选 Build project automatically
  • 【Java笔记+踩坑】SSM整合

    导航 黑马Java笔记 踩坑汇总 JavaSE JavaWeb SSM SpringBoot 瑞吉外卖 SpringCloud SpringCloudAlibaba 黑马旅游 谷粒商城 目录 1 SSM整合入门案例 图书的增删改查 1 1
  • ebtables介绍

    ebtables是与iptables类似的命令 区别在于ebtables用于对以太网帧的过滤 iptables用于对ip数据包的过滤 过滤流程见图 原图来源于 http blog csdn net wuruixn article detai
  • 力扣刷题——数组(2)

    将每个元素替换为右侧最大元素 给你一个数组 arr 请你将每个元素用它右边最大的元素替换 如果是最后一个元素 用 1 替换 完成所有替换操作后 请你返回这个数组 示例 输入 arr 17 18 5 4 6 1 输出 18 6 6 6 1 1
  • 网络基础:ACL与NAT

    目录 一 理论 1 ACL 2 NAT 二 实验 1 基础ACL 2 高级ACL 3 静态NAT 4 Easy IP 一 理论 1 ACL 1 ACL ACL 是Access Control List的简写 中文名称叫做 访问控制列表 它是
  • 面向对象设计原则——合成复用原则

    合成复用原则又称为组合 聚合复用原则 Composition Aggregate Reuse Principle C ARP 定义 尽量使用对象组合 而不是继承来达到复用的目的 合成复用原则就是在一个新的对象里通过关联关系 包括组合关系和聚
  • nRF52832 — Keil中如何配置RAM地址

    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XX 作 者 文化人 XX 联系方式 XX 版权声明 原创文章 欢迎评论和转载 转载时能告诉我一声就最好了 XX 要说的
  • 1.新建按钮,窗口,按钮移动

    include my widget 01first project h include
  • IMU监测髋关节术后康复状况

    髋关节置换手术是一种用于治疗磨损导致的关节炎的针对性手术 为许多忍受长期疼痛和失去活动能力的患者带来了新生 2020年 在美国进行的所有初级和修正全髋关节置换术中 分别有约10 和20 的手术使用了双动臼杯 DM 因为与传统的单动关节相比
  • java环境的配置,下载jdK安装及安装

    1 java环境的配置下载jdK安装 2 jdk exe会解析两个文件jdk文件 jre文件 安装步骤 1 JDK jdk1 7 0 75 windows x64 exe 下载 选择 Accept License Agreement 根据系
  • RN开发系列<8>--Redux(1)入门篇

    1 Redux的基本用法 前言 说明 本文只针对移动端的Redux的基本用法进行描述 希望这一篇文章 就能帮助你搞定redux的基本用法 甚至不用再去查阅其他文档 因为我个人脑子比较笨 查阅了很多文档 看了不少视频资料才理解了 2 原理阐述