Vue3苦逼的学习之路

news2025/1/7 9:33:09

        从一名测试转战到全栈是否可以自学做到,很多朋友肯定会说不可能,或就算转了也是个一般水平,我很认同,毕竟没有经过各种项目的摧残,但是还是得踏足一下这个领域。所以今天和大家分享vue3中的相关内容,大佬勿喷。

一:计算属性

案例1:计算属性,且是只读

<script lang="ts" setup name="Person">
import { ref, computed } from 'vue'
let firstName = ref('张')
let lastName = ref('三')

// 计算属性,且是只读
let fullName = computed(() => {
    return firstName.value.slice(0, 1).toUpperCase() + firstName.value.slice(1) + '-' + lastName.value.slice(0, 1)
})
</script>

案例2:计算属性,可读可写

<script lang="ts" setup name="Person">
import { ref, computed } from 'vue'
let firstName = ref('张')
let lastName = ref('三')

// 计算属性,可读可写
let fullName_rw = computed({
    get() {
        return firstName.value.slice(0, 1).toUpperCase() + firstName.value.slice(1) + '-' + lastName.value.slice(0, 1)
    },
    set(val) {
        const [str1, str2] = val.split('-')
        firstName.value = str1
        lastName.value = str2
    }
})
function changeName() {
    fullName_rw.value = '李-四'
}
</script>

对于计算属性,一般与get()和set()一起使用

二:watch属性

作用:监视数据的变化,和vue2的watch租用一致

特点:vue3中的watch只能监视以下四种数据

        1、ref定义的数据【一个是基本类型,一个是对象类型】

        2、reactive定义的数据

        3、函数返回一个值(getter函数)

        4、一个包含上述内容的数组

关于watch一共有五种情况:

情况一:监视ref定义的基本数据类型

<template>
    <div class="person">
        <h2>当前求和为:{{ sum }}</h2>
        <button @click="changeSum">点我sum+1</button>
    </div>
</template>

<script lang="ts" setup name="Person1">
import { ref, watch } from 'vue'
// 定义数据
let sum = ref(0)

function changeSum() {
    sum.value++
}
//监视ref定义的基本数据,这里监视的就是sum
const stopwatch = watch(sum, (newvalue, oldvalue) => {
    console.log(newvalue, oldvalue);
    //解除监视,当sum的值大于等于10时运行解除
    if (sum.value >= 10) {
        stopwatch()
    }
})


</script>

情况二:监视ref定义的对象类型的数据

<template>
    <div class="person">
        <h1>情况2:监视ref定义的对象类型</h1>
        <h2>姓名:{{ person.name }}</h2>
        <h2>年龄:{{ person.age }}</h2>
        <button @click="changeName">修改名字</button>
        <button @click="changeAge">修改按钮</button>
        <button @click="changePerson">修改整个人</button>
    </div>
</template>

<script lang="ts" setup name="Person1">
import { ref, watch } from 'vue'
// 监视ref定义的对象类型,直接写数据名,监视的是对象的【地址值】,若想见识对象内部的数据,要手动开启深度监视
// immediate: true, 立即执行
// deep: true, 深度监视
let person = ref({
    name: 'alex',
    age: 18
})
// 方法
function changeName() {
    person.value.name += '~'
}
function changeAge() {
    person.value.age++
}
function changePerson() {
    person.value = {
        name: '李四',
        age: 20
    }
}
//监视ref定义的【对象类型】数据,监视的是对象的地址值
watch(person, (newvalue, oldvalue) => {
    console.log(newvalue, oldvalue);
}, { deep: true, immediate: true })
/*
注意:
1、如果修改的是ref定义的对象中的属性,newvalue和oldvalue都是新值,因为它们是同一个对象
2、如果修改整个ref定义的对象,newvalue是新值,oldvalue是旧值,因为不是同一个对象了
*/
</script>

情况三:监视reactive定义的对象类型

<template>
    <div class="person">
        <h2>情况3:监视reactive定义的对象类型</h2>
        <h2>姓名:{{ person.name }}</h2>
        <h2>年龄:{{ person.age }}</h2>
        <button @click="changeName1">修改名字</button>
        <button @click="changeAge1">修改按钮</button>
        <button @click="changePerson1">修改整个人</button>
    </div>
</template>

<script lang="ts" setup name="Person1">
import { ref, watch, reactive } from 'vue'

//情况三:监视reactive定义的对象类型数据,且默认开启深度监视
function changeName1() {
    person1.name += '~'
}
function changeAge1() {
    person1.age++
}
//reactive不能整体修改,所以下面是无法执行的
function changePerson1() {
    // person1 = {
    //     name: '李四',
    //     age: 20
    // }
    //下面是强制修改,但是不是把整个对象修改
    Object.assign(person1, {
        name: '李四111',
        age: 28
    })
}
//监视,情况三:监视【reactive】定义的【对象类型】数据,且默认是开启深度监视的
watch(person1, (newvalue, oldvalue) => {
    console.log('person1变化了');
    console.log(newvalue, oldvalue);
})
</script>

