百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

云端卫士实战录 React + Redux 前端项目实践

suiw9 2025-03-24 20:38 5 浏览 0 评论

《实战录》导语

本期分享人为云端卫士运营平台工程师张雨,将带来React + Redux 前端项目实践分享。

一、为什么选择React

首先,React是用来解决一个大型应用的数据变更问题。如果你的应用足够简单,比如数据不变更,那么用React的确没有必要,因为你还要浪费时间去生成虚拟DOM,而且不需要考虑状态的变化。

其次,React能自动处理数据变更后的UI。这样的话,代码就很少会直接处理DOM,那代码绝大多数都会处理数据的变更。这样会很大程度上简化代码。

二、实际项目中的运用

实际项目开发中,需要对 ES6 和 JSX 代码的构建、调试、代理、打包部署等进行一系列工程化的需求,我们选择webpack作为构建工具,编译解析ES6和JSX我们采用babel。

Webpack和React结合的强大之一就是,在修改了组件源码之后,不刷新页面就能把修改同步到页面上。这里需要用到两个库webpack-dev-server和react-hot-loader。

因为React的每一次更新都是全局刷新的虚拟DOM机制,所以React组件的热替换可以成为通用的加载器,从而极大提高开发效率。

下面介绍一些我们在实际项目中运用到的库。

1、react-redux

由于React只是MVC中的View层,我们需要搭配中间件使用。这里我们选择了Redux。React本身和Redux之间并没有之间的关联,我们借助react-redux这个库来做连接。react-redux提供了两个关键模块,provider和connect。connect真正意义上的连接了React和Redux。Redux的核心概念就是action、store和reducer,调用关系如下所示。

store.dispatch(action) --> reducer(state, action) --> final state

store:代表的是数据模型,内部维护了一个state变量,用例描述应用的状态。store有两个核心方法,分别是getState、dispatch。前者用来获取store的状态(state),后者用来修改store的状态。

action:对行为(如用户行为)的抽象,在redux里是一个普通的js对象。redux对action的约定比较弱,除了一点,action必须有一个type字段来标识这个行为的类型。

reducer:一个普通的函数,用来修改store的状态。传入两个参数 state、action。其中,state为当前的状态(可通过store.getState()获得),而action为当前触发的行为(通过store.dispatch(action)调用触发)。reducer(state, action) 返回的值,就是store最新的state值。

映射到我们的React应用中,store中维护的state就是我们的app state,一个React组件作为View层,做两件事:render和响应用户操作。于是connect就是将store中的必要数据作为props传递给React组件来render,并包装action creator用于在响应用户操作时dispatch一个action。

connect的API:

mapStateToProps:一个函数,返回值表示的是需要merge进props的state, mapDispatchToProps:可以是一个函数,返回值表示的是需要merge仅props的actionCreators,这里的actionCreator应该是已经被包装了dispatch了的,这里我们使用redux的bindActionCreators函数。bindActionCreators把action creators转成拥有同名keys的对象,但使用dispatch把每个action creator包围起来,这样可以直接调用它们。

2、redux-actions

我们引用了一个redux-actions库,用来生成基本action type函数模板代码。它的handleAction可以简化reducers的写法,不用写那么多switch语句。

3、react-router

react-router是官方维护的唯一可选的路由库,它通过管理URL,实现组件的切换和状态的变化。使用时,路由器Router就是React的一个组件。Router组件本身只是一个容器,真正的路由要通过Route组件定义。Route组件定义了URL和组件的对应关系,可以同时使用多个组件。

import { Router, Route, hashHistory } from 'react-router';

render((

), document.getElementById('app'));

4、redux-saga

我们使用redux-saga处理异步请求。redux-saga只在程序运行时被调用一次,在后台执行时监听store中被dispatch的action,继而决定对该action做什么样的处理。redux-saga提供了多种Effects用于处理各种任务,包括回调异步函数,启动一个后台任务,dispatch一个action等。

import { takeLatest, takeEvery } from 'redux-saga';

import { take, call } from 'redux-saga/effects';

import Api from '…';

function* watchUser(action) {

try {

const store = yield call(Api.watchUser, action.payload);

yield put({type: "GET_USER_SUCCESS", user: store});

} catch (e) {

yield put({type: "GET_USER_ERROR", message: e.message});

}

});

}

function* mySaga(){

yield takeLatest("GET_USER_SUCCESS", watchUser)

}

export default mySaga;

5、Fetch

请求后台接口,我们选择了Fetch。Fetch的主要优点有:①语法简单,更加语义化②基于标准Promise实现,支持async/await③同构方便,使用isomorphic-fetch。

6、immutable

