文章目录
- 一、Vue的响应式原理是什么?
- 1. Vue2-Object.defineProperty
- 2. Vue3-使用ES6的Proxy对象
- 二、Vue组件的生命周期-钩子函数
- 1. beforeCreate
- 2. created
- 3. beforeMount
- 4. mounted
- 5. beforeUpdate
- 6. updated
- 7. beforeDestroy
- 8. destroyed
- 三、Vue Router是如何实现路由跳转的?
- 四、Vuex是什么,它如何管理应用状态?
- 1. State
- 2. Getter
- 3. Mutation
- 4. Action
- 5. Module
- 五、如何在Vue组件中实现父子组件通信?
- 1. props
- 2. emit事件
- 3. provide/inject API
- 4. Vuex
- 六、Vue3相对于Vue2有哪些主要变化?
- 1. 性能提升
- 2. 更小的体积
- 3. 更好的TypeScript支持
- 4. Composition API
- 5. Fragment、Teleport和Suspense
一、Vue的响应式原理是什么?
Vue的响应式原理:主要是基于其数据劫持和发布者-订阅者模式。
1. Vue2-Object.defineProperty
vue2:使用Object.defineProperty方法来劫持对象属性的setter和getter,从而追踪数据的变化,并在数据变化时通知视图更新。
具体来说,当一个Vue实例被创建时,Vue会遍历其data选项中的属性,并使用Object.defineProperty将它们转换为getter/setter。这样,当这些属性的值发生变化时,setter就会被触发,Vue就能感知到数据的变化,并更新相应的视图。
2. Vue3-使用ES6的Proxy对象
vue3:响应式系统得到了重写,使用ES6的Proxy对象来替代Object.defineProperty。Proxy可以直接监听整个对象而不仅仅时对象的属性,从而解决了vue2中一些响应式的限制,如不能监听数组的变化和对象属性的添加/删除等。
二、Vue组件的生命周期-钩子函数
vue组件的生命周期是指组件从创建到销毁所经历的一系列过程。这些过程被划分为多个生命周期钩子,开发者可以在这些钩子中编写代码来执行特定的逻辑。
主要生命周期钩子函数包括:
1. beforeCreate
在实例初始化之后,数据观测(data observer)和event/watcher 事件配置之前被调用。
2. created
实例已经创建完成后调用。在这一步,实例已完成数据观测、属性和方法的运算,watch/event事件回调。然而,挂载阶段还没开始,$el 属性目前不可见。
3. beforeMount
在挂载开始之前被调用:相关的render函数首次被调用。
4. mounted
el 被新创建的vm.$el 替换,并挂载到实例上去之后调用该钩子。
5. beforeUpdate
响应式数据更新时调用,发生在虚拟DOM打补丁之前。
6. updated
由于数据变化导致的虚拟DOM重新渲染和打补丁,在这之后会调用这个钩子。
7. beforeDestroy
实例销毁前调用。这一步,实例仍然完全可用。
8. destroyed
实例销毁后调用。调用后,Vue实例所指示的所有东西都会解绑,所有的事件监听器会被移除,所有的子实例也会被销毁。
三、Vue Router是如何实现路由跳转的?
Vue Router是Vue.js的官方路由管理器。它允许你以一种简单的方式为单页面应用(SPA)提供路由功能。
Vue Router实现路由跳转的方式主要有两种:编程式导航和声明式导航。
- 编程式导航:通过调用路由实例的push 或 replace 方法来实现。例如,this.$router.push(‘/home’)会将当前路由跳转到 /home。
- 声明式导航:通过<router-link>组件来实现。<router-link>是一个Vue组件,它接受一个to属性,该属性指定了要导航到的目标路由。例如,<router-link to=“/home”>Home</router-link>会渲染一个链接,当用户点击这个链接时,会导航到/home这个路由。
四、Vuex是什么,它如何管理应用状态?
Vuex是一个专为Vue.js应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。
Vuex管理应用状态的方式主要依赖于其五大核心概念:State、Getter、Mutation、Action、Module。
1. State
Vuex中的单一状态树(Single Source of Truth)。状态对象包含了你的应用中大部分的状态(state)。
2. Getter
类似于组件的计算属性。getter的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算。
3. Mutation
唯一允许更新应用状态的方法是提交mutation。mutation必须同步执行。
4. Action
Action提交mutation,而不是直接变更状态。Action可以包含任意异步操作。
5. Module
由于使用单一状态树,应用的所有状态都会集中到一个比较大的对象。当对象变得非常复杂时,store对象就有可能变得想当臃肿。为了解决这个问题,Vuex允许我们将store分割成模块(module)。每个模块拥有自己的state、mutation、action、getter,甚至是嵌套子模块——从上至下进行同样方式的分割。
五、如何在Vue组件中实现父子组件通信?
在Vue组件中,父子组件通信是常见的需求。实现父子组件通信的方法主要有以下几种:
1. props
父组件通过props向子组件传递数据,子组件通过声明props来接收这些数据。
2. emit事件
子组件通过$emit方法触发事件,父组件通过监听这些事件来接收子组件传递的数据或消息。
3. provide/inject API
在Vue2.2.0+中,引入了provide/inject API来实现跨组件的依赖注入。父组件通过provide选项提供数据或方法,子组件(无论多深)通过inject选项来接收这些数据或方法。
4. Vuex
对于复杂的应用,可以使用Vuex来管理全局状态,从而实现父子组件之间的通信。
六、Vue3相对于Vue2有哪些主要变化?
1. 性能提升
vue3使用了Proxy来代替Object.defineProperty实现响应式系统,从而解决了Vue2中一些性能瓶颈和响应式限制。
2. 更小的体积
Vue3通过Tree Shaking和更好的代码分割,使得最终打包后的体积更小。
3. 更好的TypeScript支持
vue3的源码使用了TypeScript重写,从而提供了更好的TypeScript支持。
4. Composition API
vue3引入了Composition API,这是一种新的API风格,允许你将组件的逻辑按照功能组织在一起,而不是像Options API那样按照选项来组织。这使得组件的复用和逻辑组织变得更加容易。
5. Fragment、Teleport和Suspense
Vue3还引入了三个新的内置组件:Fragment、Teleport、Suspense。
- Fragment:允许组件有多个根节点;
- Teleport:可以将组件的子节点移动到DOM的其他位置。
- Suspense:提供了一种异步组件和异步操作的机制。