12个 Vue 技巧,你确定你知道?

目录

1、将一个 prop 限制在一个类型的列表中

2、使用引号来监听嵌套属性

3、知道何时使用 v-if

4、单个作用域插槽的简写

5、将局部和全局的 style 混合在一起

6、重写子组件的样式

7、如何在 Vue 之外创建一个具有响应性的变量

8、v-for 中的解构

9、在指定范围内循环

10、检测元素外部(或内部)的单击

11、从组件外部调用一个方法

12、监听数组和对象


我的博客原文:12个 Vue 技巧,你确定你知道? 

学习成为一个更好的 Vue 开发者,并不总是关于那些需要花时间和精力才能掌握的大概念。掌握一些技巧和窍门,可以让我们的编程生活变得更容易--没有大量重复的工作。下面我主要介绍12个常用的vue技巧。

1、将一个 prop 限制在一个类型的列表中

我们在使用 prop 时,可能会有时候需要判断该 prop 是否在我们规定的范围内(或者说规定的值内),此时可以使用 prop 定义中的 validator 选项,将一个 prop 类型限制在一组特定的值中。

export default {name: 'Test',props: {name: {type: String,},size: {type: String,validator: s => ['small', 'middle'].includes(s)}}
};

这个验证函数接受一个 prop,如果 prop 有效或无效,则返回 true 或 false。当单单传入的 true 或 false 来控制某些条件不能满足需求时,我通常使用这个方法来做。

2、使用引号来监听嵌套属性

watch {'obj.message.name'() {// ...}
}

3、知道何时使用 v-if

有时候使用 v-if,往往使用 v-show 来代替,会有更高的性能。

<TableList v-show="isShow" />

当 v-if 被打开或关闭时,它将创建并完全销毁该元素。相反,v-show 将创建该元素并将其留在那里,通过设置其样式为 display: none 来隐藏它,如果你要切换的组件的渲染成本很高,那么这样做会更有效率,特别是对于结构复杂的组件或页面来说,更推荐使用 v-show。

反过来说,如果不需要立即执行昂贵的组件,可以使用 v-if,这样它就会跳过渲染它,而使页面的加载速度更快一些。

4、单个作用域插槽的简写

限定范围的插槽非常有趣,但为了使用它们,您还必须使用许多模板标记。幸运的是,有一个简写可以让我们摆脱它,但只有在我们使用单个作用域槽的情况下。

你或许这样使用过

<TableList><template #header="attrList"><TableHeader v-bind="attrList" /></template>
</TableList>

不使用 template

<TableList #header="attrList"><TableHeader v-bind="attrList" />
</TableList>

简单、直截了当,令人赞叹不已。

5、将局部和全局的 style 混合在一起

<style scoped>.content {background: green;}
</style>

不过,如果需要的话,也可以添加一个非作用域样式块来添加全局样式

<style>/* 全局 */.content p {font-size: 12px;}
</style><style scoped>/* 在该组件内有效 */.content {background: green;}
</style>

需要注意,全局样式是危险的,难以追踪。但有时,它们是一个完美的逃生舱口,正是你所需要的。

6、重写子组件的样式

Scoped CSS 在保持内容整洁方面非常棒,而且不会将样式引入应用的其他组件中。但有时我们需要覆盖一个子组件的样式,并跳出这个作用域。

Vue 有一个 deep 选择器可以完成以上功能

<style scoped>
.my-content >>> .child-component {font-size: 16px;
}
</style>

注意:如果你使用像 LESS 这样的 CSS 预处理器,你可能需要使用 /deep/ 来代替

<style lang="less" scoped>
.my-content /deep/ .child-component {font-size: 16px;
}
</style>

7、如何在 Vue 之外创建一个具有响应性的变量

如果你从 Vue 之外得到一个变量,让它具有反应性是很好的。这样,我们就可以在 computed props、watch 和其他任何地方使用它,它的工作方式就像 Vue 中的任何其他状态一样。

如果我们使用的选项 API,需要的只是将其放在组件的数据部分中

const externalVariable = getValue();
export default {data() {return {reactiveVariable: externalVariable,};}
};

如果使用 Vue3 的组合 API,可以直接使用 ref 或 reactive

import { ref } from 'vue';// 可以完全在 Vue 组件之外完成
const externalVariable = getValue();
const reactiveVariable = ref(externalVariable);   //使用ref使其具有响应性
使用 reactive 代替
import { reactive } from 'vue';//  可以完全在 Vue 组件之外完成
const externalVariable = getValue();
// reactive 只对对象和数组起作用
const anotherReactiveVariable = reactive(externalVariable)

如果你还在使用 Vue2,你可以使用 observable 而不是 reactive 来实现完全相同的结果

import Vue from 'vue'//  可以完全在 Vue 组件之外完成
const externalVariable = getValue();
const anotherReactiveVariable = Vue.observable(externalVariable);

8、v-for 中的解构

你是否在v-for 中使用解构?
// users: [{name:'leo',id:'1'},{name:'lion',id:'2'}]
<liv-for="{ name, id } in users":key="id"
>{{ name }}
</li>

更广为人知的是,可以通过使用这样的元组从 v-for 中取出索引

<li v-for="(movie, index) in ['Lion King','Frozen','The Princess Bride'
]">{{ index + 1 }} => {{ movie }}
</li>

