总结
秋招即将开始,校招的朋友普遍是缺少项目经历的,所以底层逻辑,基础知识要掌握好!
而一般的社招,更是神仙打架。特别强调,项目经历不可忽视;几乎简历上提到的项目都会被刨根问底,所以项目应用的技术要熟练,底层原理必须清楚。
这里给大家提供一份汇集各大厂面试高频核心考点前端学习资料。涵盖 HTML,CSS,JavaScript,HTTP,TCP协议,浏览器,Vue框架,算法等高频考点238道(含答案)!
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
资料截图 :
高级前端工程师必备资料包
2、然后调用callHook函数触发beforeDestroy的钩子函数(callHook会触发参数中提供的钩子函数)。
(4)销毁实例的逻辑1
首先,需要清理当前组件与父组件之间的连接。组件就是Vue.js实例,所以要清理当前组件与父组件之间的连接,只需要将当前组件实例从父组件实例的$children属性中删除即可。
说明:Vue.js实例的$children属性存储了所有子组件
const parent = vm.$parent;
if(parent && !parent._isBeingDestroyed && !vm.$options.abstract){
remove(parent.$children,vm)
}
1、如果当前实例有父级,同时父级没有被销毁且不是抽象组件,那么将自己从父级的子列表中删除,也就是将自己的实例从父级的$children属性中删除。
2、事实上,子组件在不同父组件中是不同的Vue.js实例,所以一个子组件实例的父级只有一个,销毁操作也只需要从父级的子组件列表中销毁当前这个Vue.js实例。
export function remove(arr,item){
if(arr.length){
const index = arr.indexOf(item);
if(index>-1){
return arr.splice(index,1);
}
}
}
(5)销毁实例的逻辑2
1、父子组件间的链接断掉之后,需要销毁实例上的所有watcher,也就是说需要将实例上所有的依赖追踪断掉。
2、状态会收集一些依赖,当状态发生改变时会向这些依赖发送通知,而被收集的依赖就是watcher实例。因此,当Vue.js实例被销毁时,应该将实例所监听的状态都取消掉,也就是从状态的依赖列表中将watcher移除。
3、watcher的teardown方法,它的作用是从所有依赖项的Dep列表中将自己移除。即只要执行这个方法,就可以断掉这个watcher所监听的所有状态。
4、断掉Vue.js实例自身的watcher实例监听的所有状态。
if(vm._watcher){
vm._watcher.teardown();
}
5、执行了组件自身的watcher实例的teardown方法,从所有依赖项的订阅列表中删除watcher实例。删除之后,当状态发生变化时,watcher实例就不会再得到通知。
6、vm._watcher来源
当执行new Vue()时,会执行一系列初始化操作并渲染组件到实体上,其中就包括vm._watcher的处理
7、从Vue.js2.0开始,变化侦测的粒度调整为中等粒度,它只会发送通知到组件级别,然后组件使用虚拟DOM进行重新渲染。组件其实就是Vue.js实例。
8、怎么通知到组件级别
在Vue.js实例上,有一个watcher,也就是vm._watcher,它会监听这个组件中用到的所有状态,即这个组件内用到的所有状态的依赖列表中都会收集到vm._watcher。当这些状态发生变化时,也都会通知vm._watcher,然后这个watcher再调用虚拟DOM进行重新渲染。
(6)销毁实例的逻辑
1、只从状态的依赖列表中删除Vue.js实例上的watcher实例是不够的。Vue.js提供了vm. w a t c h 方 法 , 它 允 许 用 户 监 听 某 个 状 态 。 因 此 , 还 需 要 销 毁 用 户 使 用 v m . watch方法,它允许用户监听某个状态。因此,还需要销毁用户使用vm. watch方法,它允许用户监听某个状态。因此,还需要销毁用户使用vm.watch所创建的watcher实例。
2、从状态的依赖列表中销毁用户创建的watcher实例和销毁Vue实例上的watcher实例相同,只需要执行watcher的teardown方法。
3、问题:如何知道用户创建了多少个watcher?
1)Vue.js的解决方案是执行new Vue()时,在初始化的流程中,在this上添加一个_watchers属性
vm._watchers = [];
2)每当创建watcher实例时,都会将watcher实例添加到vm._watchers中
export default class Watcher{
constructor(vm,expOrFn,cb){
vm._watchers.push(this);
}
}
4、只需要遍历vm._watchers并依次执行每一项watcher实例的teardown方法,就可以将watcher实例从它所监听的状态的依赖列表中移除。
let i = vm._watchers.length;
while(i–){
vm._watchers[i].teardown();
}
(7)向Vue.js实例添加_isDestroyed属性来表示Vue.js实例已经被销毁。
vm._isDestroyed = true;
(8)当vm.$destroy执行时,Vue.js不会将已经渲染到页面中的DOM节点移除,但会将模板中的所有指令解绑。
vm.patch(vm._vnode,null)
(9)触发destroyed钩子函数
callHook(vm,‘destroyed’)
(10)最后,移除实例上的所有事件监听器。
vm.$off()
vm.$off() 我们在学习vue源码(1) 手写与事件相关的实例方法已经谈过其实现,实现也挺简单,感兴趣可以看一看。
(11)完整代码
Vue.prototype.$destory = function(){
文末
从转行到现在,差不多两年的时间,虽不能和大佬相比,但也是学了很多东西。我个人在学习的过程中,习惯简单做做笔记,方便自己复习的时候能够快速理解,现在将自己的笔记分享出来,和大家共同学习。
个人将这段时间所学的知识,分为三个阶段:
第一阶段:HTML&CSS&JavaScript基础
第二阶段:移动端开发技术
第三阶段:前端常用框架
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
-
推荐学习方式:针对某个知识点,可以先简单过一下我的笔记,如果理解,那是最好,可以帮助快速解决问题;
-
大厂的面试难在,针对一个基础知识点,比如JS的事件循环机制,不会上来就问概念,而是换个角度,从题目入手,看你是否真正掌握。所以对于概念的理解真的很重要。