关于vue的那些事儿

625 阅读10分钟

vue框架是常用的框架,接下来总结一些关于vue的知识点

一、vue的生命周期

生命周期是什么?

Vue 实例有一个完整的生命周期,也就是从开始创建、初始化数据、编译模版、挂载Dom -> 渲染、更新 -> 渲染、卸载等一系列过程,我们称这是Vue的生命周期。同时在这个过程中也会运行一些叫做生命周期钩子的函数,这给了用户在不同阶段添加自己的代码的机会。

钩子函数都有哪些?

beforeCreate	组件实例被创建之初,组件的属性生效之前
created	 组件实例已经完全创建,属性也绑定,但真实dom还没有生成,$el还不可用
beforeMount	在挂载开始之前被调用:相关的 render 函数首次被调用
mounted	el 被新创建的 vm.$el 替换,并挂载到实例上去之后调用该钩子
beforeUpdate	组件数据更新之前调用,发生在虚拟 DOM 打补丁之前
update	组件数据更新之后
activited	keep-alive专属,组件被激活时调用
deadctivated	keep-alive专属,组件被销毁时调用
beforeDestory	组件销毁前调用
destoryed	组件销毁后调用

二.异步请求适合在哪个生命周期调用?

官方实例的异步请求是在mounted生命周期中调用的,而实际上也可以在created生命周期中调用。

三.vue组件通信

1.父子组件 父组件传子组件用props, 子组件传父组件$on传参,父组件$emit接受参数

2.可以使用vuex状态管理

3.可以使用EventBus,通过EventBus进行信息的发布与订阅

4.可以使用solt插槽

5.可以使用高阶组件provide/inject:以允许一个祖先组件向其所有子孙后代注入一个依赖,不论组件层次有多深,并在起上下游关系成立的时间里始终生效,这成为了跨组件通信的基础

四、vue-router

vue-router有两种模式,hash模式和history模式

1.hash模式 

即地址栏 URL 中的 # 符号(此 hash 不是密码学里的散列运算)。比如这个 URL:http://www.abc.com/#/hello,hash 的值为 #/hello。它的特点在于:hash 虽然出现在 URL 中,但不会被包括在 HTTP 请求中,对后端完全没有影响,因此改变 hash 不会重新加载页面。  
2.history模式

利用了 HTML5 History Interface 中新增的 pushState() 和 replaceState() 方法。(需要特定浏览器支持)这两个方法应用于浏览器的历史记录栈,在当前已有的 back、forward、go 的基础之上,它们提供了对历史记录进行修改的功能。只是当它们执行修改时,虽然改变了当前的 URL,但浏览器不会立即向后端发送请求。

五、vue父子组件生命周期执行的钩子函数的属性

加载渲染过程

父beforeCreate->父created->父beforeMount->子beforeCreate->子created->子beforeMount->子mounted->父mounted

更新过程

父beforeUpdate->子beforeUpdate->子updated->父updated

常用钩子简易版

父create->子created->子mounted->父mounted

六、v-if 和v-show的区别

v-show不管条件是真还是假,第一次渲染的时候都会编译出来,也就是标签都会添加到DOM中。之后切换的时候,通过display: none;样式来显示隐藏元素。可以说只是改变css的样式,几乎不会影响什么性能。

在首次渲染的时候,如果条件为假,什么也不操作,页面当作没有这些元素。当条件为真的时候,开始局部编译,动态的向DOM元素里面添加元素。当条件从真变为假的时候,开始局部编译,卸载这些元素,也就是删除。

简单来说 v-if 为false的时候没有dom的存在,v-show是通过样式来隐藏的,dom还存在

v-if适用于切换不频繁的场景  v-show适用于切换频繁的场景

七、computed 和metheds的区别

computed

computed是计算属性,也就是计算值,它更多用于计算值的场景 

computed具有缓存性,computed的值在getter执行后是会缓存的,只有在它依赖的属性值改变之后,下一次获取computed的值时才会重新调用对应的getter来计算 

