Vue3学习宝典
1.ref函数调用的方式生成响应式数据,可以传复杂和简单数据类型
<script setup>
// reactive接收一个对象类型的数据
import { reactive } from 'vue';// ref用函数调用的方式生成响应式数据,可以传复杂和简单数据类型
import { ref } from 'vue'
// 简单数据类型
const count = ref(0)// 复杂数据类型
const user = ref({name: '小夏',age: 18
})const subCount = () => {count.value--
}function addCount() {count.value++
}</script><style></style><template><!-- ref --><div>{{ count }}</div><br><button @click="subCount">-1</button><button @click="addCount">+1</button><div>{{ user.name + user.age }}</div><br>
</template>
2.computed计算属性(依赖的数据发生变化时实时更新)
<script setup>
import { ref } from 'vue'
const list = ref([1, 2, 3, 4, 5, 6])//计算属性
import { computed } from 'vue';
const computedList = computed(() => {return list.value.filter(item => item > 2)
})const addFn = () => {list.value.push(4)
}
console.log(list.value)
</script><style></style><template><div>{{ computedList }}</div><button @click="addFn">添加</button>
</template>
3.watch监视单个数据的变化(相当于操作日志)
<script setup>
import { ref, watch } from 'vue'const num = ref(1)
const name = ref('李四')const changeNum = () => {num.value++
}
const changeName = () => {name.value = name.value + 1
}const obj = ref({name:'老夏',age:18
})
const changeObjName = ()=>{obj.value.name = '小夏'
}//监视单个数据的变化
// 1.watch默认浅层监视,不会监视对象里的属性的值的改变
watch(obj,(newValue,laoValue)=>{console.log('监视单个数据的变化')console.log(newValue,laoValue)
},{// 2.深层监视,可以监视对象里的属性的值的改变deep:true
}
)//监视多个数据的变化
watch([num,name], (newArr, oldArr) => {console.log('监视多个数据的变化')console.log('新数据:' + newArr, '老数据:' + oldArr)
},// 3.immediate一进页面就立即刷新一次{immediate: true,}
)//监视单个对象属性的变化
watch(()=>obj.value.name,(newValue,oldValue)=>{console.log('监视单个对象属性的变化')console.log(newValue,oldValue)
})
</script><style></style><template><div>{{ num }}</div><button @click="changeNum">+++</button><div>{{ name }}</div><button @click="changeName">改名字</button><div>{{ obj.name }}</div><button @click="changeObjName">改对象里面属性的值</button>
</template>
4.Props-Emits组件相互传数据
父组件
<script setup>
import son from '@/components/04-son.vue'
import { ref } from 'vue'const money = ref(1000)
// ele就是子组件传来的属性值
const changeMoney = (attributeValue) => {console.log('子组件花了' +attributeValue)
}
</script><style></style><template><div><!-- car,money里面的属性值直接传给了子组件 --><!-- layOut是子组件向父组件传的值 --><son car="车车" :money="money" @layOut="changeMoney"></son></div>
</template>
子组件
<script setup>
//子组件
// defineProps是固定的写法,定义接收数据的属性名,和属性值类型
const props = defineProps({car: String,money: Number
})//defineEmits([自定义一个属性名])
const emit = defineEmits(['layOut'])// 通过emit向父组件发送数据
const buy = () => {emit('layOut', 100)
}
console.log(props.car)
console.log(props.money)
</script>
<style scoped>
.son {width: 100px;height: 100px;border: 1px solid;
}
</style>
<template><div class="son">子组件</div><div>父组件给了{{ props.money }}</div><button @click="buy">花钱</button>
</template>
5.defineExpose开放属性和方法
父组件
<script setup>
import { ref,onMounted } from 'vue'
import son05 from '@/components/05-son.vue'const input = ref()// 生命周期钩子 onMounted ,一进页面输入框就聚焦
onMounted(() =>{// input.value.focus()
})//绑定事件聚焦
const onClick = ()=>{input.value.focus()
}const getSonData = ref()
const putSonData = ()=>{const fatherName = getSonData.value.nameconsole.log(getSonData.value.greeting())console.log(fatherName)
}</script><style></style><template>
<input type="text" ref="input">
<button @click="onClick">聚焦</button>
<son05 ref="getSonData"></son05>
<button @click="putSonData">获取儿子组件中的数据</button>
</template>
子组件
<script setup>
const name = "儿子的数据"
const greeting = () => {console.log('hello儿子的数据')return '默认rturn未定义'
}// setup语法糖下的组件内部的属性和方法不供外部组件访问
// 可以通过defineExpose编译宏指定哪些属性和方法允许访问
defineExpose({name,greeting
})</script>
<template></template>
6.provide-inject提供和注入数据
父组件
<script setup>
import inject from '@/components/06-inject.vue'
import { provide,ref } from 'vue';//1.提供普通数据给其他组件
provide('commonData',"这是我提供的普通数据哦")//2.提供响应数据给其他组件
const responseData = ref({msg:'这是我提供的响应数据哦',
})
provide('responseData',responseData)//3.提供给数据调用者修改数据的权力
provide('setResponseData',(newResponseData)=>{responseData.value.msg = newResponseData
})
</script><style></style><template>
<inject></inject>
</template>
子组件
<script setup>
import {inject,ref} from 'vue'
//注入数据
const getResponseData = inject('responseData')
const getCommonData = inject('commonData')//注入修改数据的set方法
const setData = inject('setResponseData')
const changeData = ()=>{setData('这是调用者修改后的数据')
}
</script>
<template><div> {{getResponseData.msg}}</div><div>{{getCommonData}}</div><button @click="changeData">点击按钮修改数据</button>
</template>
7.defineModel数据双向绑定 ,其他组件使用v-model就可以获取此属性数据
父组件
<script setup>
import sonDefineMOdel from '@/components/07-defineModel.vue'
import { ref } from 'vue';// 其他组件传来的数据也可以修改
const getSonData = ref('')
</script><style></style><template>
<sonDefineMOdel v-model="getSonData"></sonDefineMOdel>
<div>{{ getSonData }}
</div>
</template>
子组件
<script setup>
import { defineModel } from 'vue';// 数据双向绑定 ,其他组件使用v-model就可以获取此属性数据
const modelValue = defineModel()</script>
<template><!-- @input事件用于实时监控输入框的变化,每次用户输入都会触发该事件。 --><input type="text" :value="modelValue"@input="e => modelValue = e.target.value"><!-- 箭头函数 e => modelValue 的意思是:当事件触发时,将事件对象 e 作为参数传递给箭头函数,并将输入框的新值(即 e.target.value)赋给 modelValue。 -->
</template>
8.pinia管理自己创建的store.js仓库
自己创建的仓库
// store的作用类似于Java的父类,被子类继承数据和方法
import {defineStore
} from 'pinia'
import {ref,computed
} from 'vue'// 声明一个store
export const useStore = defineStore('myStore', {state: () => {const name = ref('小夏')// 声明数据 statelet age = ref(17)// 声明操作数据的方法 action(普通函数)const func = () => {console.log('我是方法')}const addAge = () => {age.value++}// 声明基于数据派生的计算属性const judge = computed(()=>{if (age.value>=18){return "已成年"}else{return "未成年"}})return {name,age,func,addAge,judge}}
})
在组件中引入自己创建的仓库
<script setup>
import Pinia08 from '@/components/08-pinia.vue'
// 引入自己创建的store
import { useStore } from '@/store/myStore'
const getStoreData = useStore()
</script><template><div>{{ getStoreData.name }}</div><Pinia08></Pinia08><div>{{ getStoreData.func() }}</div><div>{{ getStoreData.judge}}</div><button @click="getStoreData.addAge">加年龄</button>
</template><style scoped></style>

相关文章:
Vue3学习宝典
1.ref函数调用的方式生成响应式数据,可以传复杂和简单数据类型 <script setup> // reactive接收一个对象类型的数据 import { reactive } from vue;// ref用函数调用的方式生成响应式数据,可以传复杂和简单数据类型 import { ref } from vue // 简…...
leecode96.不同的二叉搜索树
在画的过程中发现规律,每次选择不同的节点作为根节点,左右两边的节点再排列组合一下就能求出总数 class Solution { public:int numTrees(int n) {vector<int> dp(n1,0);dp[0]1;for(int i1;i<n;i)for(int j0;j<i;j)dp[i]dp[i-j-1]*dp[j];ret…...
树莓派基本配置-基础配置配置
树莓派基本配置 文章目录 树莓派基本配置前言硬件准备树莓派刷机串口方式登录树莓派接入网络ssh方式登录树莓派更换国内源xrdp界面登录树莓派远程文件传输FileZilla 前言 树莓派是一款功能强大且价格实惠的小型计算机,非常适合作为学习编程、物联网项目、家庭自动化…...
手机卡限速丨中国移动5G变3G,网速500kb
以下猜测错误,又有新的猜测:河南移动的卡出省限速。可能是因为流量结算。 “2024年7月1日起,中国移动集团内部将开启跨省流量结算” 在深圳四五年了,之前没有过,就从上个月开始。11月底解除限速,12月刚开…...
SpringCloud之OpenFeign:OpenFeign与Feign谁更适合你的SpringCloud项目?
目录 一、OpenFeign简介1、OpenFeign是什么(1)核心概念(2)工作原理(3)主要特点(4)使用场景(5)与Feign的区别(6)总结 2、OpenFeign与Fe…...
yt6801 ubuntu有线连接驱动安装
耀世16pro的有线网卡驱动安装 下载地址: YT6801 千兆PCIE以太网控制器芯片 1. 创建安装目录 mkdir yt68012. 解压驱动文件 unzip yt6801-linux-driver-1.0.27.zip -d yt68013. 进入驱动目录 cd yt68014. 安装驱动 以 root 权限运行安装脚本: sudo su ./yt_ni…...
算法日记 36-38day 动态规划
今天把动态规划结束掉,包括子序列以及编辑距离 题目:最长公共子序列 1143. 最长公共子序列 - 力扣(LeetCode) 给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &…...
hdlbits系列verilog解答(Dff16e-同步复位上升沿16位触发器)-85
文章目录 一、问题描述二、verilog源码三、仿真结果一、问题描述 本节学习如何创建16位D触发器。有时仅修改一组触发器一部分是有用的。字节使能控制16位寄存器的哪一个字节应当被修改,其中teena[1]控制高位字节[15:8],teena[0]控制低位字节[7:0]。restn是一个同步低电平有效…...
HTTPTomcatServlet
今日目标: 了解JavaWeb开发的技术栈理解HTTP协议和HTTP请求与响应数据的格式掌握Tomcat的使用掌握在IDEA中使用Tomcat插件理解Servlet的执行流程和生命周期掌握Servlet的使用和相关配置1,Web概述 1.1 Web和JavaWeb的概念 Web是全球广域网,也称为万维网(www),能够通过浏览…...
IDEA连接Apifox客户端
IDEA连接Apifox客户端 一、下载Apifox安装包二、IDEA配置三、配置Apifox和IDEA项目同步 一、下载Apifox安装包 Apifox官网,根据自己的操作系统下载对应的Apifox安装包,我是windows系统所以下载的是windows版。 下载 默认仅为我安装,点击下一…...
Linux的奇妙冒险——进程PCB第一讲
进程 1.进程的基本概念2.进程的描述3.查看进程4.通过系统调用获得pid和ppid5.通过fork()系统调用创建子进程6.进程状态1.浅度睡眠 S2.深度睡眠 D3 暂停状态T4.僵尸状态 Z5.死亡状态 X 7.僵尸进程8.孤儿进程9.进程优先级 1.进程的基本概念 任何计算机系统都包含一个基本的程序…...
阿里巴巴热土计划企划金:点燃贫困地区可持续发展的希望之火
在当今社会,扶贫工作已不再仅仅停留在简单的物质援助层面,而是更加注重通过资金支持和资源整合,推动贫困地区的可持续发展。阿里巴巴集团,作为全球领先的电子商务巨头,凭借其强大的影响力和社会责任感,推出…...
2-6 C浮点数指针运算案例
1.0 浮点数指针 float f 1.2f:如何将它对应的4个字节地址空间的数值以十六进制打印出来? 数据在所有计算机中都是以二进制形式存储的,然后以8个位为一个单元称作“字节”,作为计 量和运算处理单元,比如我们说一个文件大小是1MB,指…...
开源的跨平台SQL 编辑器Beekeeper Studio
一款开源的跨平台 SQL 编辑器,提供 SQL 语法高亮、自动补全、数据表内容筛选与过滤、连接 Web 数据库、存储历史查询记录等功能。该编辑器支持 SQLite、MySQL、MariaDB、Postgres 等主流数据库,并兼容 Windows、macOS、Linux 等桌面操作系统。 项目地址…...
07《缓存》计算机组成与体系结构 系列课
目录 深入了解缓存内存 缓存的重要性 游戏中的存储需求与主内存 虚拟内存和按需分页 现代系统中的多级缓存 缓存级别的大小与速度 缓存相关的术语 缓存命中与未命中 页面命中与缺页 局部性原理 结语 深入了解缓存内存 大家好,欢迎来到今天的课程。上节课…...
Java个人博客系统项目文档
项目名称 Java个人博客系统 项目概述 该博客系统是一个多功能的Java应用程序。该系统支持用户发布新文章、浏览他人文章、管理个人文章收藏和删除不再需要的文章。通过该博客系统,用户可以享受一个安全、便捷的在线写作和阅读体验。 运行环境 编程语言࿱…...
如何手动设置ubuntu服务器的ip、子网掩码、网关、DNS
在 Ubuntu 服务器上手动设置 IP 地址、子网掩码、网关和 DNS,通常有两种方式:使用传统的 ifconfig 命令和配置文件,或者使用现代的 netplan 配置方式(对于 Ubuntu 17.10 及以后版本,netplan 是默认的网络配置工具&…...
SVN clean up失效的一种解决办法
1、进入.svn 2、进入wc.db数据库 sqlite3.exe wc.db sqlite> select * from WC_LOCK; 若有输出则可采用下面的方式来清理 a、delete from WC_LOCK; b、如果删除失败就采用丢弃并重新创建WC_LOCK表的方式清理 drop table WC_LOCK; create table WC_LOCK ( wc_id INTEGER…...
S4 UPA of AA :新资产会计概览
通用并行会计(Universal Parallel Accounting)可以支持每个独立的分类账与其他模块集成,UPA主要是为了支持平行评估、多货币类型、财务合并、多准则财务报告的复杂业务需求 在ML层面UPA允许根据不同的分类账规则对物料进行评估,并…...
第30天:安全开发-JS 应用NodeJS 指南原型链污染Express 框架功能实现审计0
时间轴: 演示案例: 环境搭建-NodeJS-解析安装&库安装 功能实现-NodeJS-数据库&文件&执行 安全问题-NodeJS-注入&RCE&原型链 案例分析-NodeJS-CTF 题目&源码审计 开发指南-NodeJS-安全 SecGuide 项目、 环境搭建-NodeJ…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...
Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...
R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...
