# 基础知识点

# ✅1.生命周期钩子函数

# ✅2.组件通信

# 3.extend 能做什么

这个 API 很少用到,作用是扩展组件生成一个构造器,通常会与$mount一起使用。

// 创建组件构造器
let Component = Vue.extend({
  template: `<div>test</div>`,
})
// 挂载到#app上
new Component().$mount("#app")
// 除了上面的方式,还可以用来扩展已有的组件
let SuperComponent = Vue.extend(Component)
new SuperComponent({
  created() {
    console.log(1)
  },
})
new SuperComponent().$mount("#app")
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# ✅4.mixin 和 mixins

# ✅5.computed 和 watch 区别

# ✅6.keep-alive 组件有什么作用

# ✅7.v-show 与 v-if 区别

# ✅8.组件中 data 什么时候可以使用对象

# 一、Vue 相关知识点

# 1.介绍下 MVVM(数据的双向绑定)

  • M:model 数据模型
  • V:view 界面
  • MV:作为桥梁负责沟通,view 和 model
  • 只关心数据的流传,减少强耦合性,最关键的就是数据的双向绑定
  • 关键步骤:
  • 1.实现数据监听器 Observer,用 object.defineProperty()重写数组的 get/set。数据更新就在 set 中通知订阅者更新数据。
  • 2.实现模板编译 compiler,深度遍历 dom 树,对每个元素节点的指令模板替换数据及订阅数据。
  • 3.实现 watch 用于连接 Observer 和 Compiler,能够订阅并接受每一个属性的变动的通知,执行指令绑定对的响应的回调函数,从而更新数据。 -MVC 和 MVVM 其实区别并不大。都是一种设计思想,主要是 MVC 中 Controller 演变成 MVVM 中的 ViewMode,mvvm 主要解决了 MVC 中大量的 Dom 操作使页面渲染性能降低。

# 2.Vue 实现数据双向绑定的原理:

  • 采用数据劫持结合发布订阅,通过 Object.defineProperty()来劫持各个属性的 setter,getter,在数据变动时发布消息给订阅者,触发相应的监听回调。当把一个普通 JavaScript 对象传给 Vue 实例来作为它的 data 选项时,Vue 将遍历它的属性,用 Object.defineProperty()将他们转换为 getter/sertter。用户看不到 getter/setter,但是在内部它们让 Vue 追踪依赖,在属性被访问和修改时通知变化。
  • Vue 的数据双向绑定,将 MVVM 作为数据绑定的入口,整合 Observer,Compile 和 Watcher 三者,通过 Observer 来监听自己的 model 的数据变化,通过 Compiler 之间的通信桥梁,达到数据变化-->视图更新;视图交互变化(input)-->数据 model 变更双向绑定的效果。

# 3. watch

  • 对属性进行监听,允许我们执行异步操作,限制执行该操作的频率,并在我们得到结构前设置中间状态

# 4. 生命周期函数

vue 初始化到渲染的过程

  • 1.new Vue
  • 2.init --> initEvent --> beforeCreate --> initData(observer...) -->created
  • 3.$mount--> beforeMount
  • 4.render
  • 5.compiler
  • 6.vnode
  • 7.path
  • 9.dom --> mounted

组件更新

  • initData(dep)

  • watch(dep)

  • render(dep)

  • beforeUpdate --> virtual dom --> updated

# 5. keep-alive

  • 在被 keep-alive 包含的组件/路由,会多出两个生命周期:activated 和 deactiated
  • actived 在组件第一次渲染时会被调用,之后每次缓存组件被激活时调用,调用机制:第一次进入缓存路由/组件,在 mounted 后面,beforRouteEnter 守卫传给 next 的回调函数之前调用

# 6. vue 的 spa 如何优化加载速度

  • 减少入口文件的体积、静态资源本地缓存、开启 gzip 压缩、使用 ssr,nuxt.js