computed适用于计算比较消耗性能的计算场景

watch:

  1. 更多的是「观察」的作用,类似于某些数据的监听回调,用于观察props $emit或者本组件的值,当数据变化时来执行回调进行后续操作
  2. 无缓存性,页面重新渲染时值不变化也会执行

适用于场景:

当我们要进行数值计算,而且依赖于其他数据,那么把这个数据设计为computed 如果你需要在某个数据变化时做一些事情,

八、Vuex

Vuex 是全局状态管理模式

state 

定义全局状态的变量

mutation 

每个 mutation 都有一个字符串的 事件类型 (type) 和 一个 回调函数 (handler)。这个回调函数就是我们实际进行状态更改的地方,

mutations: {
    increment (state) {
      // 变更状态
      state.count++
    }
  }

Mutation 必须是同步函数

Action

Action 提交的是 mutation,而不是直接变更状态

Action 可以包含任意异步操作

const store = new Vuex.Store({
  state: {
    count: 0
  },
  mutations: {
    increment (state) {
      state.count++
    }
  },
  actions: {
    increment (context) {
      context.commit('increment')
    }
  }
})


九、EventBus的实现方式

class EventBus{
        constructor(){
            this.event=Object.create(null);
        };
        //注册事件
        on(name,fn){
            if(!this.event[name]){
                //一个事件可能有多个监听者
                this.event[name]=[];
            };
            this.event[name].push(fn);
        };
        //触发事件
        emit(name,...args){
            //给回调函数传参
            this.event[name]&&this.event[name].forEach(fn => {
                fn(...args)
            });
        };  
}


vue的使用方式

EventBus.$on('getName', 'zhou')
EventBus.$emit('getName', function(val) {})

传值用$on,接受参数用$emit

十、vue怎么实现双向绑定

利用Object.defineProperty劫持对象的访问器,通过get和set在属性值发生变化时我们可以获取变化,然后根据变化进行后续响应

在vue3.0中通过Proxy代理对象进行类似的操作。

Proxy的优势如下: 

Proxy可以直接监听对象而非属性 

Proxy可以直接监听数组的变化

 Proxy有多达13种拦截方法,不限于apply、ownKeys、deleteProperty、has等等是Object.defineProperty不具备的 Proxy返回的是一个新对象,我们可以只操作新的对象达到目的,而Object.defineProperty只能遍历对象属性直接修改

Proxy作为新标准将受到浏览器厂商重点持续的性能优化,也就是传说中的新标准的性能红利 

Object.defineProperty的优势如下: 

 兼容性好,支持IE9

十一、Vue中的key到底有什么用

key是为Vue中的vnode标记的唯一id,通过这个key,我们的diff操作可以更准确、更快速 diff算法的过程中,先会进行新旧节点的首尾交叉对比,当无法匹配的时候会用新节点的key与旧节点进行比对,然后超出差异.

十二、你是如何理解Vue的响应式系统的?




响应式系统简述: 

 任何一个 Vue Component 都有一个与之对应的 Watcher 实例。

 Vue 的 data 上的属性会被添加 getter 和 setter 属性。 

当 Vue Component render 函数被执行的时候, data 上会被 触碰(touch), 即被读, getter 方法会被调用, 此时 Vue 会去记录此 Vue component 所依赖的所有 data。(这一过程被称为依赖收集) data 被改动时(主要是用户操作), 即被写, setter 方法会被调用, 此时 Vue 会去通知所有依赖于此 data 的组件去调用他们的 render 函数进行更新

十三、vue指令

具体可以看这篇文章

mp.weixin.qq.com/s?__biz=MzU…

十四、react vue angluer 的优缺点及什么项目适合

一、Vue.js: 其实Vue.js不是一个框架,因为它只聚焦视图层,是一个构建数据驱动的Web界面的库。 Vue.js通过简单的API(应用程序编程接口)提供高效的数据绑定和灵活的组件系统。 Vue.js的特性如下:

 1.轻量级的框架 

 2.双向数据绑定 

 3.指令 

 4.插件化 

 优点:

 1. 简单:官方文档很清晰,比 Angular 简单易学。

 2. 快速:异步批处理方式更新 DOM。 

