Vue

Vue 生命周期

Vue实例有以下8个生命周期钩子函数,它们分别在实例化时按顺序被调用:

  1. beforeCreate:实例被创建前调用,此时组件的选项、属性等还未初始化。
  2. created:实例创建完成后调用,可以在这里进行数据的初始化、依赖注入等操作。
  3. beforeMount:在挂载开始之前被调用,此时模板已经编译完成,但尚未渲染到真实的DOM中。
  4. mounted:在挂载完成后调用,此时组件已经被渲染到真实的DOM中,可以在这里进行DOM操作和异步请求等操作。
  5. beforeUpdate:在数据更新之前调用,此时数据已经被更新但DOM尚未重新渲染。
  6. updated:在数据更新之后调用,此时组件已经被重新渲染,可以在这里进行DOM操作和异步请求等操作。
  7. beforeDestroy:在实例销毁之前调用,此时组件实例还未销毁,可以在这里进行清理操作。
  8. destroyed:在实例销毁之后调用,此时组件实例已经被销毁,可以在这里进行清理操作。

这些生命周期钩子函数可以用于控制Vue实例的行为,进行组件的初始化、数据更新、DOM操作、事件监听等等。需要注意的是,不建议在beforeCreate和created钩子函数中进行DOM操作,因为此时组件的模板还未编译完成,DOM节点还未生成。在mounted钩子函数中进行DOM操作是最佳实践。

Vue 组件通信

  1. 父子组件通信:父组件通过 props 向子组件传递数据,子组件通过 $emit 触发事件并传递数据给父组件。
  2. 子父组件通信:子组件通过 this.$parent 访问父组件的属性或方法,或者通过 $emit 触发事件并传递数据给父组件。
  3. 兄弟组件通信:可以通过一个共同的父组件来进行兄弟组件之间的通信。也可以使用一个空的 Vue 实例作为事件总线,所有需要通信的组件都通过它来进行通信。
  4. 跨级组件通信:可以使用 provide/inject API 来实现跨级组件通信。父组件通过 provide 提供数据,子孙组件通过 inject 来注入数据。
  5. Vuex 状态管理:Vuex 是 Vue.js 官方提供的状态管理库,通过将组件的共享状态抽取出来,以集中的方式进行管理,从而实现组件之间的通信。

Vue 双向数据绑定原理

参考链接:

Vue 数据双向绑定原理是通过 数据劫持 + 发布者-订阅者模式 的方式来实现的。
首先是通过 ES5 提供的 Object. defineProperty() 方法来劫持(监听)各属性的getter、setter,并在当监听的属性发生变动时通知订阅者,是否需要更新,若更新就会执行对应的更新函数。

Vue 路由实现方式是什么?如何实现路由懒加载?

实现原理:

SPA(single page application):单一页面应用程序,只有一个完整的页面;它在加载页面时,不会加载整个页面,而是只更新某个指定的容器中内容。

vue-router 使用 path-to-regexp 作为路径匹配引擎,用来匹配path和params

单页面应用(SPA)的核心之一是:

  1. 更新视图而不重新请求页面
  2. vue-router在实现单页面前端路由时,提供了三种方式:Hash模式和History模式;根据mode参数以及运行环境决定采用哪一种方式。

路由懒加载:

1
2
3
4
5
6
7
8
9
// 将
// import UserDetails from './views/UserDetails.vue'
// 替换成
const UserDetails = () => import('./views/UserDetails.vue')

const router = createRouter({
// ...
routes: [{ path: '/users/:id', component: UserDetails }],
})

Vue 父子组件的生命周期执行顺序是什么?

加载渲染过程:

  1. 父组件 beforeCreate
  2. 父组件 created
  3. 父组件 beforeMount
  4. 子组件 beforeCreate
  5. 子组件 created
  6. 子组件 beforeMount
  7. 子组件 mounted
  8. 父组件 mounted

更新过程:

  1. 父组件 beforeUpdate
  2. 子组件 beforeUpdate
  3. 子组件 updated
  4. 父组件 updated

销毁过程:

  1. 父组件 beforeDestroy
  2. 子组件 beforeDestroy
  3. 子组件 destroyed
  4. 父组件 destoryed

Vue computed 和 watch 的区别是什么?

Vue.js 中的 computed 和 watch 都是用于监听数据变化的功能,但它们的实现方式和使用场景略有不同。

computed

computed 是计算属性,是一种声明式的依赖关系,当依赖的数据发生变化时,会自动重新计算该属性的值。computed 的值会被缓存,只有依赖的数据变化时才会重新计算。
使用 computed 可以避免在模板中写复杂的逻辑,将逻辑和模板分离开来,使代码更加清晰简洁。computed 适用于一些需要经常被调用且计算量比较大的场景。

