react的设计思想

1.Virtual DOM(虚拟dom)

为什么要使用虚拟dom呢
1.dom渲染在渲染中是最昂贵的,尽量减少dom操作,避免“推到重来”,项目越复杂,影响越严重
2.js运行效率高

<div class='box' id='content'>
  <div class='title'>Hello</div>
  <button>Click</button>
</div>

在继续讲解之前,我们先讲几个概念
什么是jsx

const element = <h1>Hello, world!</h1>;

这种表达式类型的标签语法就是jsx
JSX主要以干净且简洁的方式保证了组件中的标签与所有业务逻辑的互相分离

什么是虚拟dom
每个 DOM 元素的结构都可以用 JavaScript 的对象来表示。你会发现一个 DOM 元素包含的信息其实只有三个:标签名,属性,子元素

{
  tag: 'div',
  attrs: { className: 'box', id: 'content'},
  children: [
    {
      tag: 'div',
      arrts: { className: 'title' },
      children: ['Hello']
    },
    {
      tag: 'button',
      attrs: null,
      children: ['Click']
    }
  ]
}

下面对比一下真实dom和虚拟dom的区别
比如我们要生成一个有href和title属性的内容为React的a元素


image.png

如下是使用原生DOM生成的元素:


var a = document.createElement('a')
a.setAttribute('class', 'link')
a.setAttribute('href', 'https://github.com/facebook/react')
a.appendChild(document.createTextNode('React'))

那么使用虚拟DOM(我们要明白一点,虚拟dom是我们写的react UI代码经过jsx转化后样子,我们平常是不写虚拟dom)则代码为如下:

var a = React.createElement('a'(这里是标签名), {
    className: 'link',
    href: 'https://github.com/facebook/react'
}(这里是属性), 'React'(这里是子元素))

把jsx语法转换为虚拟dom的是react的createElement方法

在React的实际开发中,UI会根据数据的不同进行展示,当数据变化时,React会重新构建整个DOM树,然后将当前的DOM树和之前的比较,得到DOM树的区别,然后仅仅把变化的部分反映到实际的浏览器UI更新上。
也正是由于虚拟dom,UI会根据数据的不同进行不同的展示,成为数据驱动型

2.key的运用

react利用key来识别组件,它是一种身份标识,就像我们的身份证用来辨识一个人一样。
为什么要有key,我们来用表格的数据来讲解,比如后台返回了100条数据,每个数据都有一个id,代表唯一的身份,我们拿来做key值。当我们添加一条数据的时候,那么数据渲染的时候,只会渲染这第一条,后面的不会渲染,因为后面的key值都没有变,这样子就大大的提高了渲染效率

1.key的值要稳定唯一

请使用后台返回的id(id是数据库生成的唯一主键)去写,这样每个值有对应的key

注意不要使用Math.Random()或者new Date()去写,这样每次都会销毁重新加载组件的,很浪费性能

2.index作为key是一种反模式

不要使用index作为key(如果用index作为key值,添加一条数据,添加的这条在第一个,以前的第一变成了第二,以此类推,那么所有的数据的key值都会改变,都会被渲染,就会变得异常吃力)

不过key值的唯一是有范围的,即在数组生成的同级同类型的组件上要保持唯一,而不是所有组件的key都要保持唯一

3.diff算法

首先让我先弄清楚diff算法是做什么用的?

React diff 会帮助我们计算出 Virtual DOM 中真正变化的部分,并只针对该部分进行实际 DOM 操作,而非重新渲染整个页面,从而保证了每次操作更新后页面的高效渲染

image.png

参考https://yq.aliyun.com/articles/586669

4.react fiber

什么是react fiber?
Fiber 是 React v16 中新的 reconciliation 引擎,或核心算法的重新实现。React Fiber 的目标是提高对动画,布局,手势,暂停,中止或者重用任务的能力及为不同类型的更新分配优先级,及新的并发原语等领域的适用性。

具体可参考
参考https://juejin.im/post/5ab7b3a2f265da2378403e57

5.react hook

什么是react hook?
Hooks 是一个新的草案,它允许你在不编写类的情况下使用状态和其他 React 特性

传统组件类的缺点是什么?
大型组件很难拆分和重构,也很难测试。
业务逻辑分散在组件的各个方法之中,导致重复逻辑或关联逻辑。
组件类引入了复杂的编程模式,比如 render props 和高阶组件。

具体可参考
http://www.ruanyifeng.com/blog/2019/09/react-hooks.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容

  • HTML模版 之后出现的React代码嵌套入模版中。 1. Hello world 这段代码将一个一级标题插入到指...
    ryanho84阅读 6,225评论 0 9
  • 3. JSX JSX是对JavaScript语言的一个扩展语法, 用于生产React“元素”,建议在描述UI的时候...
    pixels阅读 2,810评论 0 24
  • 我们先来直观认识React,对任何而一种工具,只有使用才能够熟练掌握,React也不例外。通过多Reac...
    六个周阅读 1,192评论 3 18
  • 先上源码 场景 于是琢磨是不是有什么方案可以在上传ipa包后可以自动通知相关人员。于是又了下面的一篇水文。 注 s...
    小弱鸡阅读 1,418评论 2 1
  • 记录时间:2018年6月28日 记录地点:湖南长沙 我怎么如此幸运,在婆婆的提醒下,今天就去四方坪的菜市场买了猪油...
    能量蓄水池阅读 107评论 0 0