React 基本介绍

这篇具有很好参考价值的文章主要介绍了React 基本介绍。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1、React是什么

2、React 三大颠覆性的特点

2.1 组件

2.2 JSX

2.3 Virtual DOM

3、Flux 架构(redux)

3.1 Flux

3.2 redux

4、打包工具(webpack)

4.1 webpack与RequireJS、browserify

4.2 模块规范

4.3 非 JavaScript 模块支持

4.4 webpack 的特点与优势


1、React是什么

React 是 Facebook 推出的一个 JavaScript 库,它的口号就是“用来创建用户界面的 JavaScript 库”,所以它只是和用户界面打交道,你可以把它看成 MVC 中的 V (视图) 这一层。

2、React 三大颠覆性的特点

2.1 组件

React 的一切都是基于组件的,组件有着良好的封装性,组件可以让代码的复用和测试变得更加简单。各个组件都有着各自的状态,当状态变更时,便会重新渲染整个组件,组件化开发不仅仅应用于 React ,这也是 Web 的发展的趋势。

组件初始化:

React 基本介绍

组件更新:

React 基本介绍

组件卸载:

React 基本介绍 组件一般会涉及以下几个部分:

  1. props 属性
  2. state 状态
  3. 组件的生命周期
  4. 无状态函数式组件
  5. state 设计原则
  6. DOM操作

props 属性用于父子组件传值。

state 是当前组件保存的状态信息。

组件的生命周期包括组件初始化,更新,卸载对应的钩子函数。

无状态函数式组件是组件内部没有 state ,不需要组件的生命周期,这类组件可以写成一个纯函数,它只是根据输入生成组件,没有其他的副作用。

state 设计原则应遵循最小化 state 的准则,存储最简洁的数据,一下数据不应该包含到 state 中:

  • 可以由 state 计算得出的属性
  • 组件不需要存储在 state 中
  • props 中的数据,props 可以看做是数据的来源。

DOM操作,props 中的数据,props 可以看做是数据的来源。

2.2 JSX

一种直接把 HTML 嵌套在 JS 中的写法,一种类似 XML 的写法,它可以定义类似 HTML 一样简洁的树状结构,JSX 作为一种编译器,可以把类似 HTML 的结构编译成 JavaScript 。

2.3 Virtual DOM

Virtual DOM是一种对于 HTML DOM 节点的抽象描述,是一种用 JavaScript 实现的结构,不需要浏览器 DOM API 支持,将组件的 DOM 结构映射到 Virtual Dom 上,当需要重新渲染是,React 在 Virtual DOM 上实现了一种 Diff 算法,通过算法找到需要更新的节点,然后把里面的修改更新到实际需要修改的 DOM 节点上,这样可以避免渲染整个 DOM 带来的成本。

1、DOM

DOM (文档对象模型),它是 HTML,XML,XHTML 的一种抽象描述。把文档转换成树类型的数据结构,成为 DOM tree,随着树结构越来越复杂,以及对 DOM 节点的添加,删除或修改,事件的监听,回调,销毁需要处理,会导致大量 reflow,影响网页的性能。

2、Virtual DOM

Virtual DOM 是独立 React 所存在的,是用完全轻量的数据格式来代替庞杂的 DOM 结构来表述相同的内容。

可以用 JSX 来一种创造 ReactElement 的便捷写法。

ReactElement  是一种轻量级的、无状态的、不可改变的、DOM元素的虚拟描述。

3、比较差异

  1. 构建 Virtual DOM 树结构

          var tree = new Element ('div', {props: {id: 'test'}},'hello there');

  2. 将 Virtual DOM 树插入到真正的 DOM 中

          var root = render (tree, document.getElementById(container));
  3. 将 Virtual DOM 树插入到真正的 DOM 中

          var root = render (tree, document.getElementById(container));
  4. 通过 Diff 算法计算出两颗树的不同

          var patches = diff (tree, newTree);

  5. DOM 元素变更,使用 patch 方法,将计算的不用作用于Dom 上

          patch(root, patches);

3、Flux 架构(redux)

3.1 Flux

1、Actions:帮助向Dispatcher传递数据的辅助方法;

2、Dispatcher:接收action,并且向注册的回调函数广播payloads;

3、Store:应用程序状态的容器&并且含有注册到Dispatcher的回调函数;

4、View:React组件,从Store获取状态,并将其逐级向下传递给子组件。

实现 Flux 架构会增加代码量,但是它带来了清晰的数据流,并且合理地把数据和组件的 state 分析,所以我们根据场景来选择是否选择 Flux 。

3.2 redux

redux 是 Flux 架构的一种实现,redux 的三大特性:

(1) 单一数据源

     整个应用的state 存储在一个 JavaScript 对象上,用一个 store 的对象来存储整个 state 。

(2) state 是只读的

     不能直接在 state 上面直接修改数据,唯一的方法只能通过触发 Action 这一动作。

(3) 使用纯函数执行修改

     为了描述 action 怎样改变 state ,需要编写 reducer 来规定修改的规则。

