首页 > 系统相关 >手撕Vue-提取元素到内存

手撕Vue-提取元素到内存

时间:2023-10-14 18:55:56浏览次数:37  
标签:Vue 提取 fragment 元素 vm 碎片 文档 内存

接着上一篇文章,我们已经实现了构建Vue实例的过程,接下来我们要实现的是提取元素到内存。

主要是通过文档碎片来实现,文档碎片是一个轻量级的文档,可以包含和控制节点,但是不会像真实的DOM那样占用内存,所以我们可以通过文档碎片来提高性能。

大致的思路是这样的:

  1. 创建一个空的文档碎片对象
  2. 编译循环取到每一个元素
  3. 返回存储了所有元素的文档碎片对象

在这个思路当中有一个注意点:

!> 只要将元素添加到了文档碎片对象中, 那么这个元素就会自动从网页上消失

大概是这样的,例如我们页面当中有一个 p 元素,我们将这个元素添加到文档碎片当中,那么这个元素就会从页面上消失,但是我们可以通过文档碎片对象来访问这个元素。

好了基本上就是这样的,我们来看一下代码:

image-20231014181103761

// 2.根据指定的区域和数据去编译渲染界面
if (this.$el) {
    new Compiler(this);
}
class Compiler {
    constructor(vm) {
        this.vm = vm;

        // 1.将网页上的元素放到内存中
        let fragment = this.node2fragment(this.vm.$el);
        console.log(fragment);
    }

    node2fragment(app) {
        // 1.创建一个空的文档碎片对象
        let fragment = document.createDocumentFragment();

        // 2.编译循环取到每一个元素
        let node = app.firstChild;
        while (node) {
            fragment.appendChild(node);
            node = app.firstChild;
        }

        // 3.返回存储了所有元素的文档碎片对象
        return fragment;
    }
}

标签:Vue,提取,fragment,元素,vm,碎片,文档,内存
From: https://www.cnblogs.com/BNTang/p/17764540.html

相关文章

  • Vue3| Pinia 的 action 异步写法
    import{defineStore}from'pinia'import{ref}from'vue'importaxiosfrom'axios'exportconstuseChannelStore=defineStore('channel',()=>{  constchannelList=ref([])  constgetList=()=>......
  • Vue3| Pinia 的语法
    Pinia是Vue的最新状态管理工具,是Vuex的替代品Pinia的优势:1.提供更简单的API(去掉了mutation)2.提供符合组合式风格的API(和Vue3新语法统一)3.去掉了modules的概念,每一个store都是一个独立的模块4.配合TypeScript更加友好,提供可靠的类型推断 Pinia基本......
  • vue webpack 报错处理
    1.vue-cli3中console.log报错:ModuleWarning(from./node_modules/eslint-loader/index.js):error:Unexpectedconsolestatement(no-console)at(1).原因:使用ESLint检查代码质量是进行提示的.(2).解决:window.console.log(res);2.图片引入:{id:1,src:require(......
  • Vue3| 组合式 API——provide 和 inject
    作用和场景:顶层组件向任意的底层组件传递数据和方法,实现跨层组件通信 跨层传递普通数据步骤:1.顶层组件通过provide函数提供数据provide('key', 顶层组件中的数据) 2.底层组件通过inject函数获取数据const message=inject('key')   //'k......
  • Vue3| 模板引用、defineExpose宏函数
    模板引用的概念:通过ref标识获取真实的dom对象或者组件实例对象 使用:1.调用ref函数生成一个ref对象<script setup>import {ref} from 'vue'const h1Ref=ref(null)</script>2.通过ref标识绑定ref对象到标签<script setup>import {ref......
  • 使用FMC连接SDRAM扩展STM32内存
    1.引脚初始化BSP_SDRAM_GPIO_InitvoidBSP_SDRAM_GPIO_Init(void){RCC_AHB1PeriphClockCmd(FMC_A0_GPIO_CLK,ENABLE);RCC_AHB1PeriphClockCmd(FMC_A1_GPIO_CLK,ENABLE);RCC_AHB1PeriphClockCmd(FMC_A2_GPIO_CLK,ENABLE);RCC_AHB1PeriphClockCmd(FMC_A3......
  • Vue3| 组合式 API 下的 子传父
    步骤:1.子组件内部通过emit方法触发事件①通过defineEmits编译器宏生成emit方法<script setup>const emit= defineEmits(['get-message'])  //get-message:可以触发的事件</script>②触发自定义事件,并传递参数<script setup>const emit= define......
  • Vue3| 组合式 API 下的父传子
    步骤:一、父给子传写死的值1.父组件中给子组件以添加属性的方式传值<script setup>import sonComVue from './son-com.vue'  //局部注册</script> <template><sonComVue message="黑马程序员"></sonComVue></template>2.子组件内部通过pro......
  • Vue3| 组合式API——computed 计算属性函数
    计算属性基本思想和Vue2的完全一致,组合式API下的计算属性只是修改了写法 核心步骤:1.导入computed函数<scriptsetup>import{computed}from'vue'</script>2.执行函数在回调参数中return基于响应式数据做计算的值,用变量接收<scriptsetup>import{com......
  • Vue3| 组合式API——reactive 和 ref 函数
    Vue中默认的数据并不是响应式的,如果我们希望数据是响应式的,则需要通过reactive或者ref进行处理。 reactive():作用:接收对象类型的数据作为参数传入并返回一个响应式对象reactive不能处理简单类型的数据 reactive使用步骤:1.在<scriptsetup>里,从vue包中导入......