当使用Vue2+Babel时,如何实现组件重新渲染

2023-11-19

在以前,我们写好静态的 html 后,多数的动态渲染是交给 jquery 来重写的,这样的操作无疑增加了维护的复杂性。于是,我们开始对老系统前端上使用了Vue 2.0 + Babel的架构。

为什么说Vue比jQuery好呢?

这主要从他们的原理着手。jq主要运用 Vanilla JS 的选择器机制。通过选择器筛选整个 html 页面的 DOM,然后使用链式函数来处理数据或重新渲染。相比之下,Vue.js 2.x 引入 Virtual DOM,比 Vue.js 1.x 的初始渲染速度提升了2-4倍,并大大降低了内存消耗。Virtual DOM 的概念最初由Google工程师提出,后在Meta的React框架中得到大规模的运用。相比于频繁的手动去操作dom而带来性能问题,vdom很好的将dom做了一层映射关系,进而将在我们本需要直接进行dom的一系列操作,映射到了操作vdom,而vdom上定义了关于真实dom的一些关键的信息,vdom完全是用js去实现,和宿主浏览器没有任何联系,此外得益于js的执行速度,将原本需要在真实dom进行的创建节点,删除节点,添加节点等一系列复杂的dom操作全部放到vdom中进行,这样就通过操作vdom来提高直接操作的dom的效率和性能。不仅如此,它也受 MVVM 的思想的影响,支持模块化及模板等功能。开发过程在就可以将html页面重新组织为多个View Model 从而降低前端开发的重复工作的时间成本。

虽然去年Vue升级到了第3版,但考虑稳定的生产环境,还是就目前情况推荐文档较多(其他开发者的踩坑文档)的Vue2。

Babel 让 IE 也能支持ES6的编译器

在国内绝大多数的生产环境都还是2010年的Web产物居多。并不是所有的公司都能拥有如BAT这样紧随时代技术的开发人员。例如一些地方的发票系统,还有一些院校或公共设施的后台系统。当然,也有一些例外,12306据说是委派拥有BAT相似能力的公司做的——神奇的验证功能(某个清华毕业生做的)。因此,项目至少需要保留ES2015的支持。

由此,我就找到了babel这个工具。只能说外国工程师和国内的不一样(腾讯和百度各自直接开发了一个浏览器,兼容当时的IE、FF、Chrome——加个Ad就能ZQ)。

ES6 和 ES5 的特点

ES6包括以下重要特性:

ES6 特性

  1. 箭头:这些是由 ‘=>’ 语法描述的函数
  2. 对象:对象字面量用于支持原型分配。
  3. Classes: ES6 类可以通过基于原型的面向对象模式轻松实现
  4. Destructing:它允许绑定模式,这主要基于模式匹配。
  5. 字符串插值
  6. 缺省
  7. 传播
  8. 模块加载器
  9. Weak set
  10. Map
  11. New Library
  12. Promises
  13. Proxies

ECMA Script 的第五版被称为 ES5 和 ECMA Script 2009。ES5 包括以下重要特性:

ES5 功能

  1. Strict Mode:它基本上通过应用更多检查和清理一些现有功能来帮助javascript语言更有效地执行
  2. Accessors :它允许用户通过使用方法来实现属性的获取和设置。
  3. 语法变化:
    • 尾随逗号
    • 多行字符串文字
    • 使用保留字的属性键
  4. 附加功能:在 ES5 中引入了一些附加的新功能。
    • 元编程:不同的原型用于相同的
      • Object.getPrototypeOf()
      • Object.create()
      • Object.defineProperty()
      • Object.keys()
      • Object.seal()
      • Object.freeze() etc.
    • 新方法
      • String.prototype.trim()
      • Array.isArray()
      • Array.prototype.indexOf()
      • Array.prototype.map()
    • 括号运算符的使用
    • JSON:
      • JSON.parse()
      • JSON.stringify()
    • 特定于 JSON 的内置对象:
      • Boolean.prototype.toJSON()
      • Number.prototype.toJSON()
      • String.prototype.toJSON()