# 7. 谈谈 vue 和 react 组件化的思想

  • 我们在各个页面开发的时候,会产生很多重复的功能
  • 1.我们在各个页面开发的时候,会产生很多重复的功能,比如,element 中的 xxx,像这种纯粹非页面的 UI,便成为我们常用 UI 组件,最初的前端组件也就仅仅值得是 UI 组件
  • 2.随着业务逻辑变得越来越多时,我们就想要我们的组件可以处理很多事,这就是我们常说的组件化,这个组件就不是 UI 组件了,而是包含具体业务的业务组件
  • 3.这种开发思想就是分而治之。最大程度降低开发难度和维护成本的效果,并且可以多人协作,每人写不同的组件,最后像搭积木一样把它构成一个页面

# 8.框架区别

  • 1、vue 与 AngularJS 的区别

相同点:都支持指令:内置指令和自定义指令;都支持过滤器:内置过滤器和自定义过滤器;都支持双向数据绑定;都不支持低端浏览器。

不同点:AngularJS 的学习成本高,比如增加了 Dependency Injection 特性,而 Vue.js 本身提供的 API 都比较简单、直观;在性能上,AngularJS 依赖对数据做脏检查,所以 Watcher 越多越慢;Vue.js 使用基于依赖追踪的观察并且使用异步队列更新,所有的数据都是独立触发的。

  • 2、vue 与 React 的区别

相同点:React 采用特殊的 JSX 语法,Vue.js 在组件开发中也推崇编写.vue 特殊文件格式,对文件内容都有一些约定,两者都需要编译后使用;中心思想相同:一切都是组件,组件实例之间可以嵌套;都提供合理的钩子函数,可以让开发者定制化地去处理需求;都不内置列数 AJAX,Route 等功能到核心包,而是以插件的方式加载;在组件开发中都支持 mixins 的特性。

不同点:React 采用的 Virtual DOM 会对渲染出来的结果做脏检查;Vue.js 在模板中提供了指令,过滤器等,可以非常方便,快捷地操作 Virtual DOM。

# 9.vue 路由的钩子函数

  • 全局导航钩子
    • router.beforeEach(to,from,next)
    • router.beforeResolve(to,from,next)
    • router.afterEach(to,from,next)
  • 组件内钩子
    • beforeRouteEnter
    • beforeRouteUpdate
    • beforeRouteLeave
  • 单独路由独享钩子
    • beforeEnter

# 10.vuex 是什么?怎么使用?哪种功能场景使用它?

只用来读取的状态集中放在 store 中; 改变状态的方式是提交 mutations,这是个同步的事物; 异步逻辑应该封装在 action 中。

在 main.js 引入 store,注入。新建了一个目录 store,… export 。

场景有:单页应用中,组件之间的状态、音乐播放、登录状态、加入购物车

state:Vuex 使用单一状态树,即每个应用将仅仅包含一个 store 实例,但单一状态树和模块化并不冲突。存放的数据状态,不可以直接修改里面的数据。

mutations:mutations 定义的方法动态修改 Vuex 的 store 中的状态或数据。

getters:类似 vue 的计算属性,主要用来过滤一些数据。

action:actions 可以理解为通过将 mutations 里面处里数据的方法变成可异步的处理数据的方法,简单的说就是异步操作数据。view 层通过 store.dispath 来分发 action。

# 11.Vue 组件间的参数传递

  • 1.props:父组件创建属性给子组件,属性可以进行验证、赋给默认值等
  • 2.refs:访问子组件的属性或者方法
  • 3.$parent:访问父组件的属性或方法;$children:访问子组件的属性或方法
  • 4.$emit:父组件订阅子组件事件,$on:父组件发布子组件事件
  • 5.vuex:全局共享状态和方法(同步异步)
  • 6.provide/inject:父组件提供属性,供子组件访问
  • 7.Bus:类似$emit/$on,全局版的发布订阅模式

# 12.Vue 的路由实现:hash 模式 和 history 模式

  • hash 模式: 在浏览器中符号“#”,#以及#后面的字符称之为 hash,用 window.location.hash 读取。 特点:hash 虽然在 URL 中,但不被包括在 HTTP 请求中;用来指导浏览器动作,对服务端安全无用,hash 不会重加载页面。
  • history 模式: history 采用 HTML5 的新特性;且提供了两个新方法: pushState(), replaceState()可以对浏览器历史记录栈进行修改,以及 popState 事件的监听到状态变更。
上次更新: 2022/6/29 上午12:09:44