前端面试之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,一经查实,立即删除!

相关文章

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…

git 使用

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

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

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

DNN模型训练词向量原理

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

算法 --- 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…

算法 --- 递归生成括号

问题描述 思路: 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套路之前也有提到…

solr7.4 安装与使用

1.solr7环境要求 solr7需要java8环境&#xff0c;且需要在环境变量中添加 JAVA_HOME变量。 2.solr 安装 下载地址 https://lucene.apache.org/solr/mirrors-solr-latest-redir.html 我下载为7.4版本 在solr5以前solr的启动都有tomcat作为容器&#xff0c;但是从solr5以后solr内…

ReactiveCocoa基础

本文转载自最快让你上手ReactiveCocoa之基础篇&#xff0c;在此基础上稍作修改&#xff0c;欢迎交流。 有关对 ReactiveCocoa 的看法可以看一下唐巧的这篇ReactiveCocoa 讨论会 ReactiveCocoa思维导图ReactiveCocoa简介 ReactiveCocoa&#xff08;简称为RAC&#xff09;,是由Gi…

配置OpenCV产生flann\logger.h(66): error C4996: ‘fopen': This function or variable may be unsafe问题

转载自&#xff1a;http://guoming.me/%E9%85%8D%E7%BD%AEopencv%E4%BA%A7%E7%94%9Fflannlogger-h66-error-c4996-fopen-this-function-or-variable-may-be-unsafe%E9%97%AE%E9%A2%98 今天使用vs2012配置OpenCV编译出现问题: 1>—— 已启动生成: 项目: Win32ForOpenCV245, 配…

javascript --- repeat的用处

描述 思路: 最多重复s.length次使用String.prototype.repeat(n)方法可以将字符串重复n次 核心: while( i < len/2){if( s s.slice(0,i).repeat(len /i) ) {return ture;} }总体代码: var repeatedSubstringPattern function(s) {let i 1;let len s.length;while (i …

模型评估——定量分析预测的质量

https://blog.csdn.net/hustqb/article/details/77922031 评分参数定义模型评价规则 公共案例预定义值根据度量函数定义你的评分策略应用你自己的评分对象使用多种度量指标分类度量 从二分类到多分类多标签精确度Cohens kappa混乱矩阵分类报告汉明损失Jaccard 相似性相关系数准…

javascript --- 对象的方式体验链式调用

将功能相近的方法写入同一个对象中,是一个很好的编程习惯,便于后期的维护和前期的开发. foo1 var fooObj {foo1: function() {console.log(foo1);return this;} } fooObj.foo1();此有一个对象: fooObj它有一个方法: foo1()foo1打印了一个字符串’foo1’,然后返回了当前的执行…

OPENCV-3 学习笔记

OPENCV-3 学习笔记 imread()读入图&#xff0c;第一个参数&#xff0c;const string&类型的filename&#xff0c;填我们需要载入的图片路径名&#xff0c; 第二个参数&#xff0c;int类型的flags&#xff0c;为载入标识&#xff0c;它指定一个加载图像的颜色类型。 named…

前端换行显示,后端返回br

转载于:https://www.cnblogs.com/lml-lml/p/9597547.html

MySql随笔part3 表操作

一:什么是表 表(table): 表似一种结构化的文件,可用来存储某种特定类型的数据.表中的一条记录有对应的标题,标题称之为表的字段 二:创建表 1 create table table_name( 2 字段名1 类型[(宽度) 约束条件], 3 字段名2 类型[(宽度) 约束条件], 4 字段名3 类型[(宽度) 约束条件] 5 …

node --- 监听文件变化(静态、动态、子进程)

静态版本:监听的文件名写死了 // watcher.js use strict const fs require(fs); fs.watch(target.txt, () > console.log(File changed!)); console.log(Now watching target.txt for changes...);命令行启动 node watcher.js动态版本:在命令行输入需要监听的文件名. pr…

es6 --- Promise封装读取文件操作

Promise: es6中为了解决回调地狱问题而产生的 Promise的参数 Promise的参数是一个函数.每个Promise在实例化时,都会立即执行参数里的函数 const p new Promise(()>{console.log(1); })// 解释了上面的第2条Promise参数的参数 Promise的参数(函数),默认有2个参数(resol…