Vue 爬坑

news2024/7/6 20:06:25

都是基于最新的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.coloradmin.cn/o/1891165.html

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

相关文章

鸿翼打造企业级AI Agent智能体平台,构建AI +ECM全业务场景

在数字化时代的浪潮中&#xff0c;人工智能技术正以前所未有的速度改变着世界。正如比尔盖茨预言&#xff0c;AI Agent将是人工智能的未来。在这个预言逐渐成为现实的当下&#xff0c;大模型驱动的智能体正在成为推动企业革新的核心动力。 在企业环境中&#xff0c;大语言模型的…

DEX: Scalable Range Indexing on Disaggregated Memory——论文泛读

arXiv Paper 论文阅读笔记整理 问题 内存优化索引[2&#xff0c;3&#xff0c;18&#xff0c;27&#xff0c;42]对于加速OLTP至关重要&#xff0c;但随着数据大小&#xff08;以及索引大小&#xff09;的增长&#xff0c;对内存容量的需求可能会超过单个服务器所能提供的容量…

华为手机改变休眠时间 不让手机动不动黑屏

在手机中找到设置 并打开 在里面找到显示与亮度 并点开 找到并点击休眠操作项 然后就会弹出 多久进入休眠 可以调久一点

机器学习基础概念

1.机器学习定义 2.机器学习工作流程 &#xff08;1&#xff09;数据集 ①一行数据&#xff1a;一个样本 ②一列数据&#xff1a;一个特征 ③目标值&#xff08;标签值&#xff09;&#xff1a;有些数据集有目标值&#xff0c;有些数据集没有。因此数据类型由特征值目标值构成或…

vmware虚拟机增加磁盘容量

概述 当初始分配给虚拟机的磁盘空间不够时&#xff0c;需要从外部的主系统增加配给。 具体操作分为两步&#xff1a;一&#xff1a;通过虚拟机界面添加分配的磁盘配给&#xff1b;二&#xff1a;将新分配的配给给使用起来。 操作 添加磁盘配给 在虚拟机内部添加新分配的配给…

Linux下QT程序启动失败问题排查方法

文章目录 0.问题背景1.程序启动失败常见原因2.排查依赖库问题2.1 依赖库缺失2.2 依赖库加载路径错误2.3 依赖库版本不匹配2.4 QT插件库缺失2.4.1 QT插件库缺失2.4.2 插件库自身的依赖库缺失 2.5 系统基础C库不匹配 3.资源问题3.1 缺少翻译文件3.2 缺少依赖的资源文件3.3 缺少依…

数据库安装

1.选择最下面自定义安装 2.选择x64 3.next 4.完成后next 5.next 6.选择如图&#xff0c;next 7.如图 8.输入密码 9.如图 10.如图 11.安装 12.完成 13.控制面板选择系统和安全 14.选择系统 15.高级系统设置 16.环境变量 17.双击打开path 18.新建 19.输入MySQLbin文件夹路径 20.管…

年互动量破亿,小红书流量新风口趋势研究

当今时代&#xff0c;一个人生活已经成为越来越常见的状态。千瓜数据显示&#xff0c;近一年小红书有关“一人生活”的种草笔记数超百万&#xff0c;预估互动量达亿级&#xff0c;“一人”市场大有可为。 本期&#xff0c;千瓜将探索“一人生活”的新变化&#xff0c;深入分析人…

Modbus RTU协议简介即CRC算法实现

目录 1 Modbus 介绍2 Modbus RTU协议传输方式2.1 地址码2.2 功能码2.3 数据码2.4 校验码 3 CRC算法实现2.1 代码3.2 运行结果 1 Modbus 介绍 Modbus是一种串行通信协议&#xff0c;是Modicon公司&#xff08;现在的施耐德电气 Schneider Electric&#xff09;于1979年为使用可编…

谷粒商城-个人笔记(集群部署篇一)

前言 ​学习视频&#xff1a;​Java项目《谷粒商城》架构师级Java项目实战&#xff0c;对标阿里P6-P7&#xff0c;全网最强​学习文档&#xff1a; 谷粒商城-个人笔记(基础篇一)谷粒商城-个人笔记(基础篇二)谷粒商城-个人笔记(基础篇三)谷粒商城-个人笔记(高级篇一)谷粒商城-个…

每日一题——力扣144. 二叉树的前序遍历(举一反三+思想解读+逐步优化)五千字好文

一个认为一切根源都是“自己不够强”的INTJ 个人主页&#xff1a;用哲学编程-CSDN博客专栏&#xff1a;每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 我的写法&#xff1a; 代码结构 时间复杂度 空间复杂度 总结 我要更强 代码说明 …

mysql 忘记 root 密码的解决办法(针对不同 mysql 版本)

文章目录 1.前提说明1.1 cmd 窗口打开方式1.2 mysql 服务相关命令知识补充1.3 三个 mysql 版本说明1.4 运行时可能发生的报错问题&#x1f340; 跳过密码授权命令报错&#x1f340; 修改密码时报错&#x1f340; ERROR 2003 (HY000): Cant connect to MySQL server on localhos…

安卓稳定性之crash详解

目录 前言一、Crash 的基本原理二、Crash 分析思路三、实例分析四、预防措施五、参考链接 前言 在开发和测试 Android 应用程序时&#xff0c;遇到应用程序崩溃是很常见的情况。 Android 崩溃指的是应用程序因为异常或错误而无法正常执行&#xff0c;并且导致应用强制关闭。 一…

RabbitMQ 进程内流控(Flow Control) 源码解析

1. 概述 1.1 为什么要流控&#xff1f; 流控主要是为了防止生产者生产消息速度过快&#xff0c;超过 Broker 可以处理的速度。这时需要暂时限制生产者的生产速度&#xff0c;让 Broker 的处理能够跟上生产速度。 Erlang进程之间不共享内存&#xff0c;每个进程都有自己的进程邮…

什么是眼球凹渲染?如何在Varjo Base中设置眼球追踪与凹渲染功能

当谈到Varjo耳机时&#xff0c;它们总是与超高分辨率显示器和有凹渲染联系在一起&#xff0c;从而能够高效地渲染到高像素的显示器上。 本篇博文的主题是分享一些可用于OpenXR应用程序的新设置&#xff0c;但在此之前&#xff0c;让我们先了解关于有凹渲染的一些背景。有凹渲染…

【计算机毕业设计】基于Springboot的B2B平台医疗病历交互系统【源码+lw+部署文档】

包含论文源码的压缩包较大&#xff0c;请私信或者加我的绿色小软件获取 免责声明&#xff1a;资料部分来源于合法的互联网渠道收集和整理&#xff0c;部分自己学习积累成果&#xff0c;供大家学习参考与交流。收取的费用仅用于收集和整理资料耗费时间的酬劳。 本人尊重原创作者…

Python爬取国家医保平台公开数据

国家医保服务平台数据爬取python爬虫数据爬取医疗公开数据 定点医疗机构查询定点零售药店查询医保机构查询药品分类与代码查询 等等&#xff0c;数据都能爬 接口地址&#xff1a;/ebus/fuwu/api/nthl/api/CommQuery/queryFixedHospital 签名参数&#xff1a;signData {dat…

H5打包失败:JS堆内存不足

傻子没看懂报错&#xff0c;像个无头苍蝇 解决方式&#xff1a;清空缓存&#xff0c;重启电脑&#xff0c;打包成功。

二叉树中序遍历-递归法详解-数据结构与算法

首先看下中序遍历的代码&#xff1a;&#xff08;左 跟 右&#xff09; 其首先要接受一个根结点root作为参数 判断根节点是否为NULL 不为NULL则递归遍历左子树 ①我们把树根结点A传递给它 其左结点为B&#xff0c;右结点为C ②首先我们要检查root是否为NULL 其不为NULL …

使用pyinstaller 如何打包python项目

参考&#xff1a;【python项目正确打包方法-哔哩哔哩】 https://b23.tv/EDB6zbG Pyinstaller 详解多种打包过程(去坑,填坑)。_pyinstaller -f -w-CSDN博客 1.打开命令提示符&#xff1a; 找到python项目所在位置&#xff0c;输入cmd即可 2. 安装pipenv: 在命令提示符&#…