当使用一个对象时,可以这样使用 key

<li v-for="(value, key) in {name: 'Lion King',released: 2019,director: 'Jon Favreau',
}">{{ key }}: {{ value }}
</li>

也可以将这两种方法结合起来,获取 key 以及属性的 index

<li v-for="(value, key, index) in {name: 'Lion King',released: 2019,director: 'Jon Favreau',
}">{{ index + 1 }} => {{ key }}: {{ value }}
</li>

9、在指定范围内循环

v-for 允许我们遍历数组,也允许我们遍历一个范围

<template><ul><li v-for="num in 6">Item {{ num }}</li></ul>
</template>

渲染结果

Item 1
Item 2
Item 3
Item 4
Item 5
Item 6

这里有个注意点,当我们使用 v-for 遍历一个范围时,它将从 1 开始,以我们指定的数字结束。

10、检测元素外部(或内部)的单击

当我们需要检测一个点击是发生在一个特定元素 el 的内部还是外部,通常使用的方法

window.addEventListener('click', e => {// 获取被点击的元素const currtentEl = e.target;// 检测在el元素的内部还是外部if (el.contains(currtentEl)) {// 在el里面点击了} else {// 在el外面点击了}
});

11、从组件外部调用一个方法

我们可以从一个组件的外部通过给它一个 ref 用来调用一个方法

<!-- Parent.vue -->
<template><Child ref="child" />
</template>// 在该组件调用子组件的方法
this.$refs.child.method();

通常情况下,我们使用 props 和 events 在组件之间进行交流。props 被下发到子组件中,而 events 被上发到父组件中

