前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >前端知识点总结vue篇(下)

前端知识点总结vue篇(下)

作者头像
zhouzhouya
发布2023-10-26 17:25:09
3480
发布2023-10-26 17:25:09
举报
文章被收录于专栏:一名前端开发

Vue,Angular,React前端三大框架巨头,重要性不用多说,不过目前项目开发中主要用vue,现总结了一些Vue常用的知识点。

1. Vue的优点与缺点

代码语言:javascript
复制
优点:
组件化、响应式、单页面路由(SPA)、轻量级、渐进式(随意component是否使用、vuex是否使用)

缺点:
不利于SEO、不支持IE8以下(因为defineproperty)、首屏加载时间长(SPA缺点)

2. 对SPA单页面的理解,它的优缺点分别是什么

代码语言:javascript
复制
理解:SPA只在页面初始化时加载相应的HTML、JS、和CSS。当页面加载完成之后,利用路由实现HTML内容的变换,UI与用户
的交互,而不会因为用户的操作进行页面的重新加载或跳转

优点:
用户体验感好,避免了不必要的跳转和重复渲染
SPA对服务器压力小
前后端职责分离

缺点:
初次加载耗时多,将JS、HTML、CSS统一加载
前进后退靠路由,不能使用浏览器的前进后退
SEO难度大

3. MVVM模型

代码语言:javascript
复制
第一个M是Model,数据模型
第二个V是View,代表UI组件
VM为viewModel视图模型,是view和model的桥梁,同时监听模型数据以及控制视图行为。数据绑定到viewmodel层并自动渲染
到页面中,视图变化通知viewmodel层更新数据。

4. vue常用的一些指令

代码语言:javascript
复制
v-if:根据表达式的值的真假条件渲染元素。在切换时元素及它的数据绑定 / 组件被销毁并重建。
v-show:根据表达式之真假值,切换元素的 display CSS 属性。
v-for:循环指令,基于一个数组或者对象渲染一个列表,vue 2.0以上必须需配合 key值 使用。
v-bind:动态地绑定一个或多个特性,或一个组件 prop 到表达式。
v-on:用于监听指定元素的DOM事件,比如点击事件。绑定事件监听器。
v-model:实现表单输入和应用状态之间的双向绑定
v-pre:跳过这个元素和它的子元素的编译过程。可以用来显示原始 Mustache 标签。跳过大量没有指令的节点会加快编译。
v-once:只渲染元素和组件一次。随后的重新渲染,元素/组件及其所有的子节点将被视为静态内容并跳过。用于优化更新性能。

5. vue自定义指令

代码语言:javascript
复制
参考 https://blog.csdn.net/weixin_58032613/article/details/122759818

6. Vue常用的修饰符

代码语言:javascript
复制
.prevent 提交事件不再重载页面
.stop 阻止单击事件冒泡
.self 当事件发生在该元素本身而不是子元素时会触发
.capture 事件侦听,事件发生时会调用
.once 事件只触发一次
.passive 事件的默认行为立即执行无需等待事件回调执行完毕

7. Vue中为什么data是一个函数

代码语言:javascript
复制
因为组件是用来复用的,而js里对象是引用关系,如果组件中data是一个对象,那么作用域没有隔离,子组件中的data属性值
会相互影响。
而如果是函数的话,每个实例可以维护一份返回对象的独立拷贝,组件实例之间的data属性值不会相互影响。

8. v-if和v-show的区别

代码语言:javascript
复制
v-if指令是直接销毁和重建DOM达到让元素显示和隐藏的效果。
v-show修改display的css属性控制元素的显示与隐藏。
v-show性能更好,如果只需要一次显示与隐藏,用v-if

9. Vue的路由实现

代码语言:javascript
复制
Hash模式:
浏览器URL中'#'后的字符为hash,通过window.location.hash读取,通过hashchange事件来监听hash值的变化从而实现页面
跳转(渲染)。Hash不被包括在HTTP请求中,hash不会重加载页面。