redux 的几个组成部分:

(1) action

 action 是信息的载体,里面有action 的名称和要传递的信息,通过store 的 dispatch 方法传递,action 是 store 唯一信息来源。

(2) reducer

     action 定义了执行的操作,而reducer 就是定义state 如何响应。

(3) store

     store 则是保存整个工作流。

redux 的工作流:

React 基本介绍

redux 开发工具

Redux DevTools 是Redux作者开发的辅助工具,提供很强大的功能,主要有:

(1) 查看 store state 与 action 的内容。

(2) 撤销或重新执行 action 的能力,即所谓的“时间旅行” (Time Travel)。

(3) 修改 reducer 代码后自动重新执行先前的 action 一会应用状态。

(4) reducer 错误捕捉。

(5) 借助 persistState() store 增强工具,可以在刷新页面后恢复应用先前的状态。。

反模式

在软件工程中,反模式的定义是在实践中明显出现但又低效或是有待优化的设计模型,用来解决问题的带有共同性的不良方法。一下列举几种在 React 中情况:

(1) 基于 props 得到初始的 state

     得到 state 的值,不一定是不对的,但是如果用 props 而得到 state 的值,可能会导致维护 state 逻辑的正确性。

(2) 使用 refs 获取子组件

     通过 refs 去获取子组件,从而调用子组件里面的方法,这样会导致这种调用行为难以追踪。

(3) 冗余事实

     例如 state 的数据,如果谋一份数据可能不止一个来源,我们在所有消费这个数据的时候,会导致结果不一致的问题。

(4) 组件的隐式数据源

     如果某个组件直接去获取数据源,会导致组件行为不可预测,组件可复用性下降,一般情况下,我们的数据都是由父组件显式地传递进来。

(5) 不被预期的副作用

     在组件的 render 方法或 store 的 reducer 实现中,触发 action 或调用组件的 setState ,操作 DOM 发送 AJAX 请求等都是反模式的。

性能优化

(1) 避免过早的优化,着眼瓶颈。

(2) 性能分析,一般涉及到业务代码的行为,react 的行为。

(3) 区分生产和开发版本。

(4) 避免不必要的render,在组件的生命周期中的一个钩子, shouldComponentUpdate方法,会获取两个参数 nextProps 和 nextState ,常见的实现是对新旧 porps 和 state 进行比较,进而判断是否进行 render。

(5) 合理地拆分组件。

(6) 合理地使用组件内部的 state。

4、打包工具(webpack)

webpack 作为一款打包工具,功能强大,配置灵活,特有的 code spliting方案正戳中了大规模复杂web应用的痛点,简单loader/plugin开发使它很快拥有丰富的配置功能与生态。

4.1 webpack与RequireJS、browserify

RequireJS 是一个模块加载器,基于AMD(Asynchronous Module Definition)规范实现。

RequireJS 往往是一个个单独的文件,RequireJS 从入口开始,递归地进行静态分析,找出所有直接或间接被依赖(require)的模块,然后进行转换与合并。

// bundle.js

define('hello', [], function(require){

  module.export = 'hello'

});

define(say, ['require', 'hello'], function(require){

  var hello = require('./hello')

});

browserify 是Node.js 模块为出发点的工具,最大的特点有两点:

(1)对CommonJS规范(Node.js 模块所采用的规范)的模块代码进行的转换与包装。

(2)对很多Node.js 的标准 package 进行了浏览器的适配,只要是遵循CommonJS规范的 JavaScript 模块,即使是纯前端代码,也可以用他打包。  

4.2 模块规范

RequireJS 本身依照 AMD 规范来实现,例如:  

define ( function ( require ) {

  module.exports = 'hello';

})

AMD 将模块实现的代码通过匿名函数( 即 AMD 的工厂方法,factory) 中实现作用域的隔离,通过文件的路径作为模块 ID 实现命名空间的控制,将模块的工厂方法作为参数传入全局的 define ( 由模块加载器事先定义),使得工厂方法的执行时机可控,也相当于变相模拟出了同步的局部 require ,因而 AMD 的模块可以不经转换的在浏览器中执行。

Browserify 支持的则是 CommonJS规范的 JavaScript 模块。例如:  

// hello.js

module.exports = 'hello';

相比 RequireJS 的 AMD 规范,去掉了 define 以及工厂方法的外壳,所以是无法直接在浏览器中执行,但是在 NodeJS环境中, CommonJS 模块书写起来更加简单和干净,所以很多前端项目开始采用 CommonJS 规范的模块方式。

4.3 非 JavaScript 模块支持

在组件化开发的越来越流行的趋势下,我们应将局部的逻辑进行封装,通过尽可能少的接口与其他组件进行组装和交互,可以将逻辑大的项目逻辑拆成一个个小的相对独立的部分,以减少开发和维护的负担。

在 RequreJS 的方案中,非 JavaScript 模块的资源虽然得到了支持,但支持的并不完善。

在 browserify 中,可以通过各种 transform 插件实现不同类型的引入与打包。

