vue3基础入门以及常用api使用

setup

setup 的返回值可以是函数

data(){
return {
a:'111',
c:this.name
}
},
setup(){
let name = '1111'
return ()=> '哈哈哈'
}//结果页面就是会显示 哈哈哈

setup和 OptionsAPI关系
data能和setup能同时存在,但不建议
data能读到setup里边的数据 setup是最早的生命周期 setup比data执行的要早

setup语法糖

想要组件name 和setup用一个script 可以用一个插件 npm i vite-plugin-vue-setup-extend -D

vite.config.js 文件中 引入

import VueSetupExtend from 'vite-plugin-vue-setup-extend'
plugins:[vue(),VueSetupExtend()
]
//然后在script写即可
<script setup name='Person234'>

ref

ref 实现对象类型响应式 深层次也是借助于reactive实现的

reactive

reactive重新分配一个对象,会失去响应式,用 Object.assign(car,{brand:‘品牌’}) 分配对象 car是个reactive对象

ref定义对象,要是重新分配对象可以直接car.value = {}

如果定义基本类型响应式数据,用ref
定义层级不深的对象数据,ref和reactive都行
定义层级深的,建议用reactive

toRefs和toRef

toRef是就是把对象类型中的每一个参数单拎出来变成ref
let age = toRef(person,‘age’)//把person里边的age解构出来
let { age,name} = person
let { age,name} = toRefs(person)

computed

有缓存