3. 组合:用解耦的、可复用的组件组合你的应用程序。 

 4. 紧凑:~18kb min+gzip,且无依赖。

 5. 强大:表达式 & 无需声明依赖的可推导属性 (computed properties)。  

6. 对模块友好:可以通过 NPM、Bower 或 Duo 安装,不强迫你所有的代码都遵循 Angular 的各种规定,使用场景更加灵活。   

缺点:  

1. 影响度不是很大:google了一下,有关于Vue.js多样性或者说丰富性少于其他一些有名的库。   

2. 新生儿:Vue.js是一个新的项目,没有angular那么成熟。    

3. 不支持IE8:

 应用场景:小型应用 

 二、angularJS:

 angularJS是一款优秀的前端JS框架,已经被用于Google的多款产品当中。

 angularJS的特性如下: 

 1.良好的应用程序结构 

 2.双向数据绑定

 3.指令 

 4.HTML模板 

 5.可嵌入、注入和测试

 优点:  

 1. 是一个比较完善的前端框架,包含服务,模板,数据双向绑定,模块化,路由,过滤器,依赖注入等所有功能;      

 2. ng模块化比较大胆的引入了Java的一些东西(依赖注入),能够很容易的写出可复用的代码,对于敏捷开发的团队来说非常有帮助。      

 3. 模板功能强大丰富,自带了极其丰富的angular指令。       

4. 自定义指令,自定义指令后可以在项目中多次使用。       

5. angularjs是互联网巨人谷歌开发,这也意味着他有一个坚实的基础和社区支持。 

 缺点:

 1. 文档例子非常少, 官方的文档基本只写了api, 一个例子都没有, 很多时候具体怎么用都是google来的, 或直接问misko,angular的作者.    

2. angular 入门很容易 但深入后概念很多, 学习中较难理解    

3. DI 依赖注入 如果代码压缩需要显示声明.    

4. 对IE6/7 兼容不算特别好, 就是可以用jQuery自己手写代码解决一些.    

5. 指令的应用的最佳实践教程少, angular其实很灵活, 如果不看一些作者的使用原则,很容易写出 四不像的代码, 例如js中还是像jQuery的思想有很多dom操作

 应用场景:在大型超大型web应用开发上。

 三、React:  

 React主要用于构建UI。你可以在React里传递多种类型的参数,如声明代码,帮助你渲染出UI、也可以是静态的HTML DOM元素、也可以传递动态变量、甚至是可交互的应用组件。   React特性如下:      

1.声明式设计:React采用声明范式,可以轻松描述应用。  

2.高效:React通过对DOM的模拟,最大限度地减少与DOM的交互。 

3.灵活:React可以与已知的库或框架很好地配合。 

 优点: 速度快:在UI渲染过程中,React通过在虚拟DOM中的微操作来实现对实际DOM的局部更新。 跨浏览器兼容:虚拟DOM帮助我们解决了跨浏览器问题,它为我们提供了标准化的API,甚至在IE8中都是没问题的。 

模块化:为你程序编写独立的模块化UI组件,这样当某个或某些组件出现问题是,可以方便地进行隔离。 

单向数据流:Flux是一个用于在JavaScript应用中创建单向数据层的架构,它随着React视图库的开发而被Facebook概念化。 同构、纯粹的javascript:因为搜索引擎的爬虫程序依赖的是服务端响应而不是JavaScript的执行,预渲染你的应用有助于搜索引擎优化。 

兼容性好:比如使用RequireJS来加载和打包,而Browserify和Webpack适用于构建大型应用。它们使得那些艰难的任务不再让人望而生畏。 

缺点: React本身只是一个V而已,并不是一个完整的框架,所以如果是大型项目想要一套完整的框架的话,基本都需要加上ReactRouter和Flux才能写大型应用。

 应用场景:个性化需求、中型应用

更多精彩内容可以关注