在 webpack 中, 与 browserify  的 transform 相对应得是 loader ,但是功能更加丰富。

4.4 webpack 的特点与优势

(1) 代码拆分(code splitting) 方案   

可以将应用代码拆分为多个快( chunk ) , 每个块包含一个或多个模块,块可以按需异步加载。

(2) 智能的静态分析 

可以将应用代码拆分为多个块( chunk ) , 每个块包含一个或多个模块,块可以按需异步加载。

(3) 模块热替换 

当修改完某一个模块后无需刷新页面,即可动态将受影响的模块替换为新的模块,以便执行新的模块逻辑。文章来源地址https://www.toymoban.com/news/detail-479731.html

到了这里,关于React 基本介绍的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • react中的redux的了解,三大核心理念以及三大原则

    1、要学习redux首先我们先了解下函数式编程中的纯函数;我们最基本的javascript符合函数式编程,因此他也有纯函数。 纯函数:在程序中,若一个函数复合下面的条件,那么这个函数就可以被称为纯函数: ⑴这个函数在相同输入值时,需产生相同的输出。纯函数的输出和输入

    2023年04月08日
    浏览(35)
  • 【React】组件三大核心属性

    🚩🚩🚩 💎个人主页: 阿选不出来 💨💨💨 💎个人简介: 一名大二在校生,学习方向前端,不定时更新自己学习道路上的一些笔记. 💨💨💨 💎目前开发的专栏: JS 🍭Vue🍭React🍭 💨💨💨 state是组件对象最重要的属性,值是对象(可以包含多个key-value的组合)。 组件被成为

    2024年01月18日
    浏览(35)
  • React三大属性

    我是南城余!阿里云开发者平台专家博士证书获得者! 欢迎关注我的博客!一同成长! 一名从事运维开发的worker,记录分享学习。 专注于AI,运维开发,windows Linux 系统领域的分享! 知识库链接: D2 · 语雀 组件的实例对象三大属性 这三个核心都是建立在类定义的组件上,

    2024年01月23日
    浏览(30)
  • React组件实例的三大属性

    React组件实例的三大属性分别是:state、props和refs。 State属性:用来存储组件内部的状态,只能在组件内部修改。当state被修改时,React会重新渲染组件。 Props属性:用来传递父组件的数据到子组件中,是组件的只读属性,无法在子组件中修改。当props被修改时,React会重新渲染

    2024年02月13日
    浏览(34)
  • JavaSE、JavaEE、JavaWeb 三大工程目录详解

    本博主将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识,有兴趣的小伙伴可以关注博主!也许一个人独行,可以走的很快,但是一群人结伴而行,才能走的更远! JavaSE、JavaEE 和 JavaWeb 是 Java 开发中的三个重要框架,它们都是为了支持 Java 应用程序的开发而设计

    2023年04月09日
    浏览(36)
  • 三大前端技术(React,Vue,Angular)

    React(也被称为React.js或ReactJS)是一个用于构建用户界面的JavaScript库。它由Facebook和一个由个人开发者和公司组成的社区来维护。 React可以作为开发单页或移动应用的基础。然而,React只关注向DOM渲染数据,因此创建React应用通常需要使用额外的库来进行状态管理和路由,Red

    2024年02月09日
    浏览(52)
  • 分享 | 软件测试的基本流程是什么?软件测试流程详细介绍

    软件测试和软件开发一样,是一个比较复杂的工作过程,如果无章法可循,随意进行测试势必会造成测试工作的混乱。为了使测试工作标准化、规范化,并且快速、高效、高质量地完成测试工作,需要制订完整且具体的测试流程。 不同类型的软件产品测试的方式和重点不一样

    2024年02月05日
    浏览(47)
  • React从入门到实战 -组件的三大核心属性(1)state

    State state是组件对象最重要的属性, 值是对象 (可以包含多个Key-value的组合) 组件被称为状态机,通过更新组件的state来更新对应的页面显示(重新渲染组件) 有状态的组件 除了使用外部数据(通过this.props访问)以外,组件还可以维护其内部的状态数据(通过this.state访问

    2024年02月10日
    浏览(36)
  • 一文搞定:前端如何选择Angular、React和Vue三大主流框架

    在前端开发领域,目前最流行的三个框架是Angular、React和Vue.js。这些框架非常高效,并且它们各自具有一系列的优缺点。 在AI辅助编程工具 CodeGeeX 的后台中,也看到有大量的前端开发者使用这三个框架,并且Vue的使用率在 CodeGeeX 的后台中,持续走高。接下来我们针对Angular、

    2024年02月09日
    浏览(54)
  • 【ChatGPT】GPT实现原理大解析——看完就知道什么叫颠覆

    ChatGPT 能够自动生成类似于人类写作的文本,这一点非常引人注目,也令人意外。但它是如何实现的?为什么它能够如此出色地生成我们认为有意义的文本?我的目的是在这里概述ChatGPT内部的运行情况,并探讨它能够如此出色地产生有意义文本的原因。 首先需要解释的是,

    2023年04月25日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包