vue3学习四
七 标签ref属性
设置标签ref属性,类似于设置标签id。
普通标签
<template name="test4">
<p ref="title" id="title" @click="showinfo">VIEW4</p>
<View3/><script lang="ts" setup>
import { ref } from 'vue';
let title = ref();
function showinfo(){console.log("ref:"+title.value.innerHTML)console.log("id: "+document.getElementById("title").innerHTML)
}
</script>
点击后输出
ref:VIEW4
id: VIEW4
不建议使用id,因为有id冲突的时候,根据加载顺序会选用先加载的。
使用ref不会有这种现象。
View4
<script lang="ts" setup>
import { ref } from 'vue';
import View3 from '@/components/View3.vue';
let title = ref();
function showinfo(){console.log("ref:"+title.value.innerHTML)console.log("id: "+document.getElementById("title").innerHTML)
}
</script>
<template name="test4">
<p ref="title" id="title" @click="showinfo">VIEW4</p>
<View3/>
</template>
View3
<script lang="ts" setup>
import {ref,reactive,watch} from 'vue'let title=ref();
function showinfo(){console.log("ref:"+title.value.innerHTML)console.log("id: "+document.getElementById("title").innerHTML)
}</script>
<template><p ref="title" id="title" @click="showinfo">VIEW3</p>
</template>
点击VIEW4输出
ref:VIEW4
id: VIEW4
点击VIEW3输出
ref:VIEW3
id: VIEW4
view4引入vew3,所以view4先加载,点击VIEW3时用id取数据则返回错误数据。
组件标签
和放到普通标签组件不同。
普通标签返回dom元素,组件返回实例。
实例中可获取的属性,根据子组件用defineExpose()方法暴露的内容。
View4
<script lang="ts" setup name="test4">
import { ref } from 'vue';
import View3 from '@/components/View3.vue';
let view4 = ref()
function showinfo2(){console.log(view4.value)console.log(view4.value.title.innerHTML)
}
</script>
<template>
<button @click="showinfo2">showinfo2</button>
<hr>
<View3 ref="view4"/>
</template>
View3
<script lang="ts" setup>
import {ref,reactive,watch} from 'vue'let title=ref();
function showinfo(){console.log("ref:"+title.value.innerHTML)console.log("id: "+document.getElementById("title").innerHTML)
}
defineExpose({title,title3:title})
</script>
<template><p ref="title" id="title" @click="showinfo">VIEW3</p>
</template>
输出内容

defineExpose()暴露的内容中,默认使用变量名,也可以自定义变量名,比如title3:title。
defineExpose() 不用引入。
八 局部样式
style标签设置scoped防止样式冲突。
View4
<script lang="ts" setup>
import View3 from '@/components/View3.vue';
</script>
<template name="test4">
<p class="title">VIEW4</p>
<p class="title2">VIEW4</p>
<View3/>
</template><style scoped>.title{color: red;}
</style>
<style>
.title2{background-color:red;color: white;
}
</style>
View3
<script lang="ts" setup>
</script>
<template><p class="title">VIEW3</p><p class="title2">VIEW3</p>
</template>
<style scoped>
.title{color: saddlebrown;
}
</style>
<style>
.title2{background-color:saddlebrown;color: white;
}
</style>
实际效果

View4中设置的title2样式,影响到了View3中。
title样式对应的style设置了scoped,所以仅对于其定义的页面起作用。
九 TS接口&泛型&自定义类型
便于对象结构统一。
定义
文件: /src/types/index.ts
export interface Book {id:number,edition:number,name:string,author:string,publication_time:string,test?:string
}// export type Books = Array<Book>
export type Books = Book[]
暴露变量:
- 默认暴露
- 分别暴露
- 统一暴露
代码中例子为分别暴露。
test?表示该属性非必填,即对象属性中不是必须包含。
使用
import {type Book,type Books} from '@/types'
加type表示引入接口,而不是变量。
使用类型定义普通数据
let book:Book={id:1,edition:2,name:"test1",author:"tedst1",publication_time:"2024-01-01",test:"test"
}let book2:Book={id:"qq",//编译器报错edition:2,name:"test1",author:"tedst1",publication_time:"2024-01-01"
}
使用泛型定义响应式数据
let book3 = reactive<Book>({id:1,edition:2,name:"test1",author:"tedst1",publication_time:"2024-01-01"
});
当对象结构错误或属性值错误时会报错。
let books1:Array<Book> = [book,book2]//泛型
let books2:Books=[book,book2]
定义数组,可以使用泛型,也可以使用引入定义好的数组类型。
十 props
父组件向子组件传值。
父组件定义传递的数据,子组件接收数据。
父组件
<script lang="ts" setup name="test4">
import { ref,reactive } from 'vue';
import View3 from '@/components/View3.vue';
import {type Book,type Books} from '@/types'
let book:Book={id:1,edition:2,name:"test1",author:"tedst1",publication_time:"2024-01-01",test:"test"
}let book2:Book={id:"qq",edition:2,name:"test1",author:"tedst1",publication_time:"2024-01-01"
}
let books2:Books=[book,book2]
</script><template>
<View3 ref="view4" :books="books2" book="book"/>
</template>
子组件
无限制接收数据
<script lang="ts" setup>
import {ref,reactive,watch} from 'vue'
let getprops = defineProps(['books','book','test'])
console.log(getprops)
</script><template><div>{{books}}</div>
</template>
输出内容