History模式:
通过history.pushState来切换地址栏的路径,再通过监听popstate事件来操作浏览器的回退和前进按钮。而在这种模式下,
前端的URL必须要和后端发起请求的URL一致。(因为history模式改变URL方式会导致浏览器向服务器发送请求,因此要在服务器端
做处理,如果URL匹配不到任何静态资源,应该返回同一个index.html页面,这个页面就是app依赖的页面,在访问二级页面时,做
刷新操作会出现404错误,需要和后端配合配置一下Apache或是nginx的重定向,重定向到路由首页)

abstract模式:
支持所有的JS运行环境。如果发现没有浏览器的API,路由会自动强制进入这个模式。

Hash和history区别
Hash的URL会更改、浏览器可以前进和后退,但浏览器不会刷新并且不会和服务端交流。
History是规范的URL,无'#',能够访问到后台但是要和服务端的同事配合。

10. keep-alive

代码语言:javascript
复制
a.缓存组件,提升项目的性能。
b.假设首页进入详情页,如果用户在首页每次点击都是相同的,那么详情页就没必要重复请求,直接缓存起来。
  如果点击的不是同一个,则直接请求。
c.提供 include 和 exclude 属性, include 表示只有名称匹配的组件会被缓存,exclude表示任何名称匹配的组件都不会被
  缓存,其中 exclude 的优先级比 include 高
d.对应两个钩子函数 activated 和 deactivated ,当组件被激活时,触发钩子函数activated,当组件被移除时,触发钩子
  函数 deactivated。

11. Vue组件间通信方式

代码语言:javascript
复制
1.Props/$emit 适用父子组件通信
代码语言:javascript
复制
2.Ref父子组件通信
代码语言:javascript
复制
3.$parent/$children 父子组件通信
代码语言:javascript
复制
4.EventBus($emit/$on) 适用于父子、隔代、兄弟组件通信:以一个空的vue实例作为中央事件总线,用它来触发
和监听事件(发布订阅模式,)
代码语言:javascript
复制
5.$attrs/$listeners 适用于隔代组件通信($attrs包含了所有父组件在子组件上设置的属性,除了props传递的属性,
class,style。$listeners接收父组件的方法)
代码语言:javascript
复制
6.Provide/inject 适用于隔代组件通信(在父组件中通过provide来提供变量,在子组件通过inject来注入变量)
代码语言:javascript
复制
7.Vuex适用于父子、隔代、兄弟组件通信

12.computed和watch的区别

代码语言:javascript
复制
a.computed 计算属性,依赖其他属性值有,有缓存;可以用getter获取数据,也可以用setter改变数据;
b.watch 监听数据,数据变化再进行后续操作;(immediate如果为true 代表如果在 wacth 里声明了之后,就会立即先去执行
  里面的handler方法)
c.watch可以实现一些异步操作,比如在定时器多少秒之后触发方法,而computed靠return;

13.$nextTick

代码语言:javascript
复制
a.使回调函数延迟在DOM更新之后
b.比如说data中有个str,插值表达式在button里,我改变str的值,str在页面上的值发生了改变,但是打印dom元素依然是
  以前的值,若要获取改变后的dom,需要将其放在$nextTick中

14.路由导航守卫(参照官网)

代码语言:javascript
复制
全局前置守卫:
beforeEach((to, from) => {
  // ...to: 即将要进入的目标 from:当前导航正要离开的路由
  // 返回 false 以取消导航
  return false
})

全局后置钩子:
afterEach((to, from, failure) => {
  if (!failure) sendToAnalytics(to.fullPath)
})

路由独享的守卫:
const routes = [
  {
    path: '/users/:id',
    component: UserDetails,
    beforeEnter: (to, from) => {
      // reject the navigation
      return false
    },
  },
]

