【vue】vue的几个提效技巧:

news2024/11/23 15:08:56

文章目录

        • 一、动态组件``结合v-for循环使用
            • 【1】使用环境
            • 【2】实际使用
            • 【3】编译以后的效果
        • 二、watch进阶使用
            • 【1】立即执行
            • 【2】深度监听
        • 三、计算属性之setter
        • 四、$on('hook:生命周期')来简化window监听
        • 五、子组件@hook:生命周期监听子组件的生命周期回调
        • 六、v-pre
        • 七、v-once
        • 八、Vue.set()
        • 九、$forceUpdate()
        • 十、keep-alive
        • 十一、$route路由信息
        • 十二、$route路由信息不刷新问题
            • 【1】使用场景
            • 【2】解决方案
        • 十三、$emit传参同时拿到父子组件两者入参的值
        • 十四、样式穿透
            • 【1】使用环境
            • 【2】实际使用
        • 十五、Object.freeze()
            • 【1】使用环境
            • 【2】实际使用
        • 十六、组件通信技巧
        • 十七、mixins混入的使用
            • 【1】使用环境
            • 【2】实际使用
            • 【3】注意点(使用的页面统称为组件)
        • 十八、qs
            • 【1】使用场景
            • 【2】实际使用
        • 十九、v-for绑定key不建议使用index
            • 【1】主要原因
            • 【2】解决方案
        • 二十、v-for不建议配合v-if
            • 【1】主要原因
            • 【2】解决方案
        • 二十一、document.body.contentEditable


一、动态组件<component :is='组件名'></component>结合v-for循环使用

【1】使用环境

如图,这是一个v-for渲染的列表(只是目前这个版块才刚开始做,目前只有一个),圆圈内的就是一个组件,也就是要v-for动态组件
在这里插入图片描述

【2】实际使用
<template>
	<component v-for="(item,index) in componentList" :key="index" :is="item"></component>
</template>

<script>
import ColorIn from '@/components/Magic/ColorIn.vue'
import LineIn from "@/components/Magic/LineIn.vue";
import LineIn from "@/components/Magic/Header.vue";
import LineIn from "@/components/Magic/Footer.vue";

export default{
   components:{ColorIn, LineIn, Header,Footer}
}
</script>
【3】编译以后的效果
<ColorIn></ColorIn>
<LineIn></LineIn>
<Header></Header>
<Footer></Footer>

二、watch进阶使用

【1】立即执行
  1. 使用环境

例如场景为页面一进来就调用拉取列表数据getList(),然后监听路由的$route.query.id然后触发列表数据的更新

  1. 实际使用
watch:{
    '$route.query.id':{
        handle(){
            this.getList();
        },
        immediate:true //使用immediate即可立即执行
    }
},
created(){
    this.getList();
},
【2】深度监听
  1. 使用环境

在监听对象的时候,对象的内部属性发生变化watch无法监听到,这种时候就需要使用深度监听

  1. 实际使用
data(){
    return{
        queryList:{
            count:0,
            name:'',
        }
    }
},
watch:{
    queryList:{ 
        handle(newValue,oldValue){ 
        //do something 
        }, 
        deep:true //只需要设置deep:true即可开启深度监听
    }
},

三、计算属性之setter

我们一般平常使用的都是getter,但其实它还有个setter,当计算属性的fullName触发更新的时候,就会触发setter回调

data(){
    return{
        firstName:'',
        lastName:'',
    }
},
computed:{
    fullName:{
        get(){
            return `${this.firstName} ${this.lastName}`;
        },
        set(newValue){
            let names=newValue.split(' ');
            this.firstName=names[0];
            this.lastName=names[1];
        }
    }
},

四、$on(‘hook:生命周期’)来简化window监听

先来看一下平常的使用方法,

mounted () {
    window.addEventListener('resize', this.resizeHandler);
},
beforeDestroy () {
    window.removeEventListener('resize', this.resizeHandler);
}

改写以后的代码为,相比于上面的写法,这个写法的好处在于可以开启一个事件监听器的同时,就在beforeDestroy生命周期中挂载一个删除事件监听器的事件。比上面的写法会更加安全,更加有助于避免内存泄露并防止事件冲突