父组件传book属性没有绑定变量,所以传递的一个字符串。
父组件未传递test属性,所以接收数据为undefined。
有限制接收数据
<script lang="ts" setup>
import {ref,reactive,watch,withDefaults} from 'vue'
let getprops = withDefaults(defineProps<{books:Books,book:Book,test?:string}>(),{books:()=>[{id:3,edition:1,name:"test3",author:"tedst3",publication_time:"2024-10-01",test:"test"},{id:4,edition:2,name:"test3", author:"tedst3",publication_time:"2024-10-02",}],book:()=>{return {id:4,edition:2,name:"test3", author:"tedst3",publication_time:"2024-10-02",}},test:()=>"empty"
})
console.log(getprops)
</script>
<template><div>{{books}}</div>
</template>
限制books属性为Books类型,book属性为Book类型,test属性可不传。
每个属性都有默认值。
在使用
withDefaults时,默认值为可变引用类型 (如数组或对象) 应该封装在函数中,以避免意外修改和外部副作用。这样可以确保每个组件实例都获得默认值的自己的副本。
在使用默认值解构时,这不是必要的
此时父组件再使用book="book"会报错,因为数据类型错误。
已下写法会报错
import { type Book,type Books} from "@/types"
let book1:Book ={id:3,edition:1,name:"test3",author:"tedst3",publication_time:"2024-10-01",test:"test"
}
let book2:Book ={id:4,edition:2,name:"test3", author:"tedst3",publication_time:"2024-10-02",
}
let books1:Books=[book1,book2]
let getprops = withDefaults(defineProps<{books:Books,book:Book,test?:string}>(),{books:()=>books1,book:()=>book1,test:"empty"
})let getprops1 = defineProps<{books:Books,book:Book,test?:string}>()
let getprops = withDefaults(defineProps<{books:Books,book:Book,test?:string}>(),{books:()=>books1,book:()=>book1,test:()=>"empty"
})
报错内容:
`defineProps()` in <script setup> cannot reference locally declared variables because it will be hoisted outside of the setup() function. If your component options require initialization in the module scope, use a separate normal <script> to export the options instead.
<script setup>中的‘ defineProps() ’不能引用本地声明的变量,因为它将被提升到setup()函数之外。如果你的组件选项需要在模块作用域中初始化,那就使用单独的<script>来导出这些选项。
大概意思:定义的属性会被全局使用,所以不能使用已被定义的值,得在设置默认值时重新定义。
输出内容