//只读
const aa = computed(()=>{
return '1111'
})let firstName = ref('zhang')
let lastName  = ref('san')
//可读可写
let fullNmae = computed({
get(){return firstName + '_'+ lastName
},
set(val){//val就是fullName.value赋值拿到的,这里是'12345'console.log('set',val)let [str1,str2] = val.split('_')firstName.value = str1lastName.value = str2}
})
这时候就可以 fullNmae.value = 'li-si'//得有set(){}

watch

vue3中watch只能监视以下四种数据:
1、ref定义的数据
2、reactive定义的数据
3、函数返回的一个值(getter函数->能返回一个值的函数)
4、一个包含上述内容的数组

//监听基础类型的ref,不需要.value
let count = ref(0)
watch(count,(newVal,oldVal)=>{console.log(newVal,oldVal)
})
//情况一:监听对象类型的ref,他只是监听对象的地址值,
let person = ref({
age:12,
name:'张三'
})
watch(person,(newVal,oldVal)=>{
console.log(newVal,oldVal)
//更改person 属性 person.value.name='11' 并不会打印
//更改person整个值才会走watch  person.value = { name:'11',age:10}
})
//-----------------------------------------------------------
//情况二:若想监听ref对象中的属性变化,使用deep:true
function changeName() {person.value.name = '李四'
}
function changeAge() {person.value.age = 20
}
function changePerson() {person.value = {name: '王五',age: 20}
}
watch(person,(newVal,oldVal)=>{console.log(newVal,oldVal)
},
{deep:true
}
)
//会出现情况是:
//单纯更改其中参数,监听打印的是Proxy(Object) {name: '李四', age: 20} Proxy(Object) {name: '李四', age: 20}
//可以假设成person的{name:xx,age:xx}是一个房子,改其中的参数只是改房子里边的东西,房子没变,所以每次监听房子新值和旧值一样
//更改整个person参数才会是Proxy(Object) {name: '王五', age: 20} Proxy(Object) {name: '李四', age: 20}
//---------------------------------------------------------
//情况三:监视reactive定义的对象数据,更改参数和整个对象都会受到监视,默认是开启深度监视的,而且用deep:false是不可以的
//但是打印新值和旧值是一样的,因为房子没变
let obj = reactive({a:{b:{c: 10}}
})
function changeTest() {obj.a.b.c = 20
}
watch(obj,(newVal,oldVal)=>{console.log('obj变化了',newVal,oldVal)
},
{deep:true
}
)
//-------------------------------------------------------------------------
//情况四:监视ref或reactive定义的【对象类型】数据中的某个属性,注意点如下:
//1、若该属性值不是【对象类型】,需要写成函数形式
//2、若该属性值依然是对象类型,可直接编,也可写成函数,不过建议写成函数
let person = reactive({name:'张三',car:{c1:'大众',c2:'比亚迪',}
})
function changeName() {person.name += '~'
}
//监视的reactive对象中属性不是对象类型,得用函数
watch(()=> person.name,(newVal,oldVal)=>{console.log('person.name变化了',newVal,oldVal)
}
)
//每次person.name变化watch都监听,且新值和旧值不一样
//监听reactive对象中属性为对象时建议也是函数
//这时候直接修改person.car = { c1:'雅迪'c2:'爱玛'}也能监听到
watch(()=> person.car,(newVal,oldVal)=>{console.log('person.name变化了',newVal,oldVal)
},{
deep:true
}
)
//-------下面这样修改car里边参数能监听比如更改c1和c2,但是直接修改car不会监听到,可以这么写但不建议----
watch(person.car,(newVal,oldVal)=>{console.log('person.name变化了',newVal,oldVal)
})
//监视上述的多个数据,(把他们放到同一个数组里)
watch([()=>person.name,()=>person.car.c1],(newVal,oldVal)=>{console.log('person.name变化了',newVal,oldVal)
})
//打印值也是数组['张三~','奔驰']

watchEffect

相比于watch,watchEffect不用特意指出监听的是哪个参数,且会立即运行一个函数,同时响应的追踪其依赖
比如同时监听多个参数时相对来说好一点,因为不用标注监听哪个参数

<script setup>
import { watchEffevt } from 'vue'
const count = ref(1)
watchEffect(()=>{
console.log(count.value)//当count变化时就会打印
})
</script>

标签的ref

 <h2 ref="title2">获取元素</h2>
import {ref} from 'vue'
//创建一个ref对象,用于存储ref标记的内容 创建名称要和元素ref=""中的名称一样
let title2 = ref()
//获取值用title2.value,即使两个vue文件中ref名称一样也不会冲突//给组件加ref
<Person ref='person'/>
let person = ref()
//如何拿到子组件东西,需要子组件用defineExpose
//Person里边
import { defineExpose } from 'vue'//其实也不用引入
let a = ref(0)
let b = ref(1)
defineExpose({a,b})

props

//父<PersonInfo msg="aaa" />
//可能最新vue3不需要引入defineProps defineEmit 可以直接使用
import { defineProps } from 'vue'
//接受+同时将数据保存起来
let props = defineProps({msg: String
})
console.log(props.msg)//aaa
//情况一:只接受
defineProps(['msg'])
//情况二:接受+限制类型 Persons是自定义的type
defineProps<{list: Persons}>()
//情况三:接受list+限制类型+限制必要性+指定默认值
interface PersonInter {
name:string,
id:string,
age:number
}
type Persons = Array<PersonInter>import { withDefaults } from 'vue'
const props = withDefaults(defineProps<Persons>(), {name: '',id: '',age: 10}} 
//给数组设置默认也需要加上箭头函数
const props = withDefaults(defineProps<{list?:Persons}>(), {list:()=>[{id:'123',name:'张三',age:10}]})
//情况四:使用箭头函数声明
const props = defineProps({List: {type: Array,required: true,default: () => [{ name: '文件1' }, { name: '文件2' }]}

provide和inject

      **方便props多层级透传**

有一些多层级嵌套的组件,形成了一棵巨大的组件树,而某个深层的子组件需要一个较远的祖先组件中的部分数据。在这种情况下,如果仅使用 props 则必须将其沿着组件链逐级传递下去,这样使用也很麻烦,这时候就可以使用provide和inject

//祖先组件中使用provide
<script setup>
import { provide } from 'vue'
provide(/* 注入名 */ 'age', /* 值 */ '11')
//例子
provide('age', '11')
</script>
//子组件中用inject使用父组件提供的值
<script setup>
import { inject } from 'vue'
const age = inject('age')
console.log('age', age)  //输出 11
</script>

生命周期

vue2和vue3对比
在这里插入图片描述
子组件先挂载完毕(onMounted),父再挂载完毕

自定义hooks

多个页面需要同一个功能就可以使用hooks,而且hooks里边能使用钩子例如onMounted等,还能用computed
useSum.ts

import { ref } from 'vue'
export function useSum() {const sum = ref(0)function add() {sum.value += 1}return { sum, add }
}
import { useSum } from 'xxx'
const { sum, add } = useSum()

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

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

相关文章

Java基础06-常用API

六、常用API API &#xff1a;应用程序编程接口 1、Object 作用&#xff1a;Object类是Java中所有类的祖宗类&#xff0c;因此&#xff0c;Java中所有类的对象都可以直接使用0bject类中提供的一些方法。 方法名说明toString()返回字符串数据equals(Object o)比较两个对象地址是…

使用 Docker-compose 部署达梦 DM 数据库

目录 1. 获取达梦 DM8 Docker 镜像并上传到 Harbor 服务器 2. Docker-compose 部署达梦 DM8 数据库 3. 配置 dm.ini 文件 4.完整的 dm.ini 文件 最近&#xff0c;将 MySQL 数据库迁移到了达梦 DM8 数据库。本文将分享如何通过 Docker-compose 部署达梦 DM8 数据库的过程&am…

ARM(5)内存管理单元MMU

一、虚拟地址和物理地址 首先&#xff0c;计算机系统的内存被组成一个由M个连续的字节大小组成的数组。每字节都会有一个唯一的物理地址。CPU访问内存最简单的方式就是使用物理地址。如下图&#xff1a; 图 1 物理地址,物理寻址 而现在都是采用的都是虚拟寻址的方法。CPU生成一…

gitlab保护分支设置

版本&#xff1a;gitlab10.2.2 一旦设置master分支被保护&#xff0c;除了管理员之外的任何用户都无法直接向master提交代码&#xff0c;只要提交代码就会报错 # git push -u origin master Total 0 (delta 0), reused 0 (delta 0) remote: GitLab: You are not allowed to pu…

在CentOS系统下实现准实时SFTP上传指定目录下前2分钟的文件

在CentOS系统下实现准实时SFTP上传指定目录下前2分钟的文件 引言准备工作编写Shell脚本执行脚本定时执行脚本注意事项结论引言 在企业级的文件同步和备份场景中,经常需要将本地目录中最新生成的文件(如前2分钟内生成的文件)快速上传到远程服务器的指定目录。为了实现这一目…

unity 屏幕波动反馈打击效果(附资源下载)

unity 屏幕波动反馈打击效果 一枪打出去整个屏幕都回波动的效果反馈。 知识点&#xff1a; 1、动画事件 2、屏幕后处理 效果如图&#xff1a;&#xff08;波动速度浮动都可调整&#xff09; 附件下载

【互联网业务风控】

1. 不同场景下的业务风控 1.1 账户业务风控 1.1.1账户安全 • 账号安全是所有强账号体系应用的基础&#xff0c; 强账号体系&#xff0c;如电商、网游、第三方支付、社交网络、即时通讯等&#xff1b;是需要登录后产生数据和交互的应用&#xff0c; 弱账号体, 如搜索、导航、…

关键词提取技术:TF-IDF 和 TextRank 简介

关键词提取是自然语言处理中的重要任务之一&#xff0c;用于自动提取文档中最能代表其内容的词汇。两种常用的关键词提取技术是 TF-IDF 和 TextRank。它们的工作机制和应用场景有所不同&#xff0c;下面将详细解释这两种技术。 1. TF-IDF&#xff08;Term Frequency - Inverse…

Python | Leetcode Python题解之第485题最大连续1的个数

题目&#xff1a; 题解&#xff1a; class Solution:def findMaxConsecutiveOnes(self, nums: List[int]) -> int:maxCount count 0for i, num in enumerate(nums):if num 1:count 1else:maxCount max(maxCount, count)count 0maxCount max(maxCount, count)return …

未来智慧建筑:人工智能技术的无限可能

随着科技的不断发展&#xff0c;人工智能技术正逐渐渗透到各行各业&#xff0c;其中&#xff0c;在智能建筑领域的应用备受瞩目。智能建筑结合了传统建筑与先进科技的完美融合&#xff0c;在提高建筑效率、节能环保、增强安全性等方面发挥着重要作用。本文将探讨人工智能技术在…

MyBatis的占位符(day36)

1 学习目标 重点掌握#{}占位符的使用 2 MyBatis的占位符介绍 #{}占位符: 相当于JDBC中的问号(?)占位符&#xff0c;是为SQL语句中的值进行占位&#xff0c;如果参数值是字符串或者日期类型&#xff0c;会进行转义处理 我们使用#{}写的SQL语句: <update id"delete…

蓝牙资讯|苹果AirPods Pro 2耳机推送开发者Beta固件

科技媒体 MacRumors 报道&#xff0c;苹果公司邀请开发者&#xff0c;针对 Lightning 和 USB-C 接口的 AirPods Pro 2 耳机&#xff0c;推送了新的 7B5013d 固件版本&#xff0c;较之前的 7B5013c 有所提升。 苹果未来会向所有 AirPods Pro 2 用户推送本次固件更新&#xff0…

react18中实现简易增删改查useReducer搭配useContext的高级用法

useReducer和useContext前面有单独介绍过&#xff0c;上手不难&#xff0c;现在我们把这两个api结合起来使用&#xff0c;该怎么用&#xff1f;还是结合之前的简易增删改查的demo&#xff0c;熟悉vue的应该可以看出&#xff0c;useReducer类似于vuex&#xff0c;useContext类似…

springboot项目通过maven的profile功能实现通过不同文件夹的方式来组织不同环境配置文件

写在前面 本文看下springboot项目如何通过文件夹的方式来组织不同环境配置文件。 1&#xff1a;正文 一般的我们写springboot项目时配置文件是这个样子的&#xff1a; appliction.yaml --> 通过spring.profiles.activexxx来激活某个指定后缀的配置文件 application-evn1…

小程序项目实践(一)--项目的初始化以及前期的准备工作

目录 1.起步 1.1 uni-app 简介 1.2 开发工具 1.2.1 下载 HBuilderX 1.2.2 安装 HBuilderX 1.2.3 安装 scss/sass 编译 1.2.4 快捷键方案切换 1.2.5 修改编辑器的基本设置 1.3 新建 uni-app 项目 1.4 目录结构 1.5 把项目运行到微信开发者工具 1.6 使用 Git 管理项目 …

SpringBoot3响应式编程全套-R2DBC

目录 传送门前言一、R2DBC概念二、Spring Data R2DBC1、整合1.1、导入依赖1.2、编写配置 2、声明式接口&#xff1a;R2dbcRepository2.1、Repository接口2.2、自定义Converter2.3、配置生效 3、编程式组件 三、RBAC-SQL练习1、1-12、1-N 四、最佳实践五、附录 传送门 SpringMV…

python配合yolov11开发分类训练软件

上一篇文件写了用yolo分类模型开发分类软件&#xff0c;这边文章在上个分类软件的基础上加入训练功能环境配置:pycharm&#xff0c;PySide6 6.6.1 &#xff0c;PySide6-Addons 6.6.1&#xff0c;PySide6-Essentials 6.6.1&#xff0c;torch 2.3.1cu121&#xff0c;torchaudio 2…

Spring AI Java程序员的AI之Spring AI(三)RAG实战

Spring AI之RAG实战与原理分析 前言RAGDocumentDocumentReaderDocumentTransformerDocumentWriter VectorStoreSimpleVectorStoreRedisVectorStore元数据搜索组装提示词 前言 检索增强生成&#xff08;RAG&#xff09;是一种结合信息检索和生成模型的技术&#xff0c;用于将相…

C语言——数组

1.数组的概念 数组是一组相同类型元素的集合&#xff1b; 数组中可以存放1个或多个元素&#xff0c;但数组元素个数不能为0。 同时数组可以分为一维数组和多维数组&#xff0c;多维数组一般常见 是二维数组。 2.一维数组的创建和初始化 一维数组的创建的基本语法&#xff1a; …

大数据-168 Elasticsearch 单机云服务器部署运行 详细流程

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…