Immutable Data 就是一旦创建,就不能再被更改的数据。对 Immutable 对象的任何修改或添加删除操作都会返回一个新的 Immutable 对象。Immutable 实现的原理是 Persistent Data Structure(持久化数据结构),也就是使用旧数据创建新数据时,要保证旧数据同时可用且不变。同时为了避免 deepCopy 把所有节点都复制一遍带来的性能损耗,Immutable 使用了 Structural Sharing(结构共享),即如果对象树中一个节点发生变化,只修改这个节点和受它影响的父节点,其它节点则进行共享。

三、后记

React天生的组件化使我们能够沉淀可重用、可维护、高性能的UI组件, 它的代码基本就是组件的组合,分而治之的方式让代码的可阅读性很高,容易理解。而基于Redux的架构,确定性的store很容易定位问题, 无论是新增业务还是修改bug都不再困难。并且React实现了Virtual DOM,效率和性能明显提高。

相关推荐

设置文件的默认打开方式(如何设定文件的默认打开方式)

在操作系统中,设置文件的默认打开方式可以让特定类型的文件始终使用你选择的程序打开。以下是Windows和macOS系统中设置默认打开方式的详细步骤:Windows系统方法1:通过文件属性设置右键点...

电脑怎么设置默认浏览器(电脑怎么设置默认浏览器?)

在电脑上设置默认浏览器的步骤因操作系统不同而有所差异。以下是Windows和Mac系统的设置方法:Windows系统方法1:通过系统设置打开“设置”:...

Java接口默认方法:灵活与约束并存

Java接口默认方法:灵活与约束并存在Java编程的世界里,接口作为定义行为规范的重要工具,一直扮演着举足轻重的角色。然而,在Java8引入了默认方法之后,接口的设计和使用方式发生了微妙的变化。今天...

Java8新特性之默认方法:为接口注入灵魂

Java8新特性之默认方法:为接口注入灵魂Java8发布时,它带来的最大创新之一就是接口的默认方法。这就像给一个传统的木偶注入了生命,让它不仅能动还能说话了。今天我们就来聊聊这个让Java开发者欢呼雀...

CentOS系统在不重启的情况下为虚拟机添加新硬盘

一、概述用过虚拟机的都知道,如果在系统运行的时候去给虚拟机添加一块新设备,比如说硬盘,系统是读取不到这个新硬盘的,因为系统在启动的时候会去检测硬件设备。但是我们也可能会遇到这样的情况,比如正在运行比较...

[常用工具] 基于psutil和GPUtil获取系统状态信息

本文主要介绍在Python3中利用psutil库获取系统状态,利用GPUtil获取gpu状态。psutil(processandsystemutilities)(进程和系统实用程序)是一个跨平...

Docker容器内执行宿主机指令(docker执行宿主机shell)

一背景最近项目有个需求,需要程序配置服务器IP并且可以重启服务器。如果程序直接部署在服务器,相信大家都会操作。但是程序是用docker运行的,在docker中执行指令就很麻烦了。...

容器网络调试怎么办?一条命令就搞定!

nsenter命令是一个可以在指定进程的命令空间下运行指定程序的命令。它位于util-linux包中。用途...

linux自动化巡检脚本集(linux服务器巡检内容以及标准)

以下是一个自动化巡检脚本集的制作方案,包含常见系统检查项和可扩展框架,使用Python和Shell脚本实现:...

麒麟KOS|统信UOS系统添加新数据盘
麒麟KOS|统信UOS系统添加新数据盘

原文链接:麒麟KOS|统信UOS系统添加新数据盘...

2025-03-26 16:57 suiw9

Linux CentOS 7 根目录扩容(linux扩展根目录磁盘空间)

一、现状描述现有一台CentOS7的虚拟机,硬盘容量为30GB通过lsblk命令查看分区容量,当前根目录容量为27.5GB左右二、扩容需求...

从Linux底层分析Docker原理(linux docker-compose)

写在前面如果你觉得本人对你有帮助,请你记得评论,点赞,关注;如果你觉得文章还不错请记得收藏,点赞。如果你觉得文章非常的好可以私信我,我会在第一时间回复你。...

CentOS新增硬盘的使用步骤(centos扩展硬盘)

一、查看机器所挂硬盘个数及分区情况,新增硬盘为/dev/sdb...

Python之psutil库简介(python3 pil库)

psutil(pythonsystemandprocessutilities)是一个跨平台的第三方库,能够轻松实现获取系统运行的进程和系统利用率(包扩CPU、内存、磁盘、网络等)信息。它主...

运维,你还不会查看Linux系统cpu信息?

CPU也称为微处理器或简称为处理器。就像大脑如何控制人体一样,CPU控制着计算机的所有部分。因此CPU被认为是计算机的大脑。那我们怎么在Linux系统中查看如IntelCorei3、i5、AM...

取消回复欢迎 发表评论: