浅了解react

51 阅读5分钟

本文已参与[新人创作礼]活动,一起开启掘金创作之路。

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第19天,点击查看活动详情juejin.cn/post/714765…

react是什么

react是用于构建用户界面的js框架,是一个将数据渲染为html视图的开源js库(主要操作Vdom呈现页面)

react的特点

  1. 声明式设计(可以轻松描述应用)
  2. 高效(使用虚拟DOM和diff算法,尽量减少与真实dom的交互)
  3. 灵活(可以与已知的库或框架有很好的配合)
  4. jsx(用于生成虚拟DOM,是js的语法扩展)
  5. 组件(通过react构建组件,使代码得到复用)
  6. 单向响应的数据流(父向子传递,比传统的数据绑定更简单)
  7. 在React Native中可以使用React语法进行移动端开发

学习react的原因

  1. 原生js操作dom繁琐,效率低
  2. 使用js直接操作dom,浏览器会进行大量的重排重绘。
  3. 原生js没有组件编码方案,代码复用率低。

react和其他框架相比的优点

  1. 组件的组合模式
  2. 单向数据流(好处就是数据传递路线更清晰,不容易出现错误,即使出现错误了也更容易定位错位)
  3. 高效的性能 (react实现原理:通过react抽象生出的一个对象:也就是轻量级的虚拟dom,通过它来操作真实dom,虚拟dom本质上就是一个对象。像操作一个对象一样。描述真实dom应该是什么样的,应该怎么呈现,有虚拟dom更新管理真实dom。由diff算法来提升虚拟dom转为真实dom的速度,提高效率)
  4. 分离的框架设计:react.js现在的版本已经将源码分开为reactDOM 和react.js。这就意味着react不仅仅能够在web端工作。甚至可以在服务端node.js和Native工作。
diff算法

用于将虚拟DOM转为真实DOM的。计算出虚拟DOM中真正变化的部分,并只针对该部分进行原生DOM操作,而非渲染整个页面,达到高效率。
三大策略:

  1. tree diff web UI中DOM节点跨层级的移动操作特别少,可以忽略不计。(在大多数统计的操作下操作,基本不会把这个东西拿到外面)
  2. component diff 拥有相同类的两个组件 生成相似的树形结构。(哪里变了改哪里)
    拥有不同类的两个组件 生成不同的树形结构。(跟原来不一样的直接替换掉)
  3. element diff 对于同一层级的一组子节点,通过key区分。(这个key是手动添加的,相当于一个id。作为它独一无二的标识。能快速的找到,如果不添加的话,对比的次数会增多效率也会变低。)

react应用范围

web端应用
原生应用:IOS Android安卓 Native移动端应用
node.js服务端渲染html。

react组件对象有四个属性

  1. state:控制组件更新的(数据内容的修改)状态。(state里面存储的其实就是从服务器拿到的数据,组件需要的数据,当数据发生变动时需要重新渲染)state只有类式组件才会有。因为state是组件实例对象中的,组件实例对象是由类生成的,所以只有在类式组件中才具有state属性
    state的值必须是一个对象,默认值是null,它是组件实例对象继承react.component来的,所以要在当前组件的构造函数进行初始化。就是constructor,但是constructor可以省略,省略的话可以直接写state这个属性放在class内部顶层即可。
    state的工作原理
    react组件实现组件可交互所需的流程,render()方法输出虚拟dom。虚拟dom转为dom。再在DOM上注册事件,事件触发setState()修改数据,在每次调用setState方法时,react会自动执行render方法来更新虚拟dom,如果组件已经被渲染,那么还会更新到dom中去

image.png
在想要修改更新的时候调用setState方法即可。组件状态发生改变时,可以通过this.setState修改状态。setState方法支持按需修改,如state有两个字段,仅当setState传入的对象包含字段key才会修改属性,,每次调用setState会导致重新渲染调用render方法,直接修改state不会重渲染组件

image.png
setState的工作原理(如何修改其状态)?
常用的通知react数据变化的方法是调用setState(data,callback),这个方法通过合并data到this.state,并重新渲染组件,渲染完成后,调用可选的callback回调。(组件更新完毕后调用的)
setState是同步还是异步?
在同步任务中,setState是异步的但是在异步任务中,setState是同步的,setState被设置成异步操作,是为了防止再多次大量修改状态时,长时间占用线程,其他任务无法发起,造成虚拟dom假死的问题,在异步任务中同步执行是因为本身setState就处在异步任务之中,不会影响其他任务。
2.props props相对于组件来说是外来属性,使用props可以从组件外部向组件内部传值,类似于函数的传参,他经常用于组件之间的传值,一种父级向子级传递数据的方式。
对传入的props进行限制(限制数据类型,默认值,必填项)

image.png

image.png
3.context

一:封装一个公共的context文件

image.png
二:在父组件引入封装的context文件然后利用Provider将state传给后代组件

image.png
三:子组件或后代组件想要state值是引入封装的context文件。不需要state文件的只需写后代组件其余什么都不写

image.png