面试题集二 ——react相关

1. react 虚拟DOM

  1. 将代码转换成JS对象,然后由JS对象转换成真实DOM
  2. 如果是首次渲染,其实vitruaDom不具有任何优势,甚至更加消耗内存,但是它的优势在于diff算法和批量处理策略
  3. react基于virtialdom自己实现了一套事件机制自己模拟事件冒泡,捕获,采用事件代理,批量更新,解决兼容性问题,它将virtualdom上的事件映射到真实的Dom事件,然后将所有的事件都代理到document上,进行统一分发
  4. react.createElement 将 props,children , 进行批量处理,传递给reactElement
  5. $$typeof 是一个symbol类型的变量,可以防止xss攻击,由于json中是不能存储symbol对象的
    (xss:它是通过对网页注入可执行代码且成功地被浏览器 执行,达到攻击的目的)

2. react 渲染流程

  1. 使用react.createElement /JSX 编写文件最后都会通过babel转换成 createElement
  2. createElement 对key和ref等props做了处理,获取defaultProps对默认props进行复制,对传入的子节点处理,最后形成虚拟dom
  3. reactdom.render将生成好的虚拟dom渲染指定容器上,然后采用了批量处理,事务机制等对指定浏览器进行性能优化,最后转换成DOM

3.setstate

调用setstate不用立即更新
setstate本身不是异步的,只是在调用setstate的时候,如果react处于更新状态。当前更新会暂停,等上一次更新执行后在执行


BH4JE_KPRLTQ@6RFS{`XG6A.png

4. bind(this)

  1. 由于在调用事件过程中并没有指定调用的组件所以需要手动绑定,否则this = undefined
  2. 箭头函数不会创建自己的this,它只会从自己作用域上一层继承this

5. react事件执行顺序

1.由于react的所有事件都是挂载到document上的,当真实的dom触发冒泡,到document后才会对react事件进行处理

  1. 先执行原生的事件
  2. 然后执行react合成事件
  3. 最后执行真正在document上挂载的事件

6. mixin , hook, hoc

  1. mixin:混入
    将一个对象的属性拷贝到另一个对象上,可以是多个,也可以是一个,这是extends无法实现的。
    缺点:1. mixin 可能会相互依赖,相互耦合,不利于后期的维护,2. 不同的mixin中的方法会冲突
  2. hoc
  • 渲染劫持
  • 操作props / state ,获取refs
  • 状态管理
    hoc实现功能
  • 通过原组件和其他组件进行组合渲染可以达到样式布局复用
  • 属性代理
  • 反向代理 -- super.render()
  • 根据特定属性觉得原组件是否渲染
    基本用途: 日志打点 / 权限控制 / 实现双向绑定(利用hoc 代理onchange方法和value属性)/ 表单校验 。。。
  • 实例:
    redux中的connect其实就是将mapStateTOProps 和 mapDispatchToProps分别解构后传递给原组件,这样就可以在原组件内直接通过props获取到state和dispatch函数
  • 优点
    高级组件时一个没有副作用的纯函数,各个高阶组件不会互相依赖耦合
    高阶组件并不关心数据使用的方式和原因,而被包裹的组件也不关心数据的来源
  • 缺点
    hoc可以劫持props ,在不遵守约定的情况下会造成冲突
    如果大量使用,对调试会由很多困难由于多层嵌套
  1. hooks
    只能在函数式中使用
  • 优势:
    减少状态逻辑复用的风险
    避免地狱式嵌套
    使用函数代替class

7. redux

  • redux的可预测性:1. 单一的数据源,应用只能有一个store. 2. 所有数据都是只读的,要想更新数据,必须dispatch一个action来更新3. 当处理action的时候,不得直接修改原始对象必须生成一个新的state
  • reducer是纯函数:同样的输入必定得到同样的输出,就可以保证同样的state就一定得到童话贵阳的view,所以reducer里不能改变state,只能返回一个权限的state对象
  • redux设计思想:web应用是一个状态机制,视图和状态是一一对应的。所有的状态,保存在一个对象里面。
  • Redux是如何将state注入到React组件上的: provider组件,将store传递给provider,通过connect接受、state和mapDispatchToProps

8. react新特性

  • Error Bounday
    如果组件发生错误,可以通过error boundary捕获优雅处理 配合使用了以恶新生命周期 componentDidCatch
  • render新增了返回的值类型:支持string / number / boolean / null / portal /fragment
  • portals可以把组件渲染到当前组件之外,多用于弹框之类的
  • setstate传入null就不会发生更新
  • 更好的服务器渲染 ,由于15的三倍
  • 采用了新的核心架构,fiber 将原来的同步更新转变成更新过程碎片化,避免长时间阻塞主线程使得应用渲染更加流畅
  • 支持自定义dom
  • 减少文件体积,从 161.7kb -> 109kb
  • call return (react-call-return npm)
    解决了父组件需要跟据子组件的回调信息去渲染子组件
  • fragment
    将一些子元素添加到dom tree,不需要为这些元素提供额外的父节点
  • createRef / forwardRef
    通过createRef获取red对象 forwardRef是ref的转发可以让父组件获得子组件的ref,从而操作子组件
  • 生命周期更新
    增加了getDerivedStateFromProps(nextprops,prestate)

9. diff算法

在调用react renderd 的时候,会创建react元素组成的树,在下一次,state和props更新的时候,相同的render会返回不同的树,就需要不叫这两棵树的差别,常规操作一般需要的算法的复杂度o(n^3),但是一旦元素过多则会开销过大,造成页面卡顿,所以,react提出了两个假设:

  1. 两个不停类型的元素会产生不同的树
  2. 开发者可以通过key,props来暗示哪些子元素在不同的渲染下保持稳定
    这样算法的复杂度就是o(n)
    可以分为: tree diff / component diff /element diff
  • tree diff
    react为了让运行效率更高,tree diff只对树进行同层对比,不去比较跨层的节点。
  • component diff
    同一层只要出现不是同一类型的组件,就替换该组件的所有子节点。
  • element diff
    主要是根据mountIndex和lastIndex进行比较,在确定是否移动 ,
    https://segmentfault.com/a/1190000010686582
  1. useEffect 和useLauoutEffect区别
    useEffect和useLayoutEffect的执行时机不一样,前者被异步调度,当页面渲染完成后再去执行,不会阻塞页面渲染。 后者是在commit阶段新的DOM准备完成,但还未渲染到屏幕之前,同步执行
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,837评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,551评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,417评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,448评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,524评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,554评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,569评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,316评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,766评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,077评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,240评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,912评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,560评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,176评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,425评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,114评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,114评论 2 352

推荐阅读更多精彩内容

  • 深入JSX date:20170412笔记原文其实JSX是React.createElement(componen...
    gaoer1938阅读 8,055评论 2 35
  • 原教程内容详见精益 React 学习指南,这只是我在学习过程中的一些阅读笔记,个人觉得该教程讲解深入浅出,比目前大...
    leonaxiong阅读 2,829评论 1 18
  • 今天的React题没有太多的故事…… 半个月前出了248个Vue的知识点,受到很多朋友的关注,都强烈要求再出多些R...
    浪子神剑阅读 10,075评论 6 106
  • React 中 keys 的作用是什么? Keys 是 React 用于追踪哪些列表中元素被修改、被添加或者被移除...
    e2ee31170666阅读 1,295评论 1 3
  • 40、React 什么是React?React 是一个用于构建用户界面的框架(采用的是MVC模式):集中处理VIE...
    萌妹撒阅读 1,010评论 0 1