watch

watch 是观察一个数据的变化,当数据发生变化时会执行相应的回调函数。watch 可以监听一个数据的变化,也可以监听一个对象的某个属性的变化。
使用 watch 可以做一些比较复杂的业务逻辑,比如当用户输入完毕后请求接口获取数据等。watch 适用于一些需要在数据变化时执行异步或较为复杂的操作的场景。

综上所述,computed 适用于计算属性,而 watch 适用于监听数据的变化并执行一些复杂的操作。

Vue v-if和v-show的区别是什么?在什么情况下应该使用它们?

Vue.js 中的 v-if 和 v-show 都是用于控制元素的显示和隐藏,但它们的实现方式和使用场景略有不同。

v-if
v-if 是根据条件来判断是否渲染元素的指令,如果条件为真,则渲染元素,如果条件为假,则不渲染元素。当条件发生变化时,会销毁或创建元素。

使用 v-if 可以节省性能,因为在条件为假时,元素不会被渲染到 DOM 树中。但在频繁切换条件时,会造成不必要的性能开销,因为需要频繁创建和销毁元素。

v-show
v-show 是根据条件来判断元素是否显示的指令,如果条件为真,则显示元素,如果条件为假,则隐藏元素。当条件发生变化时,不会销毁或创建元素,只是修改元素的 CSS 样式。

使用 v-show 可以在元素显示和隐藏之间切换,但不会造成不必要的性能开销。但在元素首次渲染时,需要将元素渲染到 DOM 树中,可能会造成一些不必要的开销。

综上所述,当需要频繁切换元素显示和隐藏时,应该使用 v-show;当需要节省性能时,应该使用 v-if。同时,在使用 v-if 和 v-show 时,需要根据实际场景进行选择。如果需要对元素进行频繁操作,建议使用 v-show,如果元素较为复杂且需要频繁切换,建议使用 v-if。

Vue mixins是什么?如何使用它?

Vue keep-alive有什么作用?

Vue v-for如何避免重复渲染?

Vue key属性有什么作用?如何使用它?

Vue slot是什么?如何使用它?

Vue provide和inject有什么作用?如何使用它们?

Vue nextTick是什么?如何使用它?

Vue v-model实现原理是什么?如何自定义v-model?

Vue 中的指令和组件,并提供一个示例。

Vue 中的虚拟 DOM,以及它的优缺点。

Vue 中的计算属性和侦听器,以及它们之间的区别。

Vue 中的路由和导航,以及如何实现动态路由。

Vue 中的 Vuex 状态管理模式,包括状态管理的基本概念和核心概念。

Vue 中的过滤器和插件,以及它们的作用和使用场景。

Vue 中的异步组件和懒加载,以及它们的作用和使用场景。

SQL

什么是SQL?

SQL 的全称是什么?

SQL 是用来做什么的?

SQL 有哪些基本命令?

什么是 SELECT 命令?

SELECT 命令有哪些常用选项?

什么是 WHERE 子句?

WHERE 子句的作用是什么?

WHERE 子句有哪些常见操作符?

什么是 ORDER BY 子句?

ORDER BY 子句的作用是什么?

ORDER BY 子句有哪些常见选项?

什么是 GROUP BY 子句?

GROUP BY 子句的作用是什么?

GROUP BY 子句有哪些常见选项?

什么是 HAVING 子句?

HAVING 子句的作用是什么?

HAVING 子句与 WHERE 子句有什么区别?

什么是聚合函数?

SQL 中有哪些常用的聚合函数?

什么是 JOIN?

JOIN 有哪些常见类型?

什么是 INNER JOIN?

什么是 LEFT JOIN?

什么是 RIGHT JOIN?

什么是 FULL OUTER JOIN?

什么是 UNION?

UNION 与 UNION ALL 有什么区别?

什么是子查询?

子查询有哪些常见类型?

什么是视图?

视图的作用是什么?

如何创建一个视图?

什么是索引?

索引的作用是什么?

索引有哪些常见类型?

如何创建一个索引?

如何删除一个索引?

什么是事务?

事务的特性是什么?

什么是锁?

锁有哪些常见类型?

什么是死锁?

如何避免死锁?

什么是数据完整性?

数据完整性有哪些常见类型?

如何保证数据完整性?

什么是数据库范式?

数据库范式有哪些常见类型?

如何设计一个符合范式的数据库?

什么是触发器?

触发器的作用是什么?

触发器有哪些常见类型?

如何创建一个触发器?

如何删除一个触发器?

什么是存储过程?

存储过程的作用是什么?

存储过程有哪些常见类型?

如何创建一个存储过程?