首页
学习
活动
专区
圈层
工具
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

谈谈我这些年对前端框架的理解

对于视图的描述这件事 react 和 vue 用了不同的方案,react 是给 js 扩展了 jsx 的语法,由 babel 实现,可以在描述视图的时候直接用 js 来写逻辑,没啥新语法。...树的遍历有深度优先和广度优先两种方式,组件树的渲染就是深度优先的,一般是通过递归来做,但是如果能通过链表记录下路径,就可以变成循环。...这个通过把组件树改成链表,把 vdom 的生成从递归改循环的功能就是 react fiber。...内部也做了组件树的链表化(fiber)来把递归改成可打断的渲染,按照时间片来逐渐生成整个 vdom。...用数组的话顺序不能变,所以 hooks api 不能出现在 if 等逻辑块中,只能在顶层。 为了简化使用, hooks 最终使用了数组的方式。当然,实现起来用的是链表。

1K10

手写React的Fiber架构,深入理解其原理

本文会从jsx入手,手写一个简易版的React,从而深入理解React的原理。...怎么来拆分 上面我们自己实现的render方法直接递归遍历了整个vDom树,如果我们在中途某一步停下来,下次再调用时其实并不知道上次在哪里停下来的,不知道从哪里开始,即使你将上次的结束节点记下来了,你也不知道下一个该执行哪个...要想把这个处理写全,代码量还是不少的。 函数组件 函数组件是React里面很常见的一种组件,我们前面的React架构其实已经写好了,我们这里来支持下函数组件。...fiber节点 // hookIndex是当前函数组件内部useState状态计数 let wipFiber = null; let hookIndex = null; 因为useState只在函数组件里面可以用...用Hooks模拟Class组件 这个功能纯粹是娱乐性功能,通过前面实现的Hooks来模拟实现Class组件,这个并不是React官方的实现方式哈~我们可以写一个方法将Class组件转化为前面的函数组件:

