vue组合式api

一、ref(基本类型数据,对象类型数据)

1.作用:定义响应式变量

2.语法:let xxx = ref(初始值)

3.返回值:一个RefImpl的实例对象,简称ref对象,ref对象的value属性是响应式的。

4.注意:js中操作数据需要写xxx.vslue,模板上不需要.value,直接使用。let xxx = ref(初始值),xxx不是响应式的,xxx.value是响应式的。

二、reactive(对象类型数据)

1.作用:定义响应式变量

2.语法:let xxx = reactive(源对象)

3.返回值:一个Proxy的实例对象,简称响应式对象。

4.注意:reactive定义的响应式数据是深层次的。

三、ref对比reactive

1.ref 用来定义:基本类型数据,对象类型数据

reactive用来定义:对象类型数据

2.区别

ref创建的变量必须使用.value

reactive重新分配一个新对象,会失去响应式。(可以使用Object.assign去整体替换)

3.使用原则

若需要一个基本类型的响应式数据,必须使用ref。

若需要一个响应式对象,层级不深,ref,reactive都可以。

若需要一个响应式对象,层级较深,推荐使用reactive。

四、toRefs和toRef

1.作用:将一个响应式对象中的每一个属性,转换为ref对象。

2.toRefs与toRef功能一致,但toRefs可以批量转换。

<template><div>{{ name }}{{ age }}</div>
</template>
<script setup>
import { reactive, toRefs, toRef } from 'vue'
let person=reactive({name:'zs',age:18})
//解构赋值后失去响应式
let {name,age} = toRefs(person)
console.log('name,age',name.value,age.value);
let n1 = toRef(person, 'age')
console.log(n1.value);
</script>

五、computed

<template><div>姓:<input type="text" v-model="firstName"><br>名:<input type="text" v-model="lastName"><br>全名:<span>{{ fullName }}</span>全名:<span>{{ fullName }}</span><br><button @click="changeFullName">修改名字</button></div>
</template><script setup>
import { ref,computed} from 'vue'
let firstName=ref('z')
let lastName=ref('s')
// 定义的fullName是一个计算属性,而且是只读的
// let fullName = computed(()=>{
//   console.log('1');
//   return firstName.value.slice(0,1).toUpperCase()+firstName.value.slice(1)+lastName.value.slice(0,1).toUpperCase()+lastName.value.slice(1)
// })
// 定义的fullName是一个计算属性,可读可写
let fullName = computed({get(){console.log('1')return firstName.value.slice(0,1).toUpperCase()+firstName.value.slice(1)+'-'+lastName.value.slice(0,1).toUpperCase()+lastName.value.slice(1)},set(val){let [str1,str2]=val.split('-');firstName.value=str1;lastName.value=str2}
})
let changeFullName = ()=>{fullName.value='li-si'
}
</script>

六、watch

1.作用:监视数据的变化

2.只能监视以下四种数据

ref定义的数据,reactive定义的数据,getter函数(一个函数,返回一个值),一个包含上述内容的数组。

a.监听ref定义的基本类型数据,对象类型数据

监视的是对象的地址值,想要监视内部属性的变化,需要deep属性为true

<template><div><p>监视ref定义的基本类型数据{{ sum }} <button @click="sum+=1">+1</button></p><p>监视ref定义的对象类型数据{{ person.name }} {{ person.age }}<button @click="person.name+='~'">changeName</button><button @click="person.age+=1">changeAge</button><button @click="changePerson">changePerson</button></p></div>
</template><script setup>
import {  ref,watch} from 'vue'
let sum=ref(0)
const stopWatch= watch(sum,(newVal,oldVal)=>{console.log('newVal,oldVal', newVal,oldVal);if(newVal>10){stopWatch()}
})
let person=ref({name:'zs',age:18
})
let changePerson = ()=>{person.value={name:'ls',age:90}
}
//监视的是person的地址值,想要监视内部属性的变化,需要deep属性为true
watch(person,(newVal,oldVal)=>{console.log('newVal,oldVal', newVal,oldVal);
},{deep:true,immediate:true
})
</script>
 b.监听reactive定义的对象类型数据

监视的是reactive定义的对象类型数据,默认开启深度监听,该深度监听不能关闭

<template><div><p>监视reactive定义的对象类型数据{{ person.name }} {{ person.age }}<button @click="person.name+='~'">changeName</button><button @click="person.age+=1">changeAge</button><button @click="changePerson">changePerson</button></p></div>
</template><script setup>
import {  reactive,watch} from 'vue'
let person=reactive({name:'zs',age:18
})
let changePerson = ()=>{Object.assign( person,{name:'ls',age:90})
}
//监视的是reactive定义的对象类型数据,默认开启深度监听,该深度监听不能关闭
watch(person,(newVal,oldVal)=>{console.log('newVal,oldVal', newVal,oldVal);
},{// deep:false,immediate:true
})
</script>
 c.监视ref或reactive定义的对象类型数据中的某个属性