相较而言两者语法:我更觉得ES6有了很多编译型语言的特性,而且语法更为简易,事实上也属于ES5和TS之间的过渡语言。最重要的是可以基于面对对象(原型)进行开发和维护。

Vue坑:

在Vue中,也存在一些坑。我就简单介绍一个常见的

Vue重新渲染

Vue重新渲染的方法其实有很多种。如 Michael Thiessen所言:

  • 可怕的方式:重新加载整个页面
  • 可怕的方式:使用v-if hack
  • 更好的方法:使用 Vue 的内置forceUpdate方法
  • 最佳方法:在组件上更换Key
可怕的方式:重新加载整个页面

相当于每次要关闭应用程序时重新启动计算机

window.location.reload();
可怕的方式:使用v-if hack

Vue 附带了一个指令,该指令仅在为 true 时才会呈现组件。如果为 false,则该组件将根本不存在于 DOM.

以下是我们如何设置它以使hack工作.

你可以添加template

<template>
    <component v-if="renderComponent" />
</template>

在你的方法中使用scriptnextTick

export default {
    data() {
        return {
            renderComponent: true,
        };
    },
    methods: {
        forceRerender() {
            // Remove component from the DOM
            this.renderComponent = false;

            this.$nextTick(() => {
                // Add the component back in
                this.renderComponent = true;
            })
        }
    }
}

这里主要是通过Vue的生命周期原理来实现的。

更好的方法:使用 Vue 的内置forceUpdate方法

如果 Vue 在事情发生变化时自动更新,我们为什么要强制更新?

原因是有时 Vue 的反应系统可能会令人困惑,我们认为Vue 会对某个属性或变量的更改做出反应,但实际上并非如此。在某些情况下,Vue的反应系统根本不会检测到任何变化。

因此,就像最后的方法一样,如果您需要它来重新渲染组件,则可能有更好的方法。

您可以通过两种不同的方式在组件实例本身上以及全局调用 :forceUpdate

// Globally
import Vue from 'vue';
Vue.forceUpdate();

// Using the component instance
export default {
    methods: {
        methodThatForcesUpdate() {
            // ...
            this.$forceUpdate(); // Notice we have to use a $ here
            // ...
        }
    }
}
最佳方法:在组件上更换Key

Vue中key属性的作用

最简单的做法:

<template>
    <component-to-re-render :key="componentKey" />
</template>

export default {
    data() {
        return {
            componentKey: 0
        };
    },
    methods: {
        forceRerender() {
            this.componentKey += 1;
        }
    }
}

每次被调用时,我们的道具都会改变。当这种情况发生时,Vue 将知道它必须销毁组件并创建一个新组件。forceRerendercomponentKey

你得到的是一个子组件,它将重新初始化自身并"重置"它的状态。

一个简单而优雅的方式来解决我们的问题!

但是,如果您确实需要重新渲染某些内容,请选择key-changing方法而不是其他任何方法。

Babel 中 this 定义为 undefined

在Babel的箭头语法中会出现this定义为undefined。遇到这种情况往往需要将自己的箭头函数改为常用的function语句就可以了。

babel编译

package.js

"dependencies": {
    "babel-cli": "^6.26.0",
    "babel-polyfill": "^6.26.0",
    "babel-preset-env": "^1.7.0",
    "babel-preset-es2015": "^6.24.1",
    "babel-preset-es2015-ie": "^6.7.0"
}

命令为:

$ ./node_modules/babel-cli/bin/babel.js --presets babel-preset-es2015-ie \
    target.js -o output.js

推荐编写bash、zsh、bat之类的脚本来实现批处理。

感谢

写作不宜,请多多支持。同时也非常感谢参考文档中的作者。