mounted () {
  window.addEventListener('resize', this.resizeHandler);
  this.$on("hook:beforeDestroy", () => {
    window.removeEventListener('resize', this.resizeHandler);
  })
}

五、子组件@hook:生命周期监听子组件的生命周期回调

<child @hook:mounted="listenChildMounted" />

六、v-pre

不需要编译的html代码可以使用v-pre,可以提高性能

<span v-pre>{{message}}</span>    //就算data里面定义了message,渲染完也是{{message}}

七、v-once

只需要渲染一次,适用于渲染完以后就不会更新的内容,降低性能开销

<span v-once>{{message}}</span>    //message的值会编译后渲染,但是编译以后再次修改message的值不会触发更新

v-pre与v-once的区别:
v-pre相当于不编译,直接显示,v-once相当于只编译一次,后面的更新不编译了

八、Vue.set()

① 当你利用索引直接设置一个数组项时
② 当你修改数组的长度时
③ 对象属性的添加或删除时
由于Object.defineprototype()方法限制,数据不响应式更新

this.$set(arr,index,item);

九、$forceUpdate()

$set() 也有一定的使用限制,当对象没有这个属性的时候,$set() 就会报错,这种时候,直接修改数据,再使用 $forceUpdate() 强制视图刷新即可

this.$forceUpdate();

十、keep-alive

【1】当这个页面没有数据更新,或者是想保存状态,下次进来还是这样子的时候,例如淘宝查看列表页,点进去查看详情之后,返回列表页依旧到上次浏览到的地方,都可以使用keep-alive
【2】分为配合路由使用,使用max,include,exclude,以及特殊的生命周期activateddeactivated

十一、$route路由信息

【1】$route.query.id用来拿取路由传值的信息,比如路由的后缀?id=1, r o u t e . q u e r y . i d 拿到的值为 1 【 2 】 ‘ route.query.id拿到的值为1 【2】` route.query.id拿到的值为12route.meta.flag用来拿取路由meta中的信息,路由信息里的meta是可以自定义属性的,我一般导航栏当前选中的nav用来和$route.meta.flag进行匹配,来拿到当前页面应该激活哪一个选项卡 【3】base路由`比方说百度的所有路由前缀要加/baidu,那么可以设置路由的base为/baidu