情况四:监视ref或reactive定义的【对象类型】数据中的某个属性

1、若该属性值不是【对象类型】,需要写成函数形式

2、若该属性值依然是【对象类型】,可直接编,也可写成函数,不过建议写成函数

<template>
    <div class="person">
        <h2>姓名:{{ person.name }}</h2>
        <h2>年龄:{{ person.age }}</h2>
        <h2>车:{{ person.car.C1 }}-{{ person.car.C2 }}</h2>
        <button @click="changeName">修改名字</button>
        <button @click="changeAge">修改年龄</button>
        <button @click="changeCar1">修改第一台车</button>
        <button @click="changeCar2">修改第二台车</button>
        <button @click="changeCar">修改整个车</button>
    </div>
</template>

<script lang="ts" setup name="Person1">
import { reactive, watch } from 'vue'
//数据
let person = reactive({
    name: "张三",
    age: 18,
    car: {
        C1: '奔驰',
        C2: '宝马'
    }
})
// 监视响应式对象中的某个属性,且该属性是基本类型,要写成函数式
watch(() => person.name, (newvalue, oldvalue) => {
    console.log('person.name变化了', newvalue, oldvalue);
},{deep:true})
</script>

情况五:监视多个数据

<template>
    <div class="person">
        <h2>姓名:{{ person.name }}</h2>
        <h2>年龄:{{ person.age }}</h2>
        <h2>车:{{ person.car.C1 }}-{{ person.car.C2 }}</h2>
        <button @click="changeName">修改名字</button>
        <button @click="changeAge">修改年龄</button>
        <button @click="changeCar1">修改第一台车</button>
        <button @click="changeCar2">修改第二台车</button>
        <button @click="changeCar">修改整个车</button>
    </div>
</template>

<script lang="ts" setup name="Person1">
import { reactive, watch } from 'vue'
//数据
let person = reactive({
    name: "张三",
    age: 18,
    car: {
        C1: '奔驰',
        C2: '宝马'
    }
})
// 如果是对象之类的,就不用改为函数式了,比如:person.car
watch([() => person.name, () => person.car.C1, person.car], (newvalue, oldvalue) => {
    console.log('改动了', newvalue, oldvalue);

}, { deep: true })

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

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

相关文章

vue视频录制 限制大小,限制时长

<template><div style"height: 100vh;background: #000;"><span style"color: #fff;font-size: 18px;">切换数量&#xff1a;{{ devices.length }}</span><video ref"video" autoplay muted playsinline></vid…

毕业项目推荐:基于yolov8/yolov5的行人摔倒检测识别系统(python+卷积神经网络)

文章目录 概要一、整体资源介绍技术要点功能展示&#xff1a;功能1 支持单张图片识别功能2 支持遍历文件夹识别功能3 支持识别视频文件功能4 支持摄像头识别功能5 支持结果文件导出&#xff08;xls格式&#xff09;功能6 支持切换检测到的目标查看 二、数据集三、算法介绍1. YO…

高等数学学习笔记 ☞ 无穷小比较与等价无穷小替换

1. 无穷小比较 1. 本质&#xff1a;就是函数的极限趋于0时的速度&#xff0c;谁快谁慢的问题。 2. 定义&#xff1a;若是在同一自变量的变化过程中的无穷小&#xff0c;且&#xff0c;则&#xff1a; ①&#xff1a;若&#xff0c;则称是比的高阶无穷小&#xff0c;记作&…

基于Spring Boot的智能笔记的开发与应用

一、项目背景与意义 智能笔记系统旨在为用户提供便捷、高效的笔记记录与管理服务。通过智能化的功能&#xff0c;如自动分类、标签管理、全文搜索等&#xff0c;用户可以更加轻松地管理和查找自己的笔记。同时&#xff0c;基于Spring Boot的开发使得系统具有高度的可扩展性和可…

word中插入zotero引用

1、参考文献末尾没有文献&#xff1f; 在文献条目要显示的地方点击“refresh” 2、参考文献条目没有悬挂缩进&#xff1f; 把“书目”添加到样式库中&#xff0c;修改样式为悬挂缩进1.5字符 3、交叉引用&#xff1f; 宏 新建一个宏 粘贴下面代码 Public Sub ZoteroLinkCita…

简历_专业技能_熟悉Redis常用数据结构及其操作命令

系列博客目录 文章目录 系列博客目录1.Redis通用命令2.String类型3.Hash类型4.List类型5.Set类型6.Sorted类型7.StringRedisTemplate 1.Redis通用命令 通用指令是部分数据类型的&#xff0c;都可以使用的指令&#xff0c;常见的有&#xff1a; KEYS&#xff1a;查看符合模板的…

快速将索尼手机联系人导出为 HTML 文件

我想将 Sony Xperia 手机上的联系人导出到计算机上进行备份&#xff0c;并在需要时进行编辑。这可以做到吗&#xff1f;如何做到&#xff1f;作为助手我需要下载什么工具吗&#xff1f; 当您的 Android 手机上存储了如此多的重要联系人&#xff0c;而您又不想丢失它们时&#…