组件内的守卫: beforeRouteEnter,beforeRouteUpdate,beforeRouteLeave
const UserDetails = {
  template: `...`,
  beforeRouteEnter(to, from) {
    // 在渲染该组件的对应路由被验证前调用
    // 不能获取组件实例 `this` !
    // 因为当守卫执行时,组件实例还没被创建!
  },
  beforeRouteUpdate(to, from) {
    // 在当前路由改变,但是该组件被复用时调用
    // 举例来说,对于一个带有动态参数的路径 `/users/:id`,在 `/users/1` 和 `/users/2` 之间跳转的时候,
    // 由于会渲染同样的 `UserDetails` 组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用。
    // 因为在这种情况发生的时候,组件已经挂载好了,导航守卫可以访问组件实例 `this`
  },
  beforeRouteLeave(to, from) {
    // 在导航离开渲染该组件的对应路由时调用
    // 与 `beforeRouteUpdate` 一样,它可以访问组件实例 `this`
  },
}

15. vue的双向数据绑定原理(响应式原理)

代码语言:javascript
复制
主要采用数据劫持+观察者模式。通过Object.defineProperty()来劫持各个属性的 setter,getter,在数据变动时发布消息
给订阅者,触发相应的监听回调。

双向数据绑定原理对初学者来说理解起来可能会比较复杂。但是面试过程中又是必问的点。所以会专门出一篇关于双向数据绑定原理。
的文章。

16. $route和$router的区别

代码语言:javascript
复制
$route 获取路由信息
$router 进行路由跳转(传参:params和query)

query和params传参的区别:
query类似get,页面跳转url后面会拼接参数,类似?id=1,刷新页面id还存在。
params类似post,跳转之后url后面不会拼接参数,但是刷新页面id会消失。

17. vue的生命周期

代码语言:javascript
复制
vue实例有一个完整的生命周期,从开始创建、初始化数据、编译模板、挂载DOM->渲染、更新->渲染、卸载等一系列过程.

Ajax请求应该放在哪个生命周期?
created、beforeMount、Mounted都行,但最好放在created里面,因为此时已经可以访问this了(data已经被创建),
请求到数据就可以放在this里面.
  在created中,能更快获得服务端数据,减少页面loading时间
  SSR不支持beforemount、mounted钩子函数,放在created中有助于一致性

关于dom的操作都要放在mounted里面,此时vue已经将编译好的模板挂载在页面上,在mounted前访问dom会是undefined。

vue的父组件和子组件生命周期钩子函数执行顺序:
a) 加载渲染过程:父 beforeCreate -> 父 created -> 父 beforeMount -> 子 beforeCreate -> 
   子 created -> 子 beforeMount -> 子 mounted -> 父 mounted
b) 子组件更新过程:父 beforeUpdate -> 子 beforeUpdate -> 子 updated -> 父 updated
c) 父组件更新过程:父 beforeUpdate -> 父 updated
d) 销毁过程:父 beforeDestroy -> 子 beforeDestroy -> 子 destroyed -> 父 destroyed

18. vuex

代码语言:javascript
复制
a.vuex是状态管理器,在main.js中注入。
b.vuex有state,getter,mutation,action,module等5种属性。
c.state:存放数据,是响应式的,若是store中的数据发生改变,依赖这个数据的组件也会更新。
使用方法:
第一种:this.$store.state.全局数据名称
第二种:import { mapState } from "vuex";
computed;{
    ...mapState(["name""sex"])
}

d.getter:对state进行计算。可认为是store的计算属性,通过属性和方法访问。
e.mutation:唯一更改store中状态的方法,且必须是同步函数。
第一种:this.$store.commit("addcount",10)
第二种:
methods:{
    ...mapMutations(['addcount'])
}
f.action:类似mutation,action提交的是mutation,而不是直接变更状态,可以包含异步操作。
第一种:this.$store.dispatch("asynAdd")
第二种:
...Mapactions(['add'])
g.Module:允许将单一的store拆分为多个store且同时保存在单一的状态中

19.插槽和作用域插槽的区别

