ReactJS 开发过程中的一些使用心得

ReactJS作为目前最火的构建用户界面的前端框架,为什么有那么多的前端工程师去追逐它,不仅因为它简单,而且它提供了一系列强大的API让我们摆脱以前繁琐的DOM操作,使我们的逻辑更加清晰,代码更加简单。

一.项目所用的各种框架

在我目前开发的项目中,前端UI框架使用的是framework7,ReactJS用来构建用户界面,reflux用来操作数据(主要负责数据请求和数据操作)。

Framework7不仅提供了UI界面,而且还封装了一堆类似jQuery的DOM操作API,而ReactJS是facebook工程师开发的构建用户界面的前端类库,提供了强大的diff算法,在内存中直接操作虚拟DOM,所以Framework7ReactJS结合,有点不伦不类。

因为我们只需要framework7提供的UI样式,而并不需要它那一堆操作DOM的API,对于没有接触过ReactJS的新同学来说,思维肯定难以转变,可以直接操作DOM那肯定比较爽,react通过state直接更改界面样式的一边玩去吧!所以造成开始进入这项目时,我也是直接操作DOM,所以造成前期代码紊乱,后期维护困难。中途过程中,对于framework7没有的dom操作API,我又引入的Jquery和各种类库。

而且由于我们项目使用的是spa模式,所以造成后期通过webpack打包的bundle.js多达4M,在低端android机上,加载时间长达几十秒。其实使用react开发的项目完全没必要再引入操作DOM的前端框架,react操作虚拟DOM的性能和速度完全不是直接操作DOM可比的。那样只会造成的应用的卡顿和加载缓慢。

目前开发的项目中为了仿原生ios效果(如果自己去通过React重新实现的话,成本极大),所以不得不使用Framedmework7来作为前端UI库。

二.ReactJS简单的介绍

什么是React?下面是来自React中文文档的说明:

React 是一个 Facebook 和 Instagram 用来创建用户界面的 JavaScript 库。

很多人认为 React 是 MVC 中的 V(视图)。

我们创造 React 是为了解决一个问题:构建随着时间数据不断变化的大规模应用程序。为了达到这个目标,React 采用下面两个主要的思想。

1:仅仅只要表达出你的应用程序在任一个时间点应该长的样子,然后当底层的数据变了,React 会自动处理所有用户界面的更新

2:数据变化后,React 概念上与点击“刷新”按钮类似,但仅会更新变化的部分。

下面谈谈我对React上面两个思想的理解:

1.React有着极其强大的API,当数据源发生改变,都会触发Render,这也就意味着你只需要关注数据整体,其他的一切React这个框架会去完成,降低了开发的难度和逻辑的复杂程度。

2.当数据源改变之后,React会在内存中通过diff算法,去比较数据源是否发生更改,在去决定是否更改DOM。因为React有一个非常强大的虚拟DOM系统,所以会在内存中去完成对DOM的所有操作,随后在通过Render函数把对DOM的修改反应到实际DOM中。

许多人一听,React那么强大,是不是很难?其实非也,React中API少的可怜,非常简单易懂,最常用的也就几个生命周期函数和Render。

三.React中的生命周期

1.componentDidMount

组件已经加载到DOM中会执行这个函数,在这个函数中可以初始化一些将要执行的函数,在React生命周期中只会执行一次。在开发中,在该函数中执行的setState,在随后通过this.state并不能够马上拿到,可以通过定时来获取。

2.componentWillMount

在组件将要挂载到DOM中执行,这个函数我基本上很少用到。初始化工作我基本上在constructor和componentDidMount中去完成。

3.componentWillUnmount

组件从DOM中移除会执行这个函数,在此可以清理无用的DOM和事件。

4.componentWillUpdate

组件将要更新执行。可以在这个函数中清理在componentDidUpdate绑定的事件(这个方式很有用)。

5.componentDidUpdate

组件已经更新执行这个操作。可以在这个函数中初始化需要state中的数据源作为参数的函数。为了防止初始化多次,可以在componentWillUpdate中清理。看下面这个需求:

需要实现一个一元夺宝模块,导航栏下有一个tab栏显示一元夺宝共进行了多少期,当前期数默认第一个tab显示(可滑动)。如下图:

一元夺宝

这个使用的是swiper.js来实现的。只能在从服务器获取到期数后实现,所以我们在compoenntDidUpdate中去初始化:

初始化

但是我们同时可能又会去获取购物车数量等等进行其他更新state的操作,根据React的生命周期,只要state发生改变,就有可能(shouldComponentUpdate返回true)会去执行componentDidUpdate。这样就会造成这个函数的多次初始化。所以我们必须在componentWillUpdate中去判断把已经初始化的函数进行清理,避免造成多次初始化。

unmount

6.shouldComponentUpdate

这个函数提供给我们这些开发者是否允许数据源发生改变后去执行Render的控制权。默认这个函数始终返回true。返回false的话,render函数不会执行,componentWillUpdate和componentDidUpdate也不会执行。可以在这个函数中去执行逻辑判断,是否有必要去执行Render。为了追求更高的性能。可以手动去控制是否执行Render。

在开发过程中这些生命周期函数是我使用最频繁最常见的React操作。

学习React,只要掌握我们只关心数据源,并进行setState,去更新state触发Render就ok了。到此为止,React中的生命周期大致记录到这,以备忘记,进行复习只用。

React入门并不难,但是深入.....