1.7K41
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    从0到1实现一个虚拟DOM

    有两个概念: Virtual DOM 是真实 DOM 的映射 当虚拟 DOM 树中的某些节点改变时,会得到一个新的虚拟树。...算法对这两棵树(新树和旧树)进行比较,找出差异,然后只需要在真实的 DOM 上做出相应的改变。 用 JS 对象模拟 DOM 树 首先,我们需要以某种方式将 DOM 树存储在内存中。...如果能够用我们刚定义的 h(...) 函数代替 React.createElement(…),那么我们也能使用 JSX 语法。...现在让我们考虑子节点——它们中的每一个都是文本节点或元素。所以它们也可以用 createElement(…) 函数创建。...是的,这就像递归一样,所以我们可以为每个元素的子元素调用 createElement(…),然后使用 appendChild() 添加到我们的元素中: function createElement(node

    63220

    8个问题带你进阶 React

    jsx 的原理 自定义的 React 组件为何必须大写 setState 什么时候是同步,什么时候是异步? React 如何实现自己的事件机制?...React 事件和原生事件有什么区别 聊一聊 fiber 架构 React 事件中为什么要绑定 this 或者 要用箭头函数, 他们有什么区别 如果以上的问题你都懂的话, 那么你可以关闭这个网页了....三. react diff 原理, 如何从 O(n^3) 变成 O(n) 为什么是 O(n^3) ? 从一棵树转化为另外一棵树,直观的方式是用动态规划,通过这种记忆化搜索减少时间复杂度。...由于树是一种递归的数据结构,因此最简单的树的比较算法是递归处理。...React 事件中为什么要绑定 this 或者要用箭头函数? 事实上, 这并不算是 react 的问题, 而是 this 的问题. 但是也是 react 中经常出现的问题.

    96520

    从0到1实现一个虚拟DOM

    有两个概念: Virtual DOM 是真实 DOM 的映射 当虚拟 DOM 树中的某些节点改变时,会得到一个新的虚拟树。...算法对这两棵树(新树和旧树)进行比较,找出差异,然后只需要在真实的 DOM 上做出相应的改变。 用 JS 对象模拟 DOM 树 首先,我们需要以某种方式将 DOM 树存储在内存中。...如果能够用我们刚定义的 h(...) 函数代替 React.createElement(…),那么我们也能使用 JSX 语法。...现在让我们考虑子节点——它们中的每一个都是文本节点或元素。所以它们也可以用 createElement(…) 函数创建。...是的,这就像递归一样,所以我们可以为每个元素的子元素调用 createElement(…),然后使用 appendChild() 添加到我们的元素中: function createElement(node

    58440

    从实现一个React到深度理解React框架核心原理_2023-02-27

    函数是递归构建dom树,最后才append到root container,最终页面才渲染出来。...这种数据结构的好处就是方便找到下一个工作单元 Fiber包含三层含义: 作为架构来说,之前React 15的Reconciler采用递归的方式执行,数据保存在递归调用栈中,所以被称为stack Reconciler...还只是React.createElement函数创建的virtual dom树 }, } } function workLoop(deadline) { let shouldYield...如下图所示: React Element Tree是由React.createElement方法创建的树形结构对象 Fiber Tree是根据React Element Tree创建来的树。...: 函数组件对应的fiber节点没有对应的真实dom元素 需要执行函数才能获取对应的children节点,而不是直接从props.children获取 由于函数组件没有对应的fiber节点,因此在commit

    66910

    从零开始的 React 再造之旅

    第一步的目标是用原生 DOM 方式替换 React 代码。 JSX 熟悉 React 的读者都知道,我们直接在组件渲染的时候返回一段类似 html 模版的结构,这个就是所谓的 JSX。...这个对象描述了 React 创建一个节点(node)所需要的信息,type 就是 DOM 节点的名字,比如这里是 h1,也可以是函数组件,后面会讲到。...注意:React 并不会包裹字符串这类值,如果没有 children 也不会创建空数组,这里简单起见,统一这样处理可以简化我们的代码。 我们把本文的框架叫做 redact,以区别 react。...2个不同点: 函数组件的 fiber 节点没有对应 DOM 函数组件的 children 来自函数执行结果,而不是像标签元素一样直接从 props 获取,因为 children 不只是函数组件使用时包含的子孙节点...Redact 每次创建新的 fiber 树时都是直接创建 fiber 对象节点,而 React 会复用上一个 fiber 对象,以节省创建对象的性能消耗。

    85910

    通过编写简易虚拟DOM,来学习虚拟DOM 的知识!

    有两个概念: Virtual DOM 是真实DOM的映射 当虚拟 DOM 树中的某些节点改变时,会得到一个新的虚拟树。...算法对这两棵树(新树和旧树)进行比较,找出差异,然后只需要在真实的 DOM 上做出相应的改变。 用JS对象模拟DOM树 首先,我们需要以某种方式将 DOM 树存储在内存中。...如果能够用我们刚定义的 h(...) 函数代替 React.createElement(…),那么我们也能使用JSX 语法。...现在让我们考虑子节点——它们中的每一个都是文本节点或元素。所以它们也可以用 createElement(…) 函数创建。...是的,这就像递归一样,所以我们可以为每个元素的子元素调用 createElement(…),然后使用 appendChild() 添加到我们的元素中: function createElement(node

    1.5K30

    谈谈我这些年对前端框架的理解

    对于视图的描述这件事 react 和 vue 用了不同的方案,react 是给 js 扩展了 jsx 的语法,由 babel 实现,可以在描述视图的时候直接用 js 来写逻辑,没啥新语法。...树的遍历有深度优先和广度优先两种方式,组件树的渲染就是深度优先的,一般是通过递归来做,但是如果能通过链表记录下路径,就可以变成循环。...这个通过把组件树改成链表,把 vdom 的生成从递归改循环的功能就是 react fiber。...内部也做了组件树的链表化(fiber)来把递归改成可打断的渲染,按照时间片来逐渐生成整个 vdom。...用数组的话顺序不能变,所以 hooks api 不能出现在 if 等逻辑块中,只能在顶层。 为了简化使用, hooks 最终使用了数组的方式。当然,实现起来用的是链表。

    93120

    详解:如何用好React跨端框架开发小程序

    Taro 1/2 用 穷举 的方式对 JSX 可能的写法进行了一一适配,这一部分工作量很大,完全就是堆人力去适配 jsx ,实际上 Taro 有大量的 Commit 都是为了更完善的支持 JSX 的各种写法...从 JSON 数据到小程序渲染 如果在浏览器环境下,这个问题非常简单,JavaScript 可以直接创建 DOM 节点,只要我们实现使用递归,便可完成从 VNode 到 DOM 的还原,渲染代码如下:...上文中,我们讲到类 Vue 的小程序框架的模板是从 Vue 的 template 部分转成的; 类 React 的运行时小程序框架,jsx 很难转成模板,只有一个 Vnode 节点组成的镜像树。...上面代码,首先遍历了 root 数据中的 children 数组,遍历到每一项的话,用名字是 REMAX_TPL_1_CONTAINER 的模板组件继续渲染数据中的 root....Remax 创造性的用递归模板的方式,用相对静态的小程序模板语言实现了动态的模板渲染的特性。

    4.8K51

    react组件深度解读

    我们向它发送了一个用 React API 描述的对象树。React 使用这些对象生成显示所需 DOM 树的操作。...它只是一个JavaScript扩展,它允许我们用一个看起来像HTML 模板的语法来表示React的对象树。浏览器根本不需要处理 JSX ,React 也不必处理它!只有编译器才有。...从我们的角度来看,我们已经完成了这棵树。我们不管理任何行动。我们只管理 todos 数组本身的操作。七、class 组件React 也支持通过 JavaScript class 语法创建组件。...与函数组件不同的是,class 组件中的 render 函数不接收任何参数。八、函数与类在 React 中使用函数组件是受限的。因为函数组件没有 state 状态。...你不需要手动在类中创建实例,你只需要记住它就在 React 的内存中。对于函数组件,React 只使用函数的调用来确定要渲染的 DOM 实例。九、组件的优点术语 "组件" 被许多框架和库使用。

    5.6K20

    从实现一个React到深度理解React框架核心原理

    这也是React16版本以前的渲染过程注意,只有当整个dom树append到root container中时,页面才会显示第四章 Concurrent Mode在第三章中可以看到,当前版本的render...函数是递归构建dom树,最后才append到root container,最终页面才渲染出来。...这种数据结构的好处就是方便找到下一个工作单元Fiber包含三层含义:作为架构来说,之前React 15的Reconciler采用递归的方式执行,数据保存在递归调用栈中,所以被称为stack Reconciler...如下图所示:React Element Tree是由React.createElement方法创建的树形结构对象Fiber Tree是根据React Element Tree创建来的树。...:函数组件对应的fiber节点没有对应的真实dom元素需要执行函数才能获取对应的children节点,而不是直接从props.children获取由于函数组件没有对应的fiber节点,因此在commit

    60440

    从 React 源码彻底搞懂 Ref 的全部 api

    它一般是这么用的: 函数组件里用 useRef: import React, { useRef, useEffect } from "react"; export default function App...小结一下: 函数组件里用 useRef 创建 ref 变量,然后原生标签加个 ref 属性指向它 类组件里用 createRef 创建 ref 变量,保存到 this,然后原生标签加个 ref 属性指向它...render 阶段会从根组件开始 reconcile,根据不同的类型做不同的处理,拿到渲染的结果之后再进行 reconcileChildren,这个过程叫做 beginWork: 比如函数组件渲染完产生的...小结下 react 的流程: 通过 jsx 写的代码会编译成 render function,执行产生 vdom,也就是 React Element 对象的树。...我们再看下源码: forwarRef 函数其实就是创建了个专门的 React Element 类型: 然后 beginWork 处理到这个类型的节点会做专门的处理: 也就是把它的 ref 传递给函数组件

    96940

    前端二面react面试题整理

    基本上,这是一个模式,是从 React 的组合特性中衍生出来的,称其为纯组件,因为它们可以接受任何动态提供的子组件,但不会修改或复制输入组件中的任何行为。...对React实现原理的理解简版react 和 vue 都是基于 vdom 的前端框架,之所以用 vdom 是因为可以精准的对比关心的属性,而且还可以跨平台渲染但是开发不会直接写 vdom,而是通过 jsx...就分别是函数组件和类组件。...如果是函数组件,那就传入 props 执行它,拿到 vdom 之后再递归渲染。如果是 class 组件,那就创建它的实例对象,调用 render 方法拿到 vdom,然后递归渲染。...dom 创建前后就是 useEffect、useLayoutEffect 还有一些函数组件的生命周期函数执行的时候。

    1.1K20

    React入门看这篇就够了

    使用方式简单,性能非常高,支持服务端渲染 6 React非常火,从技术角度,可以满足好奇心,提高技术水平;从职业角度,有利于求职和晋升,有利于参与潜力大的项目 React中的核心概念 1 虚拟DOM(Virtual...) 函数将创建一棵新的React元素树, React将对比这两棵树的不同之处,计算出如何高效的更新UI(只更新变化的地方) 树中没有发生改变的子元素 Diff算法的说明 - 1 如果两棵树的根元素类型不同,React会销毁旧树,创建新树 // 旧树 ...它们接受用户输入(props),并且返回一个React对象,用来描述展示在页面中的内容 React创建组件的两种方式 1 通过 JS函数 创建(无状态组件) 2 通过 class 创建(有状态组件) 函数式组件...,就是一个组件的生命周期 组件生命周期函数的定义:从组件被创建,到组件挂载到页面上运行,再到页面关闭组件被卸载,这三个阶段总是伴随着组件各种各样的事件,那么这些事件,统称为组件的生命周期函数!

    4.6K30

    如何编写自己的虚拟DOM

    有两个概念: Virtual DOM 是真实DOM的映射 当虚拟 DOM 树中的某些节点改变时,会得到一个新的虚拟树。...算法对这两棵树(新树和旧树)进行比较,找出差异,然后只需要在真实的 DOM 上做出相应的改变。 用JS对象模拟DOM树 首先,我们需要以某种方式将 DOM 树存储在内存中。...如果能够用我们刚定义的 h(...) 函数代替 React.createElement(…),那么我们也能使用JSX 语法。...现在让我们考虑子节点——它们中的每一个都是文本节点或元素。所以它们也可以用 createElement(…) 函数创建。...是的,这就像递归一样,所以我们可以为每个元素的子元素调用 createElement(…),然后使用 appendChild() 添加到我们的元素中: function createElement(node

    95741

    React进阶

    JSX 本质上是一种语法糖,允许开发者使用类 HTML 标签语法来创建虚拟 DOM 通过 Babel:JSX — 编译 —> React.createElement (),如果不用 JSX,也可以使用...) 使状态逻辑复用变得简单可行 函数组件从设计思想上来看更加契合 React 的理念 Hooks 能够帮助实现业务逻辑的聚合,避免复杂的组件和冗余的代码(HOC 和 Render Props 也可以解决...,主要特征为同步的 “树递归”,其本质还是递归算法,而 React16 + 则采用了 Fiber 调和 # setState 是同步 / 异步?...“变化” 的判断不够精准导致的,而 Immutable 则可以让变化无处遁形 React.memo 与 useMemo 在函数组件中,也有类似 shouldComponentUpdate/PureComponent...React17 带来的新变化: 新的 JSX 转换逻辑 事件系统重构 Lane 模型的引入 在 React17 + 中: 编写 JSX 代码将不再需要手动导入 React 包,编译器会针对 JSX

    1.5K40

    【前端架构】从 JQuery 到 React、Vue、Angular——前端框架的演变及其差异

    AJAX 是基于 XML 的,所以现在我们用 JavaScript 发送 HTTP 请求时,使用的函数叫做 XMLHttpRequest。...React 选择扩展 JavaScript 并引入 JSX。而 Vue 创建了一个独立的模板语法。...树遍历有两种方法:深度优先和广度优先。组件树的渲染是深度优先的,一般通过递归来实现。递归调用不能暂停,可能会导致页面冻结。 但是如果我们用链表来记录访问路径,就可以把树的递归遍历变成数组的循环遍历。...将组件树变为链表,将virtual dom的生成由递归变为循环的机制有一个著名的名字:React Fiber。...React 在开始时也支持 mixins,但后来被弃用了。 React 组件有两种形式:类组件和函数式组件。对于类组件,像高阶函数这样的高阶组件(HOC)是重用代码的一种自然方式。

    2.2K20

    react组件用法深度分析

    我们向它发送了一个用 React API 描述的对象树。React 使用这些对象生成显示所需 DOM 树的操作。...它只是一个JavaScript扩展,它允许我们用一个看起来像HTML 模板的语法来表示React的对象树。浏览器根本不需要处理 JSX ,React 也不必处理它!只有编译器才有。...从我们的角度来看,我们已经完成了这棵树。我们不管理任何行动。我们只管理 todos 数组本身的操作。七、class 组件React 也支持通过 JavaScript class 语法创建组件。...与函数组件不同的是,class 组件中的 render 函数不接收任何参数。八、函数与类在 React 中使用函数组件是受限的。因为函数组件没有 state 状态。...你不需要手动在类中创建实例,你只需要记住它就在 React 的内存中。对于函数组件,React 只使用函数的调用来确定要渲染的 DOM 实例。九、组件的优点术语 "组件" 被许多框架和库使用。

    5.5K20
    领券