参考文档:

  1. Priya Pedamkar 的 Difference Between ES6 vs ES5
  2. Michael Thiessen 的 强制 Vue 重新渲染组件的正确方法
  3. 考拉比利 的 Vue中key属性的作用
  4. michaelnthiessen.com 的 The Key Changing Technique
  5. Babel replaces this with undefined
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当使用Vue2+Babel时,如何实现组件重新渲染 的相关文章

  • 在 Javascript 中获取第一个数字出现后的子字符串

    我正在尝试提取第一个数字之后 并包括 的字符 ABC 123SD gt 123SD 123 gt 123 123SD gt 123SD ABC gt 我当前的解决方案如下 var string1 ABC 123SD var firstDig
  • 如何在 Firebase 远程配置中从 JSON 获取值

    我是 Android 应用开发和 Firebase 的新手 我想知道如何获取存储在 Firebase 远程配置中的 JSONArray 文件中的值 String 和 Int 我使用 Firebase Remote Config 的最终目标是
  • 仅单击 div 内部

    我正在为一个小网站制作教程 我只想让教程气泡可点击 因此 当我们尝试单击气泡之外的某些内容时 什么也不会发生 换句话说 我希望我的 html 不可点击 而 tutorial bubble 可点击 尝试这个 jQuery function h
  • 在 javascript、jQuery 或 css 中,如何让 div 或 iframe 展开以填充其余空间

    我有三个 iframe 我将顶部 iframe 设置为 50px 高度 将底部 iframe 设置为 50px 但我希望中间 iframe 扩展以填充其余空间 有没有一种技术可以用来对任何窗口屏幕尺寸执行此操作 谢谢 example
  • 如何防止 gulp-notify 破坏 Windows 中的 gulp-watch?

    我正在使用吞咽通知 https www npmjs org package gulp notify插入 这是我如何在 gulpfile js 中实现它的示例 您可以看到我也在使用 gutil 和 livereload 我不知道它们是否发挥任
  • 在 swift 中将简单字符串转换为 JSON 字符串

    我知道有一个同标题的问题here https stackoverflow com questions 30825755 convert string to json string in swift 但在那个问题中 他试图将字典转换为 JSO
  • 以一定时间间隔连续重复运行 JavaScript 函数

    这是我的第一个问题 希望您尽快回答 我想要代码连续重复一个函数 我尝试了一些代码 但没有成功 我尝试了这段代码 我想在一段时间后重复这个功能 我努力了setInterval and setTimeout 但是 我还没有收到结果 这将重复该任
  • 无法实例化模块 [$injector:unpr] 未知提供程序:$routeProvider

    我从 AngularJS 升级时收到此错误1 0 7 to 1 2 0rc1 ngRoute 模块不再是核心的一部分angular js文件 如果您继续使用 routeProvider 那么您现在需要包括angular route js在你
  • 使用文件 API 将资源加载到 Three.js 中

    我想创建导入 3D 模型以在浏览器中查看的功能 方法是使用File API http www html5rocks com en tutorials file dndfiles Three js 加载器在我托管的文件上运行良好 我的理解是加
  • 使用 JavaScript 生成 PDF 文件

    我正在尝试将 XML 数据从网页转换为 PDF 文件 并且希望能够完全在 JavaScript 中完成此操作 我需要能够绘制文本 图像和简单的形状 我希望能够完全在浏览器中完成此操作 我刚刚写了一个名为jsPDF https github
  • ToggleClass 动画 jQuery?

    我的网站上有一个部分 当用户单击时我希望它展开 我正在使用 jQuerytoggleClass为了这 expandable function e e preventDefault this closest article toggleCla
  • 在管道中重用变量的功能方式

    在 javascript 和 typescript 中与 Ramda 一起使用函数式编程 我经常发现自己编写如下代码 const myFun c gt const myId c id const value pipe getAnotherO
  • 在 React Navigation 中将 props 传递给自定义抽屉导航器

    在反应导航抽屉菜单中 我想显示用户名 John Doe 它处于我的主要组件的状态 Router 我怎样才能将自定义抽屉内容组件传递给它 额外信息 我从 AsyncStorage 中获取此名称 组件已挂载 这是我的代码 export defa
  • Google 地图 API:忽略 DirectionService 请求中的季节性限制

    我目前正在开发一张地图 其中显示两点之间的最短路线 使用不同的交通工具 我注意到 有时 例如在冬季关闭的道路不会被考虑在内 我发现我可以使用方向服务 下面的代码 忽略高速公路 收费站和渡轮 但我一生都无法弄清楚如何 是否可以忽略季节性限制
  • 计算文本选择的 xy 位置

    我正在尝试使用 DOM 元素创建自己的文本选择 是的 我的意思是当您在此元素中选择文本时 您会在文本后面看到蓝色背景 这个想法是停止默认行为 蓝色 并使用我自己的元素来完成工作 方法是找到选择的 xy 位置 然后放置绝对定位的元素 我希望能
  • 如何处理requireJs超时错误?

    我正在使用 require js 作为加载框架编写一个移动混合应用程序 我遇到加载错误的问题 我想做的是在设备离线且无法下载在屏幕上显示地图所需的 google 地图 API 脚本时设置后备解决方案 我得到的只是 Uncaught Erro
  • 从 DirectionsRenderer 中获取折线或标记的事件

    我正在使用 DirectionsService 和路线方法来生成 DirectionsResult 我还使用 DirectionsRenderer 对象来显示结果 因为它非常易于使用 我在检测 Directions changed 事件时没
  • Kubernetes / kubectl - “必须指定容器名称”,但看起来确实如此?

    我正在调试 kubectl 的日志输出 其中指出 Error from server BadRequest a container name must be specified for pod postgres operator 49202
  • Firebase 警告:使用 Firebase Cloud Function 搜索数据时使用未指定的索引

    我构建了一个 Firebase 云函数 用于查找 IsNotificationEnabled 值等于 true 的用户 我的部分职能 export const sendPushNotification functions https onR
  • Node.js - 重载函数

    有没有一种方法可以重载node js中的函数 类似于 noSuchMethod https developer mozilla org en JavaScript Reference Global Objects Object noSuch