作者信息
原文作者系力谱宿云 LeapCloud 团队_UX成员:zhiyingzzhou 【原创】
首发地址:https://blog.maxleap.cn/archives/1033
作者简介:前端新人,现任MaxLeap UX团队成员,主要从事于react开发,一直对hybrid混合app感兴趣。

时间: 2024-08-03 03:34:00

ReactJS 开发过程中的一些使用心得的相关文章

第二十九篇:USER MODE DLL开发过程中的调试技巧心得分享

最近由于项目需要,被老板安排开发一个WINDOWS USER MODE DLL, 即WINDOWS用户模式下的动态链接库. 写代码,实现具体的功能这类初等工作,对于大多数软件开发工程师来讲,只是时间与工作量上的问题,具体的WINDOWS DLL的知识点,本人参考了Jeffrey Richter的<WINDOWS核心编程>中的DLL几章,不再熬述. 这里谈一下关于USER MODE DLL在调试过程中所涉及到的一些知识点,以及它们彼此之间的关系: 1. DebugBreak / int 3; 2

软件开发过程中的审查 (Review)

http://blog.csdn.net/horkychen/article/details/5035769 软件开发过程中的审查 (Review) 希望别人做些什么->定义出流程 希望别人做出正确的结果->定义出审查制度 软件开发项目中包括很多的审查动作,贯穿于整个开发过程.个人认为审查主要有以下目的: 1.尽早排查出潜在的问题(Potential Risk/Issue) 经过其他人的参与,以不同的视角提出不同的看法,会有类似头脑风暴的效果,集思广议来查找工程师未能注意的问题. 2.保持良好

BaseAdapter中重写getview的心得以及发现convertView回收的机制

转载自:http://blog.csdn.net/pkxiuluo01/article/details/7380974 以前一直在用BaseAdapter,对于其中的getview方法的重写一直不太清楚.今天终于得以有空来探究它的详细机制. 下面先讲讲我遇到的几个问题: 一.View getview(int position, View convertview, ViewGroup parent )中的第二个参数是什么含义: 二.View的SetTag和getTag方法的用途: 先来解决第一个问

软件开发过程中如何避免争吵?

软件开发过程中,对一个问题有不同意见是很正常的,不同思想的碰撞可以带来进步,但是如果沟通不当,引发争吵,从而延误项目开发进度,就会得不偿失了. 要做到避免争吵,首先得自我反思,自己是不是哪里做得不对,问题没考虑清楚.问题还没明白就去和别人争,就是你的不对了. 其次,要站在别人的角度先想一想问题.是不是PM有难言之隐,公司的压力过大,不能采纳我的建议? 设计师看问题的角度是不是和我不一样?我的代码编写是否规范,有没有给复审测试人员带来麻烦?项目有没有充分考虑并达到用户的需求?在和别人争论前,必须充

net开发过程中Bin目录net开发过程中Bin目录下面几种文件

.net开发过程中Bin目录下面几种文件格式的解释 在.NET开发中,我们经常会在bin目录下面看到这些类型的文件: .pdb..xsd..vshost.exe..exe..exe.config..vshost.exe.config 项目发布的时候,往往搞不清楚哪些是需要的,那些是不需要的.那么这些格式的文件到底是干什么用的呢? pdb .pdb文件,是VS生成的用于调试的符号文件(program database),保存着调试的信息.在VS的工程属性,C/C++,调试信息格式,设置/Zi,那么

软件开发过程中要主要的问题

结合软件开发生命周期,软件开发过程中应注意的问题如下(个人愚见) 1)明确项目概况,即将项目定位,要结合需求和技术实现,对项目进行准确定位,制定合理的项目开发计划. 2)面对需求变化,需求变化是软件开发过程经常碰到的问题也是致命的问题,排除客户的问题,需求分析要做的足够好,需求分析做好后,最好要客户确认签字. 3)模块划分,把软件系统按照任务需求或者数据模型进行模块划分,提高系统开发进度. 4)编码规范,项目编写代码过程中要有详细的编码规范,如合理的程序文件结构(每个程序文件应由标题.内容.附加

node.js项目开发问题集锦(不定期更新,随时把开发过程中遇到的问题加上)

1.用express开发站点时,怎么定义通用的头部和尾部 方案1:用类似asp时代的include添加,如ejs模板: <% include ../header.ejs %> <h1 class="page-header"> 这里是内容. 注:..表示header.ejs在上一级目录,ejs扩展名可以去掉,直接写:include ../header </h1> <% include ../footer %> 方案2:用类似于MVC的lay

关于web前端开发过程中SEO优化的注意点

SEO优化通俗点说就是为了让网站在各大搜索引擎中更容易的被搜到,即提高搜索排行,从而提高网站流量的一个技术手段 在写web页面的时候,为了让网络爬虫更容易的搜索到页面,需要注意几个点: html语义化 刚接触web前端开发的时候很奇怪,既然html标签可以通过css进行更改它的内置属性,为什么还有这么多的标签存在 <div>,<h1>,<span>,<strong>.... 而现在,随着对前端的不断深入,才逐渐明白它的用处 语义化的html可以让开发者更容易

解决Python开发过程中依赖库打包问题的方法

在Python开发的过程中,经常会遇到各种各样的小问题,比如在一台计算机上调试好的程序,迁移到另外一台机子上后往往会应为工程项目依赖库的缺失而造成错误. 除了一遍又一遍对着被抛出错误去重新install各种相关的依赖库,有没有更好的方法来解决Python开发过程中依赖库的打包呢?答案是肯定的. 类似于JavaScript的npm,Python也有它强大的包管理工具--pip,我们可以用pip导出项目中的dependency: 1 $ pip freeze > requirements.txt 然