爬虫案例-爬取某度文档

文章目录 1、第三方库的安装和pytesseract安装2、爬取某度文档的代码3、效果图 1、第三方库的安装和pytesseract安装 #以下是安装http请求的第三方库 pip install requests #以下是安装处理文档的第三方库 pip install python-docx #以下是安装处理图片的第三方库 pip install…

《塑战核心》V1.0.0.9952官方中文版

体验打击感满分的近距离战斗。击败蜂拥而至的敌人&#xff0c;每次击杀都会让你变得更强。 《塑战核心》官方中文版https://pan.xunlei.com/s/VODW7effpagQN1JU0UpBQQ5uA1?pwdmr8g#

电子邮件对网络安全的需求

&#xff08; 1&#xff09;机密性&#xff1a;传输过程中不被第三方阅读到邮件内容&#xff0c;只有真正的接收方才可以阅读邮件。&#xff08; 1.5 分&#xff09; &#xff08; 2&#xff09;完整性&#xff1a;支持在邮件传输过程中不被篡改&#xff0c;若发生篡改&#…

【嵌入式硬件】直流电机驱动相关

项目场景&#xff1a; 驱动履带车&#xff08;双直流电机&#xff09;前进、后退、转弯 问题描述 电机驱动MOS管烧毁 电机驱动采用IR2104STRH1R403NL的H桥方案&#xff08;这是修改之后的图&#xff09; 原因分析&#xff1a; 1.主要原因是4路PWM没有限幅&#xff0c;修改…

用户注册模块(芒果头条项目进度4)

1 创建⽤户模块⼦应⽤ 1.1 在项⽬包⽬录下 创建apps的python包。 1.2 在apps包下 创建应⽤userapp $ cd 项⽬包⽬录/apps $ python ../../manage.py startapp userapp 1.3 配置导包路径 默认情况下导包路径指向项⽬根⽬录 # 通过下⾯语句可以打印当前导包路径 print(sys.pa…

element输入框及表单元素自定义前缀

如图所示&#xff1a; <el-input class"custom-input" placeholder"请输入" prefix-icon"prefix" v-model"form.name" clearable></el-input> :deep(.custom-input) {.el-input__icon {display: inline-block;width: 40…

使用MPTCP+BBR进行数据传输,让网络又快又稳

1.前言 在前文《链路聚合技术——多路径传输Multipath TCP(MPTCP)快速实践》中我们使用mptcpize run命令实现了两个节点间通信使用MPTCP协议进行传输&#xff0c;并实现了传输速率的聚合。 实际应用中更推荐原生支持mptcp的应用&#xff0c;在MPTCP官网中可以看到如TCPDump、…

电商Google广告:2025年提升转化率的5种策略

展望 2025 年&#xff0c;Google 广告领域将迎来一系列显著变化&#xff0c;这些趋势对于提升广告转化率至关重要&#xff0c;值得我们提前关注与布局。 智能化程度持续加深&#xff0c;用户搜索习惯愈发精细&#xff0c;广告格式推陈出新&#xff0c;视频广告势头正猛...那么…

基于Java的敬老院管理系统的设计和实现【源码+文档+部署讲解】

基于Java的敬老院管理系统设计和实现 摘 要 新世纪以来,互联网与计算机技术的快速发展,我国也迈进网络化、集成化的信息大数据时代。对于大众而言,单机应用早已成为过去&#xff0c;传统模式早已满足不了当下办公生活等多种领域的需求,在一台电脑上不联网的软件少之又少&#x…

如何使用OpenCV进行抓图-多线程

前言 需求&#xff1a; 1、如何使用OpenCV捕抓Windows电脑上USB摄像头的流、 2、采用多线程 3、获知当前摄像头的帧率。 这个需求&#xff0c;之前就有做了&#xff0c;但是由于出现了一个问题&#xff0c;人家摄像头的帧率目前都可以达到60帧/s 了&#xff0c;而我的程序…

Unity 中计算射线和平面相交距离的原理

有此方法 能够计算射线和平面是否相交以及射线起点到平面交点的距离 代码分析 var dot Vector3.Dot(ray.direction, plane.normal);计算射线和平面法线的点积&#xff0c;如果大于等于0&#xff0c;则说明射线和平面没有相交&#xff0c;否则&#xff0c;说明射线和平面相交…

C 语言的整型提升问题

目录 引言 一、什么是整型提升 二、为什么会有整型提升 三、整型提升的规则 四、整型提升的影响 五、如何避免整型提升带来的问题 六、总结 引言 在 C 语言中&#xff0c;整型提升&#xff08;Integer Promotion&#xff09;是一个常常被忽视但却非常重要的概念。理解整…

LangChain4j 框架探索

LangChain4j 框架探索 Get Started核心概念1 - Message核心概念2 - Model核心概念3 - Ai Services核心概念4 - Structured Output核心概念5 - Chat Memory核心概念6 - Tool (Function Calling)核心概念7 - RAG(Retrieval-Augmented Generation)核心 RAG APIs使用示例 总结 Get …