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

一.项目所用的各种框架

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

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

因为我们只需要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中去判断把已经初始化的函数进行清理,避免造成多次初始化。

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/archi...
作者简介:前端新人,现任MaxLeap UX团队成员,主要从事于react开发,一直对hybrid混合app感兴趣。

相关文章
webpack 入门

关于我们
MaxLeap 为App开发、运营提供一站式后端云服务, 包括应用开发所需的后端云数据库、云数据源、云代码、云容器、 IM、移动支付、应用内社交、第三方登录、社交分享等基础服务,以及针对应用运营的数据分析、推送营销,用户支持等服务, 覆盖移动应用的研发、运营完整生命周期,致力于让移动应用开发运营更快速简单。

ReactJS 开发过程中的一些使用心得相关推荐

  1. html网页制作之细谈HTML前端项目开发过程中的细节及心得_避免入坑

    细谈两类前端项目与编写过程中的技巧.心得 快乐的五一小长假,由于回家路途遥远,只好自己在校编前端网页.两天多的时间编写了两种不同风格的网页,人都敲傻了,还好只涉及到了HTML和CSS,并未加入JS模块 ...

  2. 软件项目开发过程中主要遇到的核心问题小结

    最近在北京组织管理某银行的现金管理系统项目的开发,对软件项目开发过程中遇到的问题进行一些心得体会小结,怕时间长了没及时写下来时间久了被遗忘了,现在趁项目还在开发过程,把体会相对深刻时,感受到的一些问题 ...

  3. 浅谈Taro和Apollo在开发过程中的实践

    一.什么是Taro Taro是凹凸实验室研发的一套遵循React语法规范的多端开发的解决方案.使用Taro,可以只书写一套代码,再通过 Taro 的编译工具,将源代码分别编译出可以在不同端(微信/百度 ...

  4. 搬砖之路----MusicPlayer 一个基于Vlc(2.0+)开发的android音乐播放器--浅析在android开发过程中播放器选择之路!

    前言 MusicPlayer 是一款基于vlc播放器开发的一个音乐播放器,你也可以理解为在此核心上的搬砖之路,核心的内容并不是我写的,因此在正式写blog之前,感谢那些vlc核心的开发人员让我用到这么 ...

  5. 嵌入式系统开发过程中遇到的——volatile

    嵌入式 系统开发过程中遇到的-- volatile 对于不同的计算机体系结构,设备可能是端口映射,也可能是内存映射的 .如果系统结构支持独立的 I/O 地址空间,并且是端口映射,就必须使用汇编语言完成 ...

  6. Asp.net开发过程中,我们会遇到很多Exception

    在Asp.net开发过程中,我们会遇到很多Exception,不处理这些Exception的话会出现很难看的页面. 还有一些我们未预料到的Exception,当发生Exception时,我们也必须进行 ...

  7. 项目开发过程中的收获与思考

    2013年7月,我正式毕业了,到公司入职,也就正式成为了一名菜鸟程序员.到今天,2014年1月3日,目前主要的工作是公司一个项目中的一个功能模块,到我进入项目组算起,已经过了四个月了.因此,想写点东西 ...

  8. 小视频开发过程中最关注的两点关键

    小视频凭借它独有的特征在互联网领域获得了属于自己的一席之地,斩获搞笑.游戏.美食等行业后,在教育.财经等方面还拥有更加可观的发展前景.那么,在小视频开发过程中应该怎样结合它的能力实现业务上的突破呢? ...

  9. 人工智能和大数据的开发过程中需要注意这12点

    https://www.toutiao.com/i6636522371094151694/ 2018-12-19 10:16:15 人工智能是近年来科技发展的重要方向,在大数据时代,对数据采集.挖掘. ...

最新文章

  1. 在java中实现滚动文字,通过线程实现文字在屏幕上不停滚动,为什么文字不显示啊,求指点...
  2. 推荐一本好书《改变,从阅读开始》
  3. 在VMware环境Windows server 2003下测试磁盘阵列实验
  4. linux 同步 多终端,Linux系统如何实现不同终端间的同步
  5. Recall(召回率) Precision(准确率) F-Measure E值 sensitivity(灵敏性) specificity(特异性)漏诊率 误诊率 ROC AUC
  6. bmp转换tiff c++代码_如何用Java语言将图像转换为PDF?Spire.PDF for Java轻松搞定
  7. SOAP协议初级指南(9)
  8. [置顶] Android adb root权限
  9. java jdbc jar包_通过 Spring 框架如何进行JDBC操作呢?
  10. 生成式对抗网络GAN生成手写数字
  11. SG 函数初步 HDU 1536 amp;amp; HDU 1944
  12. mtk驱动sensor移植
  13. 云通讯赛道掀起并购潮 背后有哪些新趋势暗流涌动?
  14. word当前页面设置第一页
  15. 网友心中的高分电影合集,大家一起来拯救剧荒!欢迎补充!!!
  16. NOIP2017普及组★跳房子
  17. 微服务架构(Microservices)
  18. 共享服务中心建设原则-《企业IT架构转型之道-阿里巴巴中台战略思想与架构实战》
  19. php保留两位小叔_PHP价格格式化,保留两位小数
  20. C++使用socket实现与微信小程序通信

热门文章

  1. 【Python】AttributeError: 'Series' object has no attribute 'order'
  2. 微信小程序获取windowHeight出现不同页面高度不一致问题及解决方案
  3. 使用弹性布局来解决令人烦恼的垂直居中问题~~
  4. 解决window.location.href 下载文件时,一次点击产生两次下载+页面跳转问题
  5. eslint 验证vue文件 报错 unexpected token =解决方法
  6. Electron使用时拦截HTTP请求的解决方案
  7. mysql union (all) 后order by的排序失效问题解决
  8. 如何在Mac OS X 10.6.4上卸载Python 2.7?
  9. 如何使用bcrypt在PHP中对密码进行哈希处理?
  10. C ++ Singleton设计模式