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 来实现。具体步骤如下: 选择新的模型存储目录:首先,确定您希望存储模型的目标目录路…...
【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
C#中的CLR属性、依赖属性与附加属性
CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...
Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?
Pod IP 的本质与特性 Pod IP 的定位 纯端点地址:Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址(如 10.244.1.2)无特殊名称:在 Kubernetes 中,它通常被称为 “Pod IP” 或 “容器 IP”生命周期:与 Pod …...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现指南针功能
指南针功能是许多位置服务应用的基础功能之一。下面我将详细介绍如何在HarmonyOS 5中使用DevEco Studio实现指南针功能。 1. 开发环境准备 确保已安装DevEco Studio 3.1或更高版本确保项目使用的是HarmonyOS 5.0 SDK在项目的module.json5中配置必要的权限 2. 权限配置 在mo…...
【笔记】AI Agent 项目 SUNA 部署 之 Docker 构建记录
#工作记录 构建过程记录 Microsoft Windows [Version 10.0.27871.1000] (c) Microsoft Corporation. All rights reserved.(suna-py3.12) F:\PythonProjects\suna>python setup.py --admin███████╗██╗ ██╗███╗ ██╗ █████╗ ██╔════╝…...