代码语言:javascript
复制
普通插槽渲染的作用域是父组件
作用域插槽渲染的作用域是当前子组件

20. vue单项数据流的理解

代码语言:javascript
复制
单向数据流主要是vue组件间传递数据是单向的,即数据总是由父组件传递给子组件,子组件在其内部维护自己的数据,但它无权修改
父组件传递给它的数据,当开发者尝试这样做的时候,vue 将会报错。这样做是为了组件间更好的维护。

在开发中可能有多个子组件依赖于父组件的某个数据,假如子组件可以修改父组件数据的话,一个子组件变化会引发所有依赖这个数据
的子组件发生变化,所以 vue 不推荐子组件修改父组件的数据

21. vue如何动态添加属性,实现数据响应

代码语言:javascript
复制
通过用this.$set(对象,‘属性‘,值)实现动态添加属性,以实现数据的响应.如果是修改引用类型属性的值,是可以自动渲染的.

22. Vue中key值的作用

代码语言:javascript
复制
a.为了能简单复用每个元素,高效更新虚拟DOM。(Vue diff中有个过程是如果新老节点都有子节点的情况下,需要进行
   updateChildren的操作,对比新老节点开始节点、结束节点共有四种比较方式,如果都没有匹配,设置了key就可以通
   过key来比较

b.最好不要用index作为key,如果事件项顺序改变,会产生没有必要的真实DOM更新,页面效果没有问题但效率低。如果结
构中还包含输入类dom,那么可能会产生错误DOM更新。

23. 路由传参Query和params的区别(参考blog.csdn.net/qq_43787947…)

代码语言:javascript
复制
query语法:
this.$router.push({path:"地址",query:{id:"123"}}); 这是传递参数
this.$route.query.id; 这是接受参数
params语法:
this.$router.push({name:"地址",params:{id:"123"}}); 这是传递参数
this.$route.params.id; 这是接受参数

1.写法的不同
query的语法用于path编写传参地址
params的语法用于name编写传参地址

2.接收方式不同
接受参数的时候用this.$route.params.name或者this.$route.query.name

3.两者中query在刷新页面的时候参数不会消失 但[params]
(https://so.csdn.net/so/search?q=params&spm=1001.2101.3001.7020)
在刷新页面的时候参数会消失 可以考虑本地存储解决此问题

4.query传过来的参数会显示到地址栏中 而params传过来的参数不会显示到地址栏中 直白的来说 query相当于get请求,
而params相当于post请求

24.vue set()方法

代码语言:javascript
复制
在vue中,当我们像对象中添加属性,当数据变化时,页面也要随着变化,这时用到set()

set()原理
目标是对象,就用defineReactive 给新增的属性去添加getter 和 setter;
目标是数组,就直接调用数组本身的 splice 方法去触发响应式
代码语言:javascript
复制
关于vue的知识点这些还远远不够,还有一些原理部分,正在整理中.....
水平有限,如有错误,敬请指正。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-10-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. Vue的优点与缺点
  • 2. 对SPA单页面的理解,它的优缺点分别是什么
  • 3. MVVM模型
  • 4. vue常用的一些指令
  • 5. vue自定义指令
  • 6. Vue常用的修饰符
  • 7. Vue中为什么data是一个函数
  • 8. v-if和v-show的区别
  • 9. Vue的路由实现
  • 10. keep-alive
  • 11. Vue组件间通信方式
  • 12.computed和watch的区别
  • 13.$nextTick
  • 14.路由导航守卫(参照官网)
  • 15. vue的双向数据绑定原理(响应式原理)
  • 16. $route和$router的区别
  • 17. vue的生命周期
  • 18. vuex
  • 19.插槽和作用域插槽的区别
  • 20. vue单项数据流的理解
  • 21. vue如何动态添加属性,实现数据响应
  • 22. Vue中key值的作用
  • 23. 路由传参Query和params的区别(参考blog.csdn.net/qq_43787947…)
  • 24.vue set()方法
相关产品与服务
云服务器
云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档