export const router = new Router({
  base:'/baidu/',
}

此外,打包的时候,请修改config/index.js的build块中的assetsPublicPath为 ‘/baidu/’,不然打包以后是找不到资源文件路径的

module.exports = {
    build:{
        assetsPublicPath: '/baidu/',
    }
}

【4】全局路由钩子
使用场景一般为用户的登录鉴权

router.beforeEach((to, from, next) => {
  //一定要调用next()才能到下一个页面
  if (path === '/login') {
    next()
  }else{
    if(token){
      next();
    }else{
      next('/login');
    }  
  }
})

【5】组件路由钩子中访问this
组件路由的钩子一开始还未初始化,不能访问到vue实例

beforeRouteEnter (to, from, next) {
// 这里还无法访问到组件实例,this === undefined
next( vm => {
// 通过 vm 访问组件实例
})
}

十二、$route路由信息不刷新问题

【1】使用场景

有的时候,你从 /user?id=1 跳转到 /user?id=2 的时候,由于渲染同样的 User 组件,导致路由会复用,此时,页面就会仍然是用户1的信息。

【2】解决方案
  1. 组件内的路由守卫
beforeRouteUpdate(to, from, next) {
    // 在当前路由改变,但是该组件被复用时调用
    // 举例来说,对于一个带有动态参数的路径 /foo/:id,在 /foo/1 和 /foo/2 之间跳转的时候,
    // 由于会渲染同样的 Foo 组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用。
    // 可以访问组件实例 `this`
},
  1. 给 <router-view> 绑定 key
<router-view :key="$route.fullpath"></router-view>
  1. 使用watch监听路由
watch:{
   '$route':{
       hander(){
           // do something...
       },
       immediate:true   //如果要首次加载就触发
   }
}

十三、$emit传参同时拿到父子组件两者入参的值

在实际项目开发中,可能会遇到 $emit 的值和父组件的index都要拿的情况,但是按照之前的写法,只能拿到其中一个的值,要么子组件,要么父组件,鱼和熊掌不可兼得

  1. 子组件入参
this.$emit('uploadSuccess',res);
  1. 父组件入参
<Up @uploadSuccess="uploadLogoImage(index,arguments)"  />
  1. 方法取参
uploadLogoImage(){
   console.log(arguments[0]);          //index
   console.log(arguments[1][0]);      //res
},

十四、样式穿透

【1】使用环境

一般在修改插件样式的时候使用的比较多

【2】实际使用

分为两种,一般stylus中使用>>>,less中使用/deep/,sass没有使用经验,不予说明

>>>.el-dialog .el-dialog__body{
  padding 0
  text-align center
  border-radius 0 0 4px 4px
}
/deep/.el-dialog .el-dialog__body{
  padding 0
  text-align center
  border-radius 0 0 4px 4px
}

十五、Object.freeze()

【1】使用环境

我们都知道vue是使用Object.defineProperty对数据进行双向绑定,而对于只做展示使用的长列表,可以使用Object.freeze()进行冻结,使它无法被修改,从而提高性能

【2】实际使用
getList().then(res=>{
    this.list=Object.freeze(res.data.result);
})

值得注意的是,改变list的值不会更新,但改变引用会触发更新

十六、组件通信技巧

  1. props
  2. $emit
  3. $attrs & $listeners
  4. provide & inject
  5. vuex
  6. Observable
  7. eventBus
  8. $refs
  9. slot-scope & v-slot
  10. scopedSlots
  11. $parent & $children & $root

十七、mixins混入的使用

【1】使用环境

一般获取验证码,收藏,点赞等公用且逻辑一样(有些逻辑是根据页面的不同而不同的不建议使用混入)等场景都可以使用混入

【2】实际使用

这里我直接封装了一个vue新开窗口的混入方法,引入了以后,混入中的所有data,methods,以及生命周期都会共享

//openWindow.js
export default {
  methods:{
    openUrl(url){
      const link= this.$router.resolve({path: url});
      window.open(link.href,'_blank');
    },
  }
}

//其他页面使用
import openWindow from "../../mixins/openWindow";
export default{
    mixins:[openWindow],
}
【3】注意点(使用的页面统称为组件)

① 混入比组件优先执行
② 当混入中的属性或者方法与组件中的属性或者方法名称相同时,以组件中的值为准(结合上一条规则,因为混入先执行,所以组件会将混入覆盖)
③ 比方说A页面和B页面都使用了同一个混入,A页面与B页面的状态同样是独立的

十八、qs

【1】使用场景

get传输的时候都是路由拼接方式(?a=1&b=2),而不是json方式

【2】实际使用
//安装依赖
npm install qs --save

//页面中或者直接api.js中直接序列化使用
import qs from 'qs'
qs.stringify(params)

//axios拦截器中直接使用
import qs from 'qs'
axios.interceptors.request.use(
  config => {
    if (config.method === 'get') {
      config.data = qs.stringify(config.data)
    }
)

十九、v-for绑定key不建议使用index

【1】主要原因

有的时候v-for列表可能存有删除,交换位置等操作,这种时候index的顺序变换会导致同一条数据,在此刻的index置换,所以,不建议v-for的key绑定index

【2】解决方案

建议使用另外的并且值唯一的变量,例如后台给你的id,反正只要是唯一,不会重复即可

二十、v-for不建议配合v-if

【1】主要原因

v-for的优先级比v-if高,也就是说,假设总计50条数据,即使经过v-if以后,只剩下25条显示,但是v-for早就循环了一遍50条数据,解决办法就是用一个计算属性先将数据过滤了以后,v-for循环过滤了之后的数据

【2】解决方案

使用 computed 计算属性,对列表进行过滤,只剩下过滤之后需要的数据

二十一、document.body.contentEditable

操作方法:
打开控制台,输入document.body.contentEditable=true,然后敲回车,网页可以像word一样编辑,很方便对于页面的布局抗压能力做测试

javascript: (function () {
	if (document.body.hasAttribute('contentEditable')) {
		document.body.removeAttribute('contentEditable');
	} else {
		document.body.contentEditable = true;
	}
})();

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/847108.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Three.js给场景添加背景颜色,背景图,全景图

1.相关API的使用&#xff1a; 1 THREE.Color &#xff08;用于创建和表示颜色&#xff09; 2. THREE.TextureLoader&#xff08;用于加载和处理图片纹理&#xff09; 3. THREE.SphereGeometry&#xff08;用于创建一个球体的几何体&#xff09; 4. THREE.Mesh&#xff08;用…

【C# 基础精讲】条件语句:if、else、switch

条件语句是C#编程中用于根据条件执行不同代码块的关键结构。C#支持if、else和switch三种常见的条件语句&#xff0c;它们允许根据表达式的结果决定程序的执行路径。在本文中&#xff0c;我们将详细介绍这三种条件语句的语法和使用方法。 if语句 if语句用于在给定条件为真&…

有奖活动 | 大咖论道:一同畅聊鸿蒙生态

点击预约直播 活动简介 即日起-2023年9月5日&#xff0c;参与本期活动与大咖一起聊聊鸿蒙新生态&#xff0c;您可以在社区写下对鸿蒙生态的畅想&#xff0c;也可以学习相关课程并获取证书&#xff0c;完成活动任务即可参与精美礼品抽奖。 活动周期 8月1日-9月5日 参与考试 Harm…

逻辑卷扩容

背景 服务器有3个逻辑卷&#xff0c;1个是1T&#xff0c;另外两个是500G&#xff0c;需要将500G的合并扩容为1T 操作 df -Th lsblk -f 查看磁盘大小卸载 /approot umount /approot vim /etc/fstab #注释掉/approot mount -a检查是否卸载完成 vgdisplay -v 找到approot所在…

重磅!官方Android现代开发指南发布!

重磅&#xff01;官方Android现代开发指南发布&#xff01; 最近查看了google官方Android开发站点&#xff0c;猛然发现页面做了一些改动&#xff0c;新增了一个专题tab页&#xff0c;增加了一个UI开发指南模块&#xff0c;该模块整合了Jetpack Compose、Jetpack架构组件及Mat…

elementui实现当前页全选+所有全选+翻页保持选中状

原文来自&#xff1a;https://blog.csdn.net/sumimg/article/details/121693305?spm1001.2101.3001.6650.1&utm_mediumdistribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-121693305-blog-127570059.235%5Ev38%5Epc_relevant_anti_t3&depth_1-utm…

使用 Python 和 Flask 构建简单的 Restful API 第 1 部分

一、说明 我将把这个系列分成 3 或 4 篇文章。在本系列的最后&#xff0c;您将了解使用flask构建 restful API 是多么容易。在本文中&#xff0c;我们将设置环境并创建将显示“Hello World”的终结点。 我假设你的电脑上安装了python 2.7和pip。我已经在python 2.7上测试了本文…

2023 华数杯全国大学生数学建模竞赛 ——C题母亲身心健康对婴儿成长的影响 完整建模+代码

目录 完整思路下载链接&#xff1a;这里可以获取2023华数杯全国大学生数学建模竞赛题目C 题母亲身心健康对婴儿成长的影响✅ 问题1问题1建模思路✅ 问题2问题2建模思路✅ 问题3问题3建模思路✅ 问题4问题4建模思路✅ 问题5问题5建模思路提供的数据和资料&#xff1a; 完整思路下…

【我们一起60天准备考研算法面试(大全)-第四十天 40/60】【并查集】

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#…

el-table实现指定列合并

table传入span-method方法可以实现合并行或列&#xff0c;方法的参数是一个对象&#xff0c;里面包含当前行row、当前列column、当前行号rowIndex、当前列号columnIndex四个属性。该函数可以返回一个包含两个元素的数组&#xff0c;第一个元素代表rowspan&#xff0c;第二个元素…

ESP 32 蓝牙虚拟键盘链接笔记本电脑的键值问题

由于打算利用esp32 通过蓝牙链接电脑后实现一些特俗的键盘功能&#xff0c;所以就折腾了一下&#xff0c;折腾最耗费时间的却是键值问题&#xff0c;让一个20多年的老司机重新补充了知识 过程曲折就不说了&#xff0c;直接说结果。 我们通过网络搜索获取的键值和蓝牙模拟键盘传…

云专线的应用场景

云专线是连接用户本地数据中心和云上虚拟私有云的高安全、高速度、低延迟、稳定可靠的专属连接通道&#xff0c;主要有以下应用场景。 1、混合云环境&#xff1a;企业在私有云和公有云之间传输数据及部署应用时&#xff0c;使用云专线建立专用的网络连接&#xff0c;保证数据传…

做赴日IT工作 Java Python等语言哪个更好?

很多同学问我&#xff0c;做赴日IT工作Java&#xff0c;Python等语言哪个更好&#xff1f;更容易拿到内定通知书&#xff1f;如果你想去做赴日IT工作&#xff0c;无论是学Java还是Python或是其他编程语言&#xff0c;都是很好的选择&#xff0c;因为它们都有自己的的前景和应用…

如何快速完成MySQL数据的差异对比|NineData

在现代商业环境中&#xff0c;数据库是企业存储核心数据的重要工具&#xff0c;而 MySQL 作为最受欢迎的关系型数据库管理系统&#xff0c;广泛应用于各行各业。在容灾、数据迁移、备份恢复等场景下&#xff0c;为了确保两端或多端之间数据的一致性&#xff0c;通常需要对数据进…

【C++】多态(多态的构成条件,虚函数重写,override,final,覆盖隐藏对比)

文章目录 前言一、多态的定义及实现1.多态的构成条件&#xff1a; 二、虚函数1.虚函数的重写2.虚函数重写的例外&#xff08;协变&#xff09;3.析构函数的虚函数&#xff08;基类与派生类析构函数名字不同&#xff09;1.不加virtual的一般情况&#xff1a;2.不加virtual会出现…

Merge和Rebase的区别

Merge 和 Rebase 是 Git 中常用的两种分支整合方式&#xff0c;它们具有不同的工作原理和效果&#xff1a; Merge&#xff08;合并&#xff09; 合并是将两个或多个分支的提交历史合并为一个新的提交。在合并时&#xff0c;Git 会创建一个新的合并提交&#xff0c;将两个分支…

Android中简单封装Livedata工具类

Android中简单封装Livedata工具类 前言&#xff1a; 之前讲解过livedata和viewmodel的简单使用&#xff0c;也封装过room工具类&#xff0c;本文是对livedata的简单封装和使用&#xff0c;先是封装了一个简单的工具类&#xff0c;然后实现了一个倒计时工具类的封装. 1.LiveD…

让你的商城触达全球市场!了解跨境商城系统源码的优势

全球市场触达的商机 随着全球化趋势的不断发展&#xff0c;跨境电商已经成为企业开拓全球市场的重要途径之一。在扩大国际业务的同时&#xff0c;企业需要面对许多挑战&#xff0c;如语言、支付、物流等问题。这些问题可以通过使用跨境商城系统源码来解决。 一、多语言支持 跨境…

如何做好电信布线?

电信布线作为通信网络骨干&#xff0c;对于任何现代企业或组织来说都是至关重要的组成部分。随着业务量的持续增长&#xff0c;对电信布线安装提出了更高的要求。为此&#xff0c;飞速&#xff08;FS&#xff09;提出了FHD电信布线解决方案&#xff0c;在满足了电信机房要求的基…

源码分析——ConcurrentHashMap源码+底层数据结构分析

文章目录 1. ConcurrentHashMap 1.71. 存储结构2. 初始化3. put4. 扩容 rehash5. get 2. ConcurrentHashMap 1.81. 存储结构2. 初始化 initTable3. put4. get 3. 总结 1. ConcurrentHashMap 1.7 1. 存储结构 Java 7 中 ConcurrentHashMap 的存储结构如上图&#xff0c;Concurr…