前端面试之Vue相关总结

Vue2中检测数组变化的限制和解决方法

vue2用下标设置数组没效果

  1. arr = [1,2] arr[0] = 0,页面上显示的arr并没有修改(如果对应下标是原始值;若是引用值)
  2. 解决1:Vue.Set
  3. 解决2:arr.splice (Vue会劫持splice方法) Vue2对对象是循环defineProperty(递归、深度)set时通知dep.notify();对于数组则是重写数组7个方法(push、pop、shift、unshift、splice、sort、reverse)时通知dep.notify();
    <div id="app">{{ arr[0].a }}{{ arr[1].a }}</div><script>var app = new Vue({el: '#app',data: {arr: [{ a: 2 }, { a: 600 }]},mounted() {setTimeout(() => {this.arr[1] = [{ a: 400 }] // 这样看不到400this.arr[1].a  = 800  // 这样能看到变成800}, 3000)}})</script>

vue2设置数组长度没效果

  1. arr.length-- ,页面上显示的arr并没有修改
  2. 解决1:Vue.Delete
  3. 解决2:arr.splice

Vue nextTick

Vue渲染是异步渲染,添加元素时不会马上渲染,而是到下一个tick才渲染。 nextTick的回调会在dom异步渲染完毕后执行(vue是组件级的,若一有数据就更新性能肯定不好)。并且vue是批量做渲染的 在外部添加3个 在nextTick里获取个数 只会打印一次
在这里插入图片描述

nextTick的实现

  • 如果支持promise,将回调放在then方法里
  • 若不,若支持MutationObserver,就xxx也是异步执行的
  • 若不,若支持setImmediate
  • 再不,setTimeout

computed method watch区别

  • method用在视图上,每次都去执行,开销大,而computed是具备缓存的,若依赖的属性无变化,不计算

Vue Plugin

  • 全局方法 Vue.xx访问
  • 全局指令
  • mixin
  • 原型上绑定方法 Vue实例this访问
  • 导出插件,在main.js里use
    在这里插入图片描述

Vue组件data返回函数

  • Vue组件可能存在多个实例,如果使用对象形式定义data,会导致他们共用一个data对象,那么状态变更将会影响所有组件实例;采用函数形式定义,在initData时会将其作为工厂函数返回全新的data对象,有效规避多实例之间状态污染问题。而Vue根实例只能有一个,不会有次问题。
    在这里插入图片描述

加key 高效更新dom

  1. key的作用主要是为了高效更新虚拟DOM,其原理是vue在patch(打补丁)过程中通过key可以精准判断两个节点是都是同一个,从而避免频繁更新不同元素,是patch过程更高效,减少dom操作量,提高性能
  2. 若不设置key还可能在列表更新时引发一些隐蔽的bug
  3. vue中在使用相同标签名元素的过渡切换时,也会使用到key属性,目的是为了让vue可以区分他们,否则vue只会替换其内部属性而不会触发过渡效果

在这里插入图片描述

  • 不使用key,更新时不知道每个元素的位置,所以在A更新A,B更新B,C更新为F,以此类推,实际更新了3次,从F开始FCD + 创建插入E (源码中,每次循环认为这5对是sameVnode,只能每次都去更新。而加了key能精准判断是否是相同节点)
    在这里插入图片描述
  • 使用key,只做了一次创建F并插入到C前面的操作(比较时,比较首位元素是否相同)

源码
在这里插入图片描述

  • 没有设置key时,key的值是undefined,两个未设置key的标签值被判断为相同

  • diff算法不是最优,增加key优化了diff,降低复杂度

  • 加key

index作为key

  • 在数据会增减时可能会产生问题,在头部插入,在中间删除(数量变化,index是在变的)
  • random作为key,随机数还是有可能是一样的

vue-router的原理

  • vue-router通过hash与History interface两种方式实现前端路由,更新视图但不重新请求页面”是前端路由原理的核心
  • history模式则会将URL修改得就和正常请求后端的URL一样,如后端没有配置对应/user/id的路由处理,则会返回404错误
  • 它提供mode参数
  • hash带# new HashHistory 是基于location.hash来实现的。Location.hash的值就是URL中#后面的内容。当hash改变时,页面不会因此刷新,浏览器也不会请求服务器。
  • history更像url new HTML5History

update beforeUpdate

总结:

  • 不能笼统地说能修改或不能修改数据
  • 修改的数据未渲染到视图不会触发这2个钩子
  • this.msg = this.msg + 1是有可能引起死循环的操作
  • beforeUpdate修改视图数据不会再次触发beforeUpdate 即使++也没关系
  • updated修改视图数据为常量,会再触发一轮beforeUpdate → update;因此,若在此生命周期++会死循环

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/250788.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JS和安卓 IOS的交互 例子式记录

(function () { var u navigator.userAgent; var isAndroid u.indexOf(Android) > -1 || u.indexOf(Adr) > -1; //android终端 var isiOS !!u.match(/\(i[^;];( U;)? CPU.Mac OS X/); if(isAndroid){ (function(){ function android_i…

vue --- ref属性获取dom元素和子组件的方法

说明: // 假设login的组件定义如下: Vue.component(login, {template:<h1>登录</h1>,data(){return {msg:son msg,}},methods(){show(){console.log(调用子组件的方法);}} }) // 在父元素中使用 <div id"app"><login ref"myLogin"&g…

【工程师综合项目二】React + Koa2打造『JS++官网管理后台』

Redis认知、安装与操作 MongoDB&#xff1a;动态数据库&#xff0c;如游戏中需要频繁地保存人物的坐标 Oracle&#xff1a;收费&#xff0c;企业级 mac要安装homebrew&#xff08;包管理工具&#xff09; window安装Redis程序运行教程 命令行Redis操作 启动&#xff1a; redis-…

webpack --- html-webpack-plugin

安装 cnpm i html-webpack-plugin -D配置 (webpack.config.js) // webpack 是基于node构建的,webpack的配置文件中,任何合法的Node代码都是支持的 var path require(path)// 在内存中生成src下的index.html,同时自动将打包好的bundle.js 导入到页面中 var htmlWebpackPlugin…

nyoj164——卡特兰数(待填坑)

题意&#xff1a;将1~2n个数按照顺时针排列好&#xff0c;用一条线将两个数字连接起来要求&#xff1a;线之间不能有交点&#xff0c;同一个点只允许被连一次。 最后问给出一个n&#xff0c;有多少种方式满足条件。 卡特兰数&#xff08;列&#xff09;&#xff1a; 令h(0)1,h(…

git 使用

1. 先进入项目文件夹&#xff0c;通过命令 git init 把这个目录变成git可以管理的仓库 git init 2. 把文件添加到版本库中&#xff0c;使用命令 git add .添加到暂存区里面去&#xff0c;不要忘记后面的小数点“.”&#xff0c;意为添加文件夹下的所有文件 git add . 3. 用命令…

webpack --- 使用vue

// webpack中如何使用 vue: // 1. 安装vue 的包: cnpm i vue -S // 2. 由于在 webpack 中,推荐使用 . vue 这个组件模板文件定义组件, 所以需要安装能解析这种文件的loader cnpm i vue-loader vue-template-compiler -D // 3. 在main.js 中导入 vue的包, import Vue from vue…

ES6杂碎

1、let声明的变量没有变量提升&#xff1b; 2、const声明的变量&#xff1a;块级作用域内有效&#xff0c;存在暂时性死区&#xff0c;变量指向的那个内存地址不得改动&#xff1b; 3、...tail解构出来的是数组或空数组 let [head, ...tail] [1, 2, 3, 4]; head //1 tail //[2…

koa --- 自制简易的koa-router

打算自己写一个简单的Router类,来实现koa-router这个中间件的(部分)神奇功能 确定需求 1.首先导入需要在app.js里面导入自己写的Router类 2.然后是使用的方式和挂载router的方式 // 导入Router类 const Router require(./components/router.js);// 使用方式,(暂时只对get请…

MariaDB 脚本

研究MariaDB&#xff0c; 需要mock up一些假数据&#xff1a; 生成n个长度整型数的函数rand_num&#xff1a; CREATE DEFINERrootlocalhost FUNCTION rand_num(n INT) RETURNS int(5) begin DECLARE i INT DEFAULT 0; DECLARE result INT DEFAULT 0; WHILE i < n DOSET re…

Promise的基本使用

利用Promise是解决JS异步执行时候回调函数嵌套回调函数的问题&#xff0c; 更简洁地控制函数执行流程&#xff1b; 通过new实例化Promise&#xff0c; 构造函数需要两个参数&#xff0c; 第一个参数为函数执行成功以后执行的函数resolve&#xff0c; 第二个函数为函数执行失败…

软工作业PSP与单元测试训练

一、实现模块判断传入的身份证号码的正确性&#xff1b; 二、针对所实现的模块编写对应的单元测试代码&#xff1b; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.GregorianCalendar; import java.u…

koa --- nunjucks

安装: npm install koa-nunjucks-2 --save目录结构 |--- controller/ | |--- home.js |--- service/ | |--- home.js |--- views/ |--- app.js |--- router.jsapp.js // (部分) const nunjucks require(koa-nunjucks-2); app.use(nunjucks({ext: html,path: path.joi…

DNN模型训练词向量原理

转自&#xff1a;https://blog.csdn.net/fendouaini/article/details/79821852 1 词向量 在NLP里&#xff0c;最细的粒度是词语&#xff0c;由词语再组成句子&#xff0c;段落&#xff0c;文章。所以处理NLP问题时&#xff0c;怎么合理的表示词语就成了NLP领域中最先需要解决的…

天平称重【递归解法】

用天平称重时&#xff0c;我们希望用尽可能少的砝码组合称出尽可能多的重量。如果只有5个砝码&#xff0c;重量分别是1&#xff0c;3&#xff0c;9&#xff0c;27&#xff0c;81则它们可以组合称出1到121之间任意整数重量&#xff08;砝码允许放在左右两个盘中&#xff09;。 本…

算法 --- reduce的使用.

描述: 难点: 将[[‘a’,‘b’,‘c’],[‘d’,‘e’,‘f’]]输出为[“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”]. 关键代码描述: 1.假设我们已经根据输入的数字得到了 rawArr [[‘a’,‘b’,‘c’],[‘d’,‘e’,‘f’]] 2. 下一步将rawArr[0…

SpringBoot、mysql配置PageHelper插件

一&#xff1a;https://blog.csdn.net/h985161183/article/details/79800737 主要异常&#xff1a;org.springframework.beans.factory.BeanCreationException: Error creating bean with name com.github.pagehelper.autoconfigure.PageHelperAutoConfiguration: pageHelper.…

字符串的拆分以及分隔符所在不同位置的删除

try { //根据imComuserGroupMng获取这个数据库的所有ImComuserGroup数据 List<ImComuserGroup> list imComuserGroupMng.findAllComuserGroup(); //便利实体数据list为数据的集合 …

算法 --- 递归生成括号

问题描述 思路: 1.首先生成n个括号 2.左括号数量(记为l)不超过n 3.右括号数量(记为r)不超过n,且优先生成左括号(即 l < r) 4.需要设计一个递归式h(str,l,r) // 一开始,str , l 0, r 0 // 第一步进去,添加左括号, str(, l 1, r 0 // 然后因为 l < n . r < l 所以…

使用 TypeScript 改造构建工具及测试用例

最近的一段时间一直在搞TypeScript&#xff0c;一个巨硬出品、赋予JavaScript语言静态类型和编译的语言。 第一个完全使用TypeScript重构的纯Node.js项目已经上线并稳定运行了。 第二个前后端的项目目前也在重构中&#xff0c;关于前端基于webpack的TypeScript套路之前也有提到…