<template><Child:tell-me-what-to-do="someInstructions"@something-happened="hereIWillHelpYouWithThat"/>
</template>// Child.vue
export default {props: ['trigger'],watch: {shouldCallMethod(newVal) {if (newVal) {// Call the method when the trigger is set to `true`this.method();}}}
}

这可以正常工作,但只能在第一次调用时使用。如果您需要多次触发此操作,则必须进行清理并重置状态。逻辑如下

父组件将 true 传递给触发器 prop

Watch 被触发,然后 Child 组件调用该方法

子组件发出一个事件,告诉父组件该方法已被成功触发

Parent 组件将 trigger 重置为 false,所以我们可以从头再来一次

相反,如果我们在子组件上设置一个 ref,我们可以直接调用该方法(如最开始的方式),我们打破了 “props

down, events up” 的规则,我们打破了封装,但是这样做更清晰,更容易理解。

12、监听数组和对象

有时候使用 watcher 不能正确触发,很多情况下是因为我们试图监听数组或对象,但没有将 deep 设置为 true

export default {name: 'namesChange',props: {names: {type: Array,required: true,},},watch: {names: {// 这将让 Vue 知道要在数组内部寻找,如不添加,则不能进行深度监听deep: true,handler(newVal,oldVal)console.log('The list of names has changed!');}}}
}

在vue3中使用

watch(names,(newVal,oldVal) => {console.log('The list of names has changed!');},{deep: true,}
);

今天就介绍到这里啦! 欢迎在评论区交流。

如果文章对你有所帮助,❤️关注+点赞❤️鼓励一下!博主会持续更新。。。。

往期回顾

 CSS多栏布局-两栏布局和三栏布局

 border边框影响布局解决方案

 css 设置字体渐变色和阴影

css 重置样式表(Normalize.css)

 css实现元素居中的6种方法 

Angular8升级至Angular13遇到的问题

前端vscode必备插件(强烈推荐)

Webpack性能优化

vite构建如何兼容低版本浏览器

前端性能优化9大策略(面试一网打尽)!

vue3.x使用prerender-spa-plugin预渲染达到SEO优化

 vite构建打包性能优化

 vue3.x使用prerender-spa-plugin预渲染达到SEO优化

 ES6实用的技巧和方法有哪些?

 css超出部分显示省略号

vue3使用i18n 实现国际化

vue3中使用prismjs或者highlight.js实现代码高亮

什么是 XSS 攻击?什么是 CSRF?什么是点击劫持?如何防御

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Flutter 开发学习笔记(0):环境配置

文章目录 前言开发需求环境配置运行出现问题我运行也是解决了很久的问题镜像源设置为清华的镜像源&#xff08;不知道有没有影响&#xff09;使用JDK17&#xff0c;测试过JDK21和JDK11都不行手动下载flutter 对应的gradle添加阿里云代理安卓编译下载 运行成功&#xff01; 前言…

为什么使用ZIP、RAR压缩完文件还是很大?还可以这样压缩~

有时候想把文件存储到U盘中&#xff0c;明明买的是32G的U盘&#xff0c;却连5G的内容也放不进去&#xff0c;这可能和U盘的文件系统格式有关。常见的U盘格式有FAT、FAT32、NTFS等&#xff0c;其中FAT32不支持存储单个文件体积大于4G的文件。 除了将U盘的文件系统进行修改&#…

rtph264depay插件分析笔记

1、rtp协议头 2、rtp可以基于TCP或者UDP 其中基于TCP需要加4个字节的RTP标志 3、rtph264depay定义解析函数gst_rtp_h264_depay_process&#xff0c;通过RFC 3984文档实现。 static void gst_rtp_h264_depay_class_init (GstRtpH264DepayClass * klass) {GObjectClass *gobject…

书生·浦语大模型开源体系(一)论文精读笔记

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…

银河麒麟操作系统Kylin Linux 离线安装Nginx1.21.5

一、查看操作系统版本号 nkvers ############## Kylin Linux Version ################# Release: Kylin Linux Advanced Server release V10 (Lance)Kernel: 4.19.90-52.15.v2207.ky10.x86_64Build: Kylin Linux Advanced Server release V10 (SP3) /(Lance)-x86_64-Build20/…

Mysql数据备份与恢复实战

文章目录 备份类型备份内容备份工具mysqldump备份 实战案例&#xff1a;恢复误删除的表准备工作2:30完全备份完全备份后更新数据表10:00误删students表需要恢复还原的状态开始还原恢复 为什么要备份&#xff1f; 备份是为了&#xff1a;灾难恢复&#xff1a;硬件故障、软件故障…

CSP-S2020提高级T3:函数调用

题目链接 [CSP-S2020] 函数调用 题目描述 函数是各种编程语言中一项重要的概念&#xff0c;借助函数&#xff0c;我们总可以将复杂的任务分解成一个个相对简单的子任务&#xff0c;直到细化为十分简单的基础操作&#xff0c;从而使代码的组织更加严密、更加有条理。然而&…

Netty源码剖析——ChannelPipeline 调度 handler 的源码剖析(三十九)

ChannelPipeline 调度 handler 的源码剖析 源码剖析目的 当一个请求进来的时候&#xff0c;ChannelPipeline 是如何调用内部的这些 handler 的首先&#xff0c;当一个请求进来的时候&#xff0c;会第一个调用 pipeline 的 相关方法&#xff0c;如果是入站事件&#xff0c;这些方…

突破编程_前端_JS编程实例(分割窗体组件)

1 开发目标 分隔窗体组件旨在提供灵活的窗体分隔功能&#xff0c;支持横向分割与纵向分隔两种类型&#xff0c;并具备拖拽调整窗体比例的功能&#xff0c;同时提供最小比例设置&#xff0c;以防止窗体被过度缩小&#xff1a; 2 详细需求 2.1 分隔窗体类型 &#xff08;1&…

数据类型和类型检测

Data Type And Type Checking 1.编程语言中的数据类型 类型和变量 一个类型是一系列值的集合&#xff0c;这些集合可以抽象出一个相同的特点&#xff0c;并且可以相互实现计算 例如&#xff1a; 布尔类型&#xff1a;true or false整形&#xff1a;1,2,3…浮点数类型&#xf…

JUC:double-checked locking(DCL) 懒汉单例模式

文章目录 double-checked locking(DCL) 问题解决方法 volatile作用 double-checked locking(DCL) 问题 第一个if用于后续进入的线程&#xff0c;不用再获取锁来判断是否已经创建了对象。第二个if&#xff0c;为的是第一个进入的线程创建对象&#xff0c;以及防止卡在第一个if之…

提升你的CSS技能:深入理解伪类选择器和伪元素选择器!

在CSS的世界里&#xff0c;有些选择器并不像它们的名字那样直接。今天&#xff0c;我们要探索的是两种特殊的选择器&#xff1a;伪类选择器和伪元素选择器。它们虽然名字相似&#xff0c;但功能和用途却大有不同。 下面就让我们一起来了解一下它们是如何在我们的页面布局中扮演…