随机推荐

  • CUDA+OPENCV+PYTHON tensorflow 源码环境搭建

    CUDA OPENCV PYTHON tensorflow 源码环境搭建 接上文caffe环境安装 https blog csdn net u012350025 article details 104589982 主机环境ubuntu18
  • 基于C++的带权无向图的实现 (五)- 连通图和连通分量

    该系列文章是本人整理的有关带权无向图的数据结构和算法的分析与实现 若要查看源码可以访问我的github仓库 如有问题或者建议欢迎各位指出 目录 基于C 的带权无向图的实现 一 数据结构 基于C 的带权无向图的实现 二 遍历算法 基于C 的带
  • 台式计算机怎么看有没有开独显,台式机独立显卡怎么样打开

    给台式机插入了独立显卡 但不会打开怎么办呢 下面由学习啦小编给你做出详细的台式机独立显卡打开方法介绍 希望对你有帮助 台式机独立显卡打开方法一 把显示器的数据连接线接到独立显卡上 用的就是独立显卡 把显示器的数据线连接在主板的显示输出口上
  • MyEclipse8.5的安装过程

    1 双击进行安装 点Next接受 选择好路径后 等待安装完毕 2 选择路径 3 进入工作台如下图 4 配置Tomcat 工具栏 Window Preferences 5 Myeclipse Servers Tomcat 选择版本 勾选Ena
  • 2029:【例4.15】水仙花数

    2029 例4 15 水仙花数 时间限制 1000 ms 内存限制 65536 KB 提交数 1247 通过数 720 题目描述 求100 999中的水仙花数 若三位数ABC ABC A3 B3 C3 则称ABC为水仙花数 例如153 13
  • springboot2.x默认采用cglib代理,以及配置jdk动态代理的方法

    众所周知 springboot开启AOP需要在启动类加上注解 EnableAspectJAutoProxy 但开发过程中发现即使不加 EnableAspectJAutoProxy 注解 bean还是被代理过 而且是Cglib代理对象 此时在
  • win32下Qt5BLE蓝牙开发笔记

    BLE简介 BLE蓝牙是蓝牙2 0以上的蓝牙模块 经典蓝牙是蓝牙2 0以下的蓝牙 蓝牙分为客户端和服务器两端 经典蓝牙可以通过socket编程进行客户端与服务器之间的通信 与网络socket相似 BLE蓝牙则无法使用这种方式进行通信 BLE
  • ICASSP 2023说话人识别方向论文合集

    今年入选 ICASSP 2023 的论文中 说话人识别 声纹识别 方向约有64篇 初步划分为Speaker Verification 31篇 Speaker Recognition 9篇 Speaker Diarization 17篇 An
  • 算法竞赛当中的思考方法——方法论篇。

    方法论 万物皆朴素的第一性原理 几乎任何领域的任何问题的解决方案 都可以看作是 某个结构上的朴素方法的优化 计算机只能处理规模有限的问题 在给定规模且不考虑效率的情况下 问题一定存在朴素解法 具体手段有直接模拟 利用bit枚举 各种搜索算法
  • Spring Cloud面试8连问,谁顶得住?

    问题一 什么是 Spring Cloud Spring cloud 流应用程序启动器是基于 Spring Boot 的 Spring 集成应用程序 提供与外部系统的集成 Spring cloud Task 一个生命周期短暂的微服务框架 用于
  • 数据结构-带头双向循环链表的基本实现(C语言,简单易懂,含全部代码)

    链表的概念和结构 概念 链表是一种物理存储结构上非连续 非顺序的存储结构 数据元素的逻辑顺序是通过链表中的指针链接次序实现的 结构 实际中链表的结构非常多样 以下情况组合起来就有8种链表结构 1 单向 双向 2 带头 不带头 3 循环 非循
  • java逆序输出一个整数_Java实现整数的逆序输出(三种方法)

    Java实现整数的逆序输出和C语言相似 下面我介绍三种方法 第一种 无限制整数的逆序输出 import java util Scanner class Cycle01 public static void main String args
  • Tulsi编译失败问题解决

    Tulsi编译失败 Xcode12 4 bazel 4 0 brew 20210218 tulsi最新 解决办法 跑了 usr local Cellar python 2 将这个目录去掉或者改名字为不可用 然后系统默认跑了python3就好
  • Qt—帮助系统

    一个完善的应用程序应该提供尽可能丰富的帮助信息 Qt中可以使用工具提示 状态提示以及 What s This 等简单的帮助提示 也可以使用Qt Assistant来提供强大的在线帮助 简单的帮助提示 已经讲到了工具提示和状态提示 这里简单介
  • java实现第五届蓝桥杯排列序数

    排列序数 如果用a b c d这4个字母组成一个串 有4 24种 如果把它们排个序 每个串都对应一个序号 abcd 0 abdc 1 acbd 2 acdb 3 adbc 4 adcb 5 bacd 6 badc 7 bcad 8 bcda
  • C之(9)函数内联(inline)深入分析

    C之 9 函数内联 inline 深入分析 Author Once Day Date 2023年8月9日 漫漫长路 有人对你微笑过嘛 参考引用文档 Using the GNU Compiler Collection GCC Inline 文
  • 数控技能大赛计算机程序设计员,第八届全国数控技能大赛决赛获奖名单

    近日 由人力资源社会保障部 教育部 科学技术部 中华全国总工会 中国机械工业联合会共同举办的第八届全国数控技能大赛完美落幕 大赛设置数控车工 数控车削加工技术 数控铣工 数控铣削加工技术 加工中心操作工 多轴联动加工技术 数控机床装调维修工
  • Python列表转换成字典、嵌套列表转字典、多个列表转为字典嵌套列表

    目录 两列表转为字典 多列表转为字典嵌套列表 嵌套列表转字典 方法一 直接内置dict 方法二 for循环 一个列表转字典 一 两列表转为字典 list1 key1 key2 list2 value1 value2 print dict z
  • SpringCloud Sentinel集成Gateway和实时监控

    目录 1 Sentinel集成Gateway 1 1 Sentinel对网关支持 1 2 GateWay集成Sentinel 2 Sentinel控制台 2 1 Sentinel控制台安装 2 2 接入控制台 2 3 可视化管理 2 3 1
  • 当使用Vue2+Babel时,如何实现组件重新渲染

    在以前 我们写好静态的 html 后 多数的动态渲染是交给 jquery 来重写的 这样的操作无疑增加了维护的复杂性 于是 我们开始对老系统前端上使用了Vue 2 0 Babel的架构 为什么说Vue比jQuery好呢 这主要从他们的原理着