<template><div><p>监视响应式对象的的某个属性{{person.name}}{{ person.car.c1 }} {{ person.car.c2 }}<button @click="person.name='ls'">changeName</button><button @click="person.car.c1='大宝马'">changeC1</button><button @click="person.car.c2='大奔驰'">changeC2</button><button @click="changeCar">changeCar</button></p></div>
</template>
<script setup>
import {  reactive,watch} from 'vue'
let person=reactive({name:'zs',age:18,car:{c1:'宝马',c2:'奔驰'}
})
let changeCar = ()=>{person.car={c1:'爱玛',c2:'绿驹'}
}
//监视响应式对象中的某个属性,且该属性是基本类型的,要写成函数式
watch(()=>person.name,(newVal,oldVal)=>{console.log('newVal,oldVal', newVal,oldVal);
})
//监视响应式对象中的某个属性,且该属性是对象类型的,可以直接写,也可以写成函数式,更推荐写函数式,对象监视的是地址值,对象内部需要手动开启深度监听。
watch(()=>person.car,(newVal,oldVal)=>{console.log('newVal,oldVal', newVal,oldVal);
},{deep:true
})
</script>
4.监视多个对象 
<template><div><p>监视多个数据{{person.name}}{{ person.car.c1 }} {{ person.car.c2 }}<button @click="person.name='ls'">changeName</button><button @click="person.car.c1='大宝马'">changeC1</button><button @click="person.car.c2='大奔驰'">changeC2</button><button @click="changeCar">changeCar</button></p></div>
</template>
<script setup>
import {  reactive,watch} from 'vue'
let person=reactive({name:'zs',age:18,car:{c1:'宝马',c2:'奔驰'}
})
let changeCar = ()=>{person.car={c1:'爱玛',c2:'绿驹'}
}
//监视响应式对象中的某个属性,且该属性是对象类型的,可以直接写,也可以写成函数式,更推荐写函数式,对象监视的是地址值,对象内部需要手动开启深度监听。
watch([()=>person.name,()=>person.car],(newVal,oldVal)=>{console.log('newVal,oldVal', newVal,oldVal);
},{deep:true
})
</script>

七、watchEffect

立即运行一个函数,同时响应式地追踪其依赖,并在依赖更新时重新执行该函数。

watch对比watchEffect

都能监听响应式数据的变化,不同的是监听数据变化的方式不同

watch需要明确指出监视的数据

watchEffect不用明确指出监视的数据,函数中用到哪些属性,就会监听哪些属性。

<template><div><p>watchEffect{{water.temp}}{{ water.height }}<button @click="water.temp+=10">温度+10</button><button @click="water.height+=10">高度+10</button></p></div>
</template>
<script setup>
import {  reactive,watchEffect} from 'vue'
let water=reactive({temp:0,height:0,
})
watchEffect(()=>{if(water.temp>=60||water.height>=80)console.log('water.temp,water.height',water.temp,water.height);
})
</script>

八、标签的ref属性

//父组件
<template><HelloWorld ref="helloRef" /><button @click="logHelloRef">test</button>
</template>
<script setup>
import { ref } from 'vue';
import HelloWorld from './components/HelloWorld.vue';
const helloRef = ref(null);
const logHelloRef = () => {console.log('helloRef', helloRef.value);
};
</script> //子组件
<template><div><p>watchEffect{{water.temp}}{{ water.height }}<button @click="water.temp+=10">温度+10</button><button @click="water.height+=10">高度+10</button></p></div>
</template>
<script setup>
import {  reactive,watchEffect,defineExpose} from 'vue'
let water=reactive({temp:0,height:0,
})
watchEffect(()=>{if(water.temp>=60||water.height>=80)console.log('water.temp,water.height',water.temp,water.height);
})
defineExpose({water})
</script>

九、props

defineProps可以省略不引入

//父组件
<template><HelloWorld  :a="a" :b="list" c=123 />
</template>
<script setup>
import { ref,reactive } from 'vue';
import HelloWorld from './components/HelloWorld.vue';
let a=ref('aaaaaaaaaaa');
let list=reactive([{msg:'aa',num:0},{msg:'bb',num:1},
]);
</script>
//子组件
<template><div>{{ props.a }}{{ props.c }}<ul><li v-for="item in b" :key="item.num">{{ item.num }}{{ item.msg }}</li></ul></div>
</template>
<script setup>
import {  defineProps} from 'vue'
const props=defineProps({a:{type:String,required:true,default:'abc'},b:{type:Array,required:true,default:[]},c:{type:Number,required:true,default:0}
})
</script>

十、生命周期

