Vue 爬坑

都是基于最新的Vue3版本 "vue": "^3.4.29"

1 vue组建样式设置

<script setup lang="ts">
import HelloWorld from './components/HelloWorld.vue'
</script><template><div><a href="https://vitejs.dev" target="_blank"><img src="/vite.svg" class="logo" alt="Vite logo" /></a><a href="https://vuejs.org/" target="_blank"><img src="./assets/vue.svg" class="logo vue" alt="Vue logo" /></a></div><HelloWorld msg="Vite + Vue"  class="test-baz"/>
</template><style scoped>
.logo {height: 6em;padding: 1.5em;will-change: filter;transition: filter 300ms;
}
.logo:hover {filter: drop-shadow(0 0 2em #646cffaa);
}
.logo.vue:hover {filter: drop-shadow(0 0 2em #42b883aa);
}
.test-baz {color: red;
}
</style>

父组建里面的test-baz并不会被字组建HelloWorld用到,字组建只会用它自己里面的test-baz样式。

2  vue中getter函数理解

在JavaScript中箭头函数 () => x.value + y.value 是一个匿名函数,并不是getter函数。

  在Vue中,watch 函数用于观测一个表达式或函数(通常称为“getter”)的变化。当这个表达式的值发生变化时,watch 中定义的回调函数会被触发。因此,尽管上面提到的箭头函数 () => x.value + y.value 本身并不是一个严格意义上的JavaScript getter函数(如在对象属性定义中的那种),在Vue框架的上下文中,它可以被视作一个“getter”功能的实现,因为它用来获取并计算状态(即 x.value 和 y.value 的和)。

  这里的匿名箭头函数 ( ) => x.value + y.value 被Vue用作一个getter来监控依赖项(x.value 和 y.value)的变化。当这些依赖项的值发生变化导致计算结果(即两者的和)改变时,Vue就会调用第二个参数中的回调函数,打印出新的求和结果。因此,在Vue的语境下,将其称为一个“getter函数”是为了强调其观测数据变化并响应的功能,而非严格遵循JavaScript语言中getter的定义。

3  watch和 watchEffect 

 修改状态数据就是副作用

const testNumber = ref(0)// 可以直接侦听一个 ref
watch(testNumber, async (newValue, oldValue) => {testNumber.value = testNumber.value + 1
},)

上面代码会造成循环依赖报错

Uncaught (in promise) Maximum recursive updates exceeded. This means you have a reactive effect that is mutating its own dependencies and thus recursively triggering itself. Possible sources include component template, render function, updated hook or watcher source function.

可以修改成只会执行一次,

const testNumber = ref(0)// 可以直接侦听一个 ref
watch(testNumber,async (newValue, oldValue) => {testNumber.value = testNumber.value + 1},{ once: true }
)

或者使用watchEffect

const testNumber = ref(0)watchEffect(async () => {testNumber.value+=1
})

watchEffect修改自己内部ref不会造成循环依赖。

JPT:

在Vue中,watch 用于观察数据变化并在变化时执行一些操作。关于“避免在发生副作用时追踪依赖”的说法,这实际上与Vue的响应式系统如何处理数据变化和依赖收集有关,尤其是在Vue 3引入的Composition API中,通过refreactive创建的状态自动具有响应式特性。

当你在watch的回调函数内部修改正在被观察的数据时,如果没有正确处理,可能会导致无限循环或者不期望的行为。这是因为修改数据会再次触发依赖更新,进而重新触发watch,形成一个循环。为了避免这种情况,Vue在设计上要求开发者注意副作用的管理。

const testNumber = ref(0)// 可以直接侦听一个 ref
watch(testNumber,async (newValue, oldValue) => {testNumber.value = testNumber.value + 1}
)

执行这段代码会导致以下问题:

  • 副作用:直接修改响应式数据是一种副作用,因为它改变了应用的状态。
  • 依赖追踪与无限循环:修改testNumber.value会触发表达式的重新计算,如果这个修改又满足watch的触发条件,那么watch回调将再次执行,从而可能形成无限循环。

为了避免这种情形,Vue提供了几种策略:

  1. 使用异步watch: 如果你的副作用需要修改触发它的数据,考虑使用异步watch(通过将回调设为返回Promise的函数,或使用immediateflush: 'post'选项)。这样Vue会在当前tick的微任务队列结束后再执行副作用,避免了即时的循环触发。
  2. 在副作用中谨慎修改数据: 确保修改数据的操作不会立即触发正在运行的watcher的重新计算。有时候可以通过条件判断来避免不必要的修改。
  3. 使用watchEffect: 如果你的副作用逻辑依赖于多个状态,并且修改这些状态是预期行为的一部分,考虑使用watchEffectwatchEffect更加灵活,会自动管理依赖,并确保副作用在依赖变更时执行,但同样需要注意避免循环调用的问题。

总之,“避免在发生副作用时追踪依赖”意味着在执行可能改变响应式数据的操作时,要小心不要无意中触发了自己正在依赖的数据变化,从而进入无限循环或不可控的状态变更。正确的做法是合理安排数据修改的位置和时机,以及利用Vue提供的机制来控制副作用的执行。

4  DOM内模板和<template>区别

在Vue中,<template> 标签有特定的用途,根据上下文的不同,它扮演着不同的角色。以下是两种主要的使用场景:

1. Vue单文件组件内的 <template>

在Vue的单文件组件(SFC,Single File Component)中,<template> 标签用于包裹组件的HTML模板部分。这部分定义了组件的结构和布局,Vue会解析这个模板并将其编译为虚拟DOM。例如:

vue

<template><div class="example"><h1>{{ message }}</h1><button @click="reverseMessage">Reverse Message</button></div>
</template><script>
export default {data() {return {message: 'Hello Vue!'};},methods: {reverseMessage() {this.message = this.message.split('').reverse().join('');}}
};
</script>

在这个例子中,<template> 包含了组件的HTML结构,其中可以绑定数据和事件处理器。

2. DOM内模板插值

在Vue 2中,有一种较为少见的用法是在DOM中直接使用模板字符串插值,这种方式不推荐在现代Vue应用中使用,但在某些老版本的应用或特定场景下可能存在。这通常指的是直接在HTML元素内使用双大括号 {{ }} 来插入数据。例如:

html

<div id="app">{{ message }}
</div><script>
new Vue({el: '#app',data: {message: 'Hello World!'}
});
</script>

这里虽然没有直接使用<template>标签,但双大括号 {{ }} 实现了数据绑定,相当于简单模板的使用。然而,对于复杂的结构和逻辑,应该使用Vue组件和<template>标签。

总结

  • Vue SFC中的 <template> 定义了组件的HTML结构,是Vue组件的核心部分,支持指令、插槽等高级功能。
  • DOM内模板插值 使用双大括号 {{ }} 直接在HTML中插入数据,适用于非常简单的数据展示,但不适用于复杂组件结构和逻辑。

在现代Vue开发实践中,推荐使用Vue组件和单文件组件内的<template>来构建应用界面,以充分利用Vue的响应式系统和组件化优势。

v-model 自定义修饰符

子组件

const [myDemo, myDemoModifiers] = defineModel('myDemo',{// get我们这里不需要set(value:string) {if (myDemoModifiers.uppercase) {return value?.toUpperCase();}},
});<input type="text" v-model="myDemo" />

父组件

const name = ref(0)<HelloWorld msg=""  v-model:my-demo.uppercase="name"
/>

6 什么是构建步骤

构建步骤就是将源码转化为可执行的代码的过程。例如使用vite、webpack进行转换!

7  组件Class 与 Style 绑定

//父组件
<script setup lang="ts">
import HelloWorld from './components/HelloWorld.vue'</script><template><HelloWorld class="test-baz"     :style="{ backgroundColor:'pink'}"/></template><style scoped></style>//子组件<script setup lang="ts"></script><template><p class="input-color">Hi!</p>
</template><style scoped >.test-baz {color: green ;
}.input-color {color: red;
}</style>

渲染结果

外部样式放在默认样式后面class="input-color test-baz"

按道理应该是test-baz的优先级比input-color高(错误认为)

当一个元素指定多个 class 时,class 的优先级与指定顺序无关,而是和 class 的定义顺序有关。后声明的优先级高。

.test-baz {color: green ;
}.input-color {color: red;
}

input-color定义在下面所以优先级高。

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

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

相关文章

RPA 第一课

RPA 是 Robotic Process Automation 的简称&#xff0c;意思是「机器人流程自动化」。 顾名思义&#xff0c;它是一种以机器人&#xff08;软件&#xff09;来替代人&#xff0c;实现重复工作自动化的工具。 首先要说一句&#xff0c;RPA 不是 ChatGPT 出来之后的产物&#x…

elementui中@click短时间内多次触发,@click重复点击,做不允许重复点击处理

click快速点击&#xff0c;发生多次触发 2.代码示例&#xff1a; //html<el-button :loading"submitLoading" type"primary" click"submitForm">确 定</el-button>data() {return {submitLoading:false,}}//方法/** 提交按钮 */sub…

分布式锁——基于Redis分布式锁

单机锁 服务器只有一个&#xff0c;JVM只有一个。 用synchronized加锁&#xff0c;对lock对象加锁&#xff0c;只有线程1结束&#xff0c;线程2,3才会开始。 再用uid避免一个线程多次进来。 分布式锁 真正上线时&#xff1a; 【注&#xff1a;这些服务器连接的是一个Redis集…

STM32入门笔记(03): ADC(SPL库函数版)(2)

A/D转换的常用技术有逐次逼近式、双积分式、并行式和跟踪比较式等。目前用的较多的是前3种。 A/D转换器的主要技术指标 转换时间 分辨率 例如&#xff0c;8位A/D转换器的数字输出量的变化范围为0&#xff5e;255&#xff0c;当输入电压的满刻度为5V时&#xff0c;数字量每变化…

如何学好自动化测试

1. 什么是自动化测试 自动化测试是使用脚本和工具来执行测试任务&#xff0c;以替代手工测试过程。它可以提高效率、减少人工错误&#xff0c;并增加测试覆盖率。在软件开发过程中&#xff0c;自动化测试已经成为了不可或缺的一部分。 自动化测试主要有以下好处&#xff1a; …

Amos结构方程模型---探索性分析

初级 第5讲 探索性分析_哔哩哔哩_bilibili amos中基本操作&#xff1a; 椭圆潜变量&#xff0c;不可预测 数据导入 改变形状 判定系数 方差估计和假设检验&#xff1a; 探索性分析&#xff1a; ses&#xff08;潜变量&#xff09;社会经济指数 从考虑最大的MI开始&#xff0c;卡…

【Python画图-驯化seaborn】一文搞懂seaborn中的箱线图实践技巧

【Python画图-驯化seaborn】一文搞懂seaborn中的箱线图实践技巧 本次修炼方法请往下查看 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合&#xff0c;智慧小天地&#xff01; &#x1f387; 免费获取相关内容文档关注&a…

1.4 ROS2集成开发环境搭建

1.4.1 安装VSCode VSCode全称Visual Studio Code&#xff0c;是微软推出的一款轻量级代码编辑器&#xff0c;免费、开源而且功能强大。它支持几乎所有主流的程序语言的语法高亮、智能代码补全、自定义热键、括号匹配、代码片段、代码对比Diff、GIT 等特性&#xff0c;支持插件…

7.3数据库第一次作业

安装MySQL 1.打开安装包 2.选择自定义安装&#xff08;custom&#xff09;并点击下一步 3.自定义安装路径 4.点击执行 5.执行成功 6.默认选项点击下一步 7.选择新的授权方式并点击下一步 8.配置密码 9.默认配置并点击下一步 10.点击执行&#xff08;Execute&#xff09; 11.执…

python中的文件

1.什么是文件&#xff1f; 硬盘上存储的数据都是以文件的形式来组织的~ 文件是数据在硬盘上的存储形式&#xff0c;不同的数据在硬盘上的存储形式是不同的&#xff0c; 2.文件路径 文件夹/目录。 文件夹&#xff0c;再包含文件夹的情况&#xff0c;这就是一个嵌套的关系&…

2024-2025年本田维修电路图线路图接线图资料更新

此次更新了2024-2025年本田车系电路图资料&#xff0c;覆盖市面上99%车型&#xff0c;包括维修手册、电路图、新车特征、车身钣金维修数据、全车拆装、扭力、发动机大修、发动机正时、保养、电路图、针脚定义、模块传感器、保险丝盒图解对照表位置等等&#xff01; 汽修帮手汽…

Java中使用arima预测未来数据

看着已经存在的曲线图数据&#xff0c;想预估下后面曲线图的数据。 import java.util.Vector;public class AR {double[] stdoriginalData{};int p;ARMAMath armamathnew ARMAMath();/*** AR模型* param stdoriginalData* param p //p为MA模型阶数*/public AR(double [] stdori…

你的硬盘知道的太多:你以为你的秘密真的被删除了吗?

某一天你收到了朋友发给你的一个秘密文件&#xff0c;在看完之后&#xff0c;为了不被别人发现&#xff0c;你决定将文件毁尸灭迹&#xff01; 你选中文件名称 / 右键 / 删除&#xff0c;好了&#xff0c;文件已经消失了。但你是懂电脑的&#xff0c;知道文件此时还在回收站里面…

海外虚拟卡开卡平台有哪些?无限开卡,无其他限制

随着时代的发展很多小伙伴都需要海外虚拟卡&#xff0c;海外虚拟卡开卡平台我这里用的是Fomepay的&#xff0c;他们比较人性化&#xff0c;有客服&#xff0c;随时可咨询 对于消费者而言&#xff0c;虚拟卡号提供了隐私&#xff0c;因此广告商更难以跟踪和定位购买行为&#x…

《python程序语言设计》2018版第5章第50题利用turtle编程显示三角形图案

2024.06.18 05.50.01version 首先我觉得还是应该现从简单阵列来进行。非常简单。顺便回忆一下我3月份做的5.19题里那些淘气的数列 代码成功 #将i从10设计成12打印的毕竟好看 for i in range(1,12):#这这里给结尾的i2效果并不好看for j in range(1,i):print(j,end" "…

【深度学习】Transformer

李宏毅深度学习笔记 https://blog.csdn.net/Tink1995/article/details/105080033 https://blog.csdn.net/leonardotu/article/details/135726696 https://blog.csdn.net/u012856866/article/details/129790077 Transformer 是一个基于自注意力的序列到序列模型&#xff0c;与基…

软件测试与质量保证 | 云班课选择题库

目录 第1章课后习题 第2章课后习题 第3章课后习题 第4章课后习题 第5章课后习题 第6章课后习题 第7章课后习题 第8章课后习题 第9章课后习题 第10章课后习题 第11章课后习题 第12章课后习题 第13章 测试相关未分类习题 第1章课后习题 1. 与质量相关的概念包括 &a…

可充电纽扣电池ML2032充电电路设计

如图&#xff0c;可充电纽扣电池ML2032充电电路设计。 图中二极管是为了防止电流倒灌&#xff0c; 电阻分压出3.66v&#xff0c;再减掉二极管压降&#xff08;约0.4v)得3.26V&#xff0c;加在电池正负极充电。 随着电池电量的积累&#xff0c;充电电流逐步减小&#xff0c;极限…

什么样的企业适合SD-WAN网络专线?

SD-WAN&#xff08;Software-Defined Wide Area Network&#xff0c;软件定义广域网&#xff09;是一种网络技术&#xff0c;它利用软件定义的方式管理和控制广域网&#xff08;WAN&#xff09;&#xff0c;旨在提高网络效率、降低成本并简化网络管理。以下是适合采用SD-WAN网络…

服务器之BIOS基础知识总结

1.BIOS是什么&#xff1f; BIOS全称Basic Input Output System&#xff0c;即基本输入输出系统&#xff0c;是固化在服务器主板的专用ROM上&#xff0c;加载在服务器硬件系统上最基本的运行程序&#xff0c;它位于服务器硬件和OS之间&#xff0c;在服务器启动过程中首先运行&am…