相关文章:
vue3学习四
七 标签ref属性 设置标签ref属性,类似于设置标签id。 普通标签 <template name"test4"> <p ref"title" id"title" click"showinfo">VIEW4</p> <View3/><script lang"ts" setup>…...
C# LiteDB 使用教程
一、引言 在软件开发中,数据存储和管理是至关重要的一环。对于小型项目或者对性能和便捷性有较高要求的场景,传统的大型数据库可能显得过于笨重。而 LiteDB 作为一款轻量级的嵌入式 NoSQL 数据库,为开发者提供了一个简洁、高效的解决方案。它…...
Python Pandas(3):DataFrame
1 介绍 DataFrame 是 Pandas 中的另一个核心数据结构,类似于一个二维的表格或数据库中的数据表。它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型值)。DataFrame 既有行索引也有列索引,它可以被看做由…...
使用通义灵码 ai编程 来提高开发效率
1、我们先新建一个Hello,world的vue3项目(快速上手 | Vue.js) 创建好以后,运行以下界面: about界面如下,现在我们让灵码给我们修改一下这个字体的颜色及加点其它的样式: 2、先选中样式…...
【OpenCV】入门教学
🏠大家好,我是Yui_💬 🍑如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀 🚀如有不懂,可以随时向我提问,我会全力讲解~ ὒ…...
大数据项目4:基于spark的智慧交通项目设计与实现
项目概述 项目直达 www.baiyuntu.com 随着交通数据的快速增长,传统的交通管理方式已无法满足现代城市的需求。交通大数据分析系统通过整合各类交通数据,利用大数据技术解决交通瓶颈问题,提升交通管理效率。本项目旨在通过大数据技术&#…...
netcore openTelemetry+prometheus+grafana
一、netcore项目 二、openTelemetry 三、prometheus 四、grafana添加Dashborad aspire/src/Grafana/dashboards at main dotnet/aspire GitHub 导入:aspnetcore.json和aspnetcore-endpoint.json 效果:...
Spring Boot接入Deep Seek的API
1,首先进入deepseek的官网:DeepSeek | 深度求索,单击右上角的API开放平台。 2,单击API keys,创建一个API,创建完成务必复制!!不然关掉之后会看不看api key!!&…...
Git、Github和Gitee完整讲解:丛基础到进阶功能
第一部分:Git 是什么? 比喻:Git就像是一本“时光机日记本” 每一段代码的改动,Git都会帮你记录下来,像是在写日记。如果出现问题或者想查看之前的版本,Git可以带你“穿越回过去”,找到任意时间…...
MyBatis的工作流程是怎样的?
大家好,我是锋哥。今天分享关于【MyBatis的工作流程是怎样的?】面试题。希望对大家有帮助; MyBatis的工作流程是怎样的? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 MyBatis 的工作流程可以分为几个主要的步骤&…...
Maven 安装配置(完整教程)
文章目录 一、Maven 简介二、下载 Maven三、配置 Maven3.1 配置环境变量3.2 Maven 配置3.3 IDEA 配置 四、结语 一、Maven 简介 Maven 是一个基于项目对象模型(POM)的项目管理和自动化构建工具。它主要服务于 Java 平台,但也支持其他编程语言…...
分享如何通过Mq、Redis、XxlJob实现算法任务的异步解耦调度
一、背景 1.1 产品简介 基于大模型塔斯,整合传统的多项能力(NLP、OCR、CV等),构建以场景为中心的新型智能文档平台。通过文档审阅,实现结构化、半结构化和非结构化文档的信息获取、处理及审核,同时基于大…...
发布:大彩科技DN系列2.8寸高性价比串口屏发布!
一、产品介绍 该产品是一款2.8寸的工业组态串口屏,采用2.8寸液晶屏,分辨率为240*320,支持电阻触摸、电容触摸、无触摸。可播放动画,带蜂鸣器,默认为RS232通讯电平,用户短接屏幕PCB上J5短接点即可切换为TTL电…...
集合类不安全问题
ArrayList不是线程安全类,在多线程同时写的情况下,会抛出java.util.ConcurrentModificationException异常 解决办法: 1.使用Vector(ArrayList所有方法加synchronized,太重) 2.使用Collections.synchronized…...
【基于SprintBoot+Mybatis+Mysql】电脑商城项目之上传头像和新增收货地址
🧸安清h:个人主页 🎥个人专栏:【Spring篇】【计算机网络】【Mybatis篇】 🚦作者简介:一个有趣爱睡觉的intp,期待和更多人分享自己所学知识的真诚大学生。 目录 🚀1.上传头像 -持久…...
AI知识库和全文检索的区别
1、AI知识库的作用 AI知识库是基于人工智能技术构建的智能系统,能够理解、推理和生成信息。它的核心作用包括: 1.1 语义理解 自然语言处理(NLP):AI知识库能够理解用户查询的语义,而不仅仅是关键词匹配。 …...
20240817 联想 笔试
文章目录 1、选择题1.11.21.31.41.51.61.71.81.91.101.111.121.131.141.151.161.171.181.191.202、编程题2.12.2岗位:Linux开发工程师 题型:20 道选择题,2 道编程题 1、选择题 1.1 有如下程序,程序运行的结果为 (D) #include <stdio.h>int main() {int k = 3...
IntelliJ IDEA 安装与使用完全教程:从入门到精通
一、引言 在当今竞争激烈的软件开发领域,拥有一款强大且高效的集成开发环境(IDE)是开发者的致胜法宝。IntelliJ IDEA 作为 JetBrains 公司精心打造的一款明星 IDE,凭借其丰富多样的功能、智能精准的代码提示以及高效便捷的开发工…...
【JVM详解一】类加载过程与内存区域划分
一、简介 1.1 概述 JVM是Java Virtual Machine(Java虚拟机)的缩写,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。由一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域等组成。JVM屏蔽了与操作系统平台相关…...
250207-MacOS修改Ollama模型下载及运行的路径
在 macOS 上,Ollama 默认将模型存储在 ~/.ollama/models 目录。如果您希望更改模型的存储路径,可以通过设置环境变量 OLLAMA_MODELS 来实现。具体步骤如下: 选择新的模型存储目录:首先,确定您希望存储模型的目标目录路…...
Allegro等长设置翻车实录:拓扑模板法的3个坑与手工PinPair的救赎
Allegro等长设计避坑指南:从拓扑模板到精准PinPair的实战演进在高速PCB设计中,等长匹配如同精密钟表里的齿轮啮合,差之毫厘便可能导致整个系统时序崩塌。当设计从简单的点对点结构升级到多负载复杂拓扑时,Allegro用户常陷入两种典…...
HarmonyOS ArkTS DateUtil 日期增减与日历计算完整指南
文章目录 背景一、引言二、日期增减方法详解使用示例 三、日历计算方法详解四、Demo 演示:日期增减结果展示五、Demo 演示:月历视图完整实现六、日历视图关键点解析为什么要填充前置空格?getLastDayOfMonth 的实现技巧 七、小结 背景 近期发现…...
长期使用Taotoken聚合服务对项目月度账单的可预测性提升
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 长期使用Taotoken聚合服务对项目月度账单的可预测性提升 在AI驱动的项目开发与运营中,成本控制与预算规划是团队管理者…...
37家金融客户紧急启用的DeepSeek扫描辅助加固包(含未公开API调用密钥策略)
更多请点击: https://kaifayun.com 第一章:DeepSeek漏洞扫描辅助的背景与战略价值 近年来,大模型在安全领域的应用正从辅助问答向深度协同防御演进。DeepSeek系列模型凭借其开源、高推理精度及强代码理解能力,成为构建智能化漏洞…...
skills CANN开源社区贡献技能包开发指南
前言 开源社区的健康运转,不仅依赖核心代码的贡献,还需要降低贡献门槛、提供清晰的指南和自动化工具。skills仓库是CANN开源社区的"贡献技能包",提供了一系列辅助脚本、代码模板、CI检查和文档生成工具,帮助新手快速上…...
AI率总超标?2026年AI写作辅助网站排行榜权威发布,轻松定稿不是梦!
写论文效率低、熬夜赶稿、查重不过关?别慌!2026 年最新 AI 论文写作工具合集来了,覆盖选题、大纲、初稿、润色、降重、格式、文献引用全流程,帮你精准匹配最适合的学术助手,彻底告别论文内耗!🏆…...
ComfyUI-Manager完整指南:如何轻松管理你的AI工作流扩展库
ComfyUI-Manager完整指南:如何轻松管理你的AI工作流扩展库 【免费下载链接】ComfyUI-Manager ComfyUI-Manager is an extension designed to enhance the usability of ComfyUI. It offers management functions to install, remove, disable, and enable various c…...
榨干Codex!OpenAI工程师亲授Codex真正用法
你可能把 Codex 当编程助手用,改改代码,跑跑测试。但它的能力远不止于此。OpenAI 的客户支持工程师 Jason(jxnlco)告诉你,Codex 其实是一套完整的电脑工作系统,从语音输入到自动化,从浏览器操控…...
别再手动测模型了!用Simulink Test Manager实现自动化测试(附Excel表格配置详解)
从手动测试到智能验证:Simulink Test Manager全流程自动化实战指南 在模型开发的迭代过程中,工程师们常常陷入"修改-测试-记录"的循环泥潭。每次参数调整后,手动运行模型、记录数据、比对结果不仅消耗大量时间,更可能因…...
终极指南:用D2DX让《暗黑破坏神2》在现代电脑上焕发新生
终极指南:用D2DX让《暗黑破坏神2》在现代电脑上焕发新生 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 还在为经…...