<template><HelloWorld v-if="isShow"/><button @click="isShow=!isShow">flag</button>
</template>
<script setup>
import { ref } from 'vue';
import HelloWorld from './components/HelloWorld.vue';
let isShow = ref(true)
</script><template><div>{{ sum }}<button @click="sum+=1">+1</button></div>
</template>
<script setup>
import {ref, onBeforeMount, onMounted,onBeforeUpdate,onUpdated,onBeforeUnmount,onUnmounted} from 'vue'
let sum = ref(0)
console.log('创建');
onBeforeMount(()=>{console.log('挂载前');
})
onMounted(()=>{console.log('挂载完毕');
})
onBeforeUpdate(()=>{console.log('更新前');
})
onUpdated(()=>{console.log('更新完毕');
})
onBeforeUnmount(()=>{console.log('卸载前');
})
onUnmounted(()=>{console.log('卸载完毕');
})
</script>

十一、hooks

组合式函数约定用驼峰命名法命名,并以“use”作为开头

<template><div>{{ sum }}{{ bigSum }}<button @click="add">+1</button></div>
</template>
<script setup>
import useSum from '../hooks/useSum'
let {sum,add,bigSum}=useSum()
</script>useSum.js
import { onMounted, ref, computed } from 'vue'
export default function() {//数据let sum = ref(0);//方法const add = () => {sum.value += 1};//计算属性let bigSum = computed(() => {return sum.value * 10});//钩子onMounted(() => {add()})return { sum, add, bigSum }
}

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

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

相关文章

【MySQL】视图、用户和权限管理

目录 视图创建视图数据修改影响删除视图视图优点 用户和权限管理查看当前的数据库拥有用户信息创建用户修改密码删除用户权限授权回收权限 视图 视图就是相当于创建一个表&#xff0c;将查询到的结果集给存储起来。像使用复杂的多表查询查询到的结果集就不可以对结果集操作。而…

2024/9/29周报

文章目录 摘要Abstract污水处理工艺流程整体介绍粗格栅细格栅曝气沉砂池提升泵房峰谷平策略 初沉池&#xff08;一级处理&#xff09;工作原理运行管理 氧化沟生化池&#xff08;二级处理&#xff09;二沉池工作原理运行参数 高效沉淀池功能与特点工作原理 深度处理&#xff08…

Coursera_ Algorithms I 学习笔记:Module_3_Analysis_of_Algorithm_Introduction

Coursera_ Algorithms I 学习笔记&#xff1a;Module_3_Analysis_of_Algorithm_Introduction scientific method applied to analysis of algorithms data analysis log-log plot doubling hypothesis experimental alogrithmics System independent effectsSystem dependen…

Electron 主进程与渲染进程、预加载preload.js

在 Electron 中&#xff0c;主要控制两类进程&#xff1a; 主进程 、 渲染进程 。 Electron 应⽤的结构如下图&#xff1a; 如果需要更深入的了解electron进程&#xff0c;可以访问官网 流程模型 文档。 主进程 每个 Electron 应用都有一个单一的主进程&#xff0c;作为应用…

ubuntu20.04系统下,c++图形库Matplot++配置

linux下安装c图形库Matplot&#xff0c;使得c可以可视化编程&#xff1b;安装Matplot之前&#xff0c;需要先安装一个gnuplot&#xff0c;因为Matplot是依赖于此库 gnuplot下载链接&#xff1a; http://www.gnuplot.info/ 一、gnuplot下载与安装(可以跳过&#xff0c;下面源码…

业务调度 -- OTN集群

传输网络Mesh化客观上导致了单节点的业务维度增多以及调度需求增大&#xff0c;通过组建OTN集群可实现业务跨子架调度&#xff0c;容量按需扩展&#xff0c;高效疏导网络节点流量。 什么是OTN集群 OTN集群是OTN设备的一种组合应用形式&#xff0c;多个OTN子架通过集群交叉板互…

启动hadoop集群出现there is no HDFS_NAMENODE_USER defined.Aborting operation

解决方案 在hadoop-env.sh中添加 export HDFS_DATANODE_USERroot export HDFS_NAMENODE_USERroot export HDFS_SECONDARYNAMENODE_USERroot export YARN_RESOURCEMANAGER_USERroot export YARN_NODEMANAGER_USERroot 再次运行即可。

Android 安卓内存安全漏洞数量大幅下降的原因

谷歌决定使用内存安全的编程语言 Rust 向 Android 代码库中写入新代码&#xff0c;尽管旧代码&#xff08;用 C/C 编写&#xff09;没有被重写&#xff0c;但内存安全漏洞却大幅减少。 Android 代码库中每年发现的内存安全漏洞数量&#xff08;来源&#xff1a;谷歌&#xff09…

Python办公自动化案例:实现XMind文件转换成Excel文件

案例:实现XMind文件转换成Excel文件 将XMind文件转换为Excel文件的过程可以通过几个步骤来实现,主要涉及到读取XMind文件,解析其内容,然后创建一个Excel文件并将解析的内容写入。以下是一个简化的Python脚本,展示了如何使用xmindparser库来解析XMind文件,并使用pandas库…

初识Linux · 进程终止

目录 前言&#xff1a; 进程终止在干什么 进程终止的3种情况 进程如何终止 前言&#xff1a; 由上文的地址空间的学习&#xff0c;我们已经知道了进程不是单纯的等于PCB 自己的代码和数据&#xff0c;进程实际上是等于PCB mm_struct(地址空间) 页表 自己的代码和数据。…

PCL 法线空间采样

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.1.1 法线计算 2.1.2 基于法线进行采样 2.1.3 可视化原始点云和采样后的点云 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接&#xff1a; PCL点云算法与项目实…

戴尔电脑怎么开启vt虚拟化_戴尔电脑新旧机型开启vt虚拟化教程

最近使用戴尔电脑的小伙伴们问我&#xff0c;戴尔电脑怎么开启vt虚拟。大多数可以在Bios中开启vt虚拟化技术&#xff0c;当CPU支持VT-x虚拟化技术&#xff0c;有些电脑会自动开启VT-x虚拟化技术功能。而大部分的电脑则需要在Bios Setup界面中&#xff0c;手动进行设置&#xff…

CEPH的写入流程

1、客户端程序发起对文件的读写请求&#xff0c;ceph前端接口&#xff08;RADOS Gateway&#xff09;将文件切分成多个固定大小的对象&#xff08;默认大小为4MB&#xff09; 2、计算文件到对象的映射 (1) 计算OID为每个对象分配一个唯一的OID&#xff08;Object ID&#xff09…

跟着谭书学c语言---110页第5章循环结构(5.1和5.2节)

目录 5.1节读书笔记 5.2节读书笔记 总结和反思 5.1节读书笔记 5.2节读书笔记 几点说明:::用小规模数据测试程序的正确性,加断点,打印中间状态 关于程序分析(2)深刻体会循环前的初始化,同样的功能如果初始化条件不同,循环有可能会有细微的变化 循环体中,语句进行调…

[Linux]僵尸进程,孤儿进程,环境变量

希望你开心&#xff0c;希望你健康&#xff0c;希望你幸福&#xff0c;希望你点赞&#xff01; 最后的最后&#xff0c;关注喵&#xff0c;关注喵&#xff0c;关注喵&#xff0c;大大会看到更多有趣的博客哦&#xff01;&#xff01;&#xff01; 喵喵喵&#xff0c;你对我真的…

C++ string的基本运用详细解剖

string的基本操作 一.与C语言中字符串的区别二.标准库中的string三.string中常用接口的介绍1.string中常用的构造函数2.string类对象的容量操作函数3.string类对象的访问及遍历操作4.string类对象的修改操作5.string类的非成员函数6.string中的其他一些操作 一.与C语言中字符串…

软考论文《论大数据处理架构及其应用》精选试读

论文真题 模型驱动架构设计是一种用于应用系统开发的软件设计方法&#xff0c;以模型构造、模型转换和精化为核心&#xff0c;提供了一套软件设计的指导规范。在模型驱动架构环境下&#xff0c;通过创建出机器可读和高度抽象的模型实现对不同问题域的描述&#xff0c;这些模型…

《Windows PE》3.2 PE头结构-DOS头和DOS块

正如我们在初识PE文件一节中看到的&#xff0c;PE文件头中包含几个重要的结构&#xff0c;DOS头、DOS块&#xff08;DOS Stub&#xff09;和NT头。NT头就是PE特征码文件头&#xff08;COFF 文件标头&#xff09;扩展头&#xff08;可选标头&#xff09;&#xff0c;合称为NT头。…

Anki 学习日记 - 卡片模版 - 单选ABCD(纯操作)

摘要&#xff1a;在不懂前端语言的情况下自定义卡片模版&#xff0c;卡片模版的字段 安装&#xff08;官网&#xff09;&#xff1a;Anki - powerful, intelligent flashcards (ankiweb.net) 一、在哪能修改卡片模版 管理笔记模板 - > 添加 -> 问答题 -> 设置名称 二…

建筑物变化检测算法baseline工程,开箱即用,23年5月测试准确度超越阿里云aiearth

建筑物变化检测算法baseline工程&#xff0c;开箱即用&#xff0c;23年5月测试准确度超越阿里云aiearth 建筑物变化检测算法Baseline工程 项目背景 随着城市化进程的加快&#xff0c;对建筑物的变化进行监测变得尤为重要。这不仅有助于城市管理与规划&#xff0c;还能够为灾害…