熬夜讲解vue3组合API中setup、 ref、reactive的用法以及hooks的使用
1.初识setUp的使用
简单介绍下面的代码功能:
使用ref函数,去使用监听某一个变量的变化,并且把它渲染到视图上。
setUp函数是组合API的入口函数。这个是非常重要的。
setUp可以去监听变量的变化哈!我们将会利用它
ref 在vue中内置,需要导入。
<template>
<div>{{ countNum}}</div>
<button @click="handerFunc">按钮</button>
</template>
<script>
import {ref} from 'vue'
export default {
name: 'App',
setup() {
// 这一句表示的是定义了一个变量count。这个变量的初始值是100
let countNum=ref(100);
// 在组合API中,如果想定义一个方法,不用定义到methods中去。直接定义就可以了
function handerFunc(){
// console.log(countNum);//countNum是一个对象
countNum.value += 10;
}
//在组合api中定义的方法,或者变量。如果外界需要使用,那么必须通过 return {aaa,func} 的方式暴露出去
return { countNum ,handerFunc}
}
}
</script>
2认识 reactive 的使用
ref函数通常用来监听基本数据类型。如字符串,布尔。
也可以去监听复杂类型的变化。但是因为在js中使用的时候需要点.value
导致很多小伙伴都会去使用reactive
所以我们的主角reactive就出现了。
setup 中的函数会自动执行一次。
<template>
<div>
<ul>
<li v-for="item in satte.arr" :key="item.id">
{{item.name }}
</li>
</ul>
</div>
</template>
<script>
import {reactive} from 'vue'
export default {
name: 'App',
setup(){
console.log("setUp会自动执行的")
// ref函数的注意点:
// ref函数只能够去监听简单类型的数据变化,不能够去监听,复杂类型的变化(对象)
// reactive 方法里面是一个对象
let satte=reactive({
arr:[
{name:"司藤",id:'0011'},
{name:"皮囊之下",id:'0011'},
{name:"百岁之约",id:'0012'},
{name:"三生三世",id:'0013'},
]
})
return { satte }
},
}
</script>
3使用reactive 实现视图的删除
<template>
<div>
<ul>
<li v-for="(item,index) in satte.arr" :key="index" @click="del(index)">
{{item.name }}
</li>
</ul>
</div>
</template>
<script>
import {reactive} from 'vue'
export default {
name: 'App',
setup(){
let satte=reactive({
arr:[
{name:"司藤",id:'0011'},
{name:"皮囊之下",id:'0011'},
{name:"百岁之约",id:'0012'},
{name:"三生三世",id:'0013'},
]
})
// 删除被点击的元素
function del(index){
satte.arr.splice(index,1)
}
return { satte, del}
},
}
</script>
4将删除的逻辑分离出去,形成一个单独的模块
<template>
<div>
<ul>
<li v-for="(item,index) in satte.arr" :key="index" @click="del(index)">
{{item.name }}
</li>
</ul>
</div>
</template>
<script>
import {reactive} from 'vue'
export default {
name: 'App',
setup(){
// onlyDelLuoJi() 方法中含有一个数组 和一个方法;类似于解构
let {satte,del }=onlyDelLuoJi();
// 暴露给外界使用
return { satte,del}
},
}
function onlyDelLuoJi(){
let satte=reactive({
arr:[
{name:"司藤",id:'0011'},
{name:"皮囊之下",id:'0011'},
{name:"百岁之约",id:'0012'},
{name:"三生三世",id:'0013'},
]
})
// 删除被点击的元素
function del(index){
satte.arr.splice(index,1)
}
// 将数据satte 和方法 del 暴露出去
return { satte,del }
}
</script>
5. 实现添加功能,事件之间传递参数
<template>
<div>
<div>
<input type="text" v-model="addobj.watchTv.name">
<button @click="addHander">添加</button>
</div>
<ul>
<li v-for="(item,index) in satte.arr" :key="index" @click="del(index)">
{{item.name }}
</li>
</ul>
</div>
</template>
<script>
import {reactive} from 'vue'
export default {
name: 'App',
setup(){
// onlyDelLuoJi() 方法中含有一个数组 和一个方法;类似于解构
let {satte,del }=onlyDelLuoJi();
// 传递参数satte 是onlyDelLuoJi函数中提供的satte。进行传递
let { addobj,addHander }=OnlyaddHander(satte);
// 暴露给外界使用
return { satte,del,addobj, addHander}
},
}
//添加功能模块
function OnlyaddHander(satte){
console.log('初始化添加',satte)
let addobj=reactive({
watchTv:{
name:"",
id:""
}
});
function addHander(){
// 重置清空 错吴做法
// satte.arr.push(addobj.watchTv)
// addobj.watchTv.name = "";
// addobj.watchTv.id = "";
// 正确做法
let oldobj = Object.assign({}, addobj.watchTv)
satte.arr.push(oldobj)
}
return { addobj,addHander }
}
//删除功能模块
function onlyDelLuoJi(){
console.log('删除初始化')
let satte=reactive({
arr:[
{name:"司藤",id:'0011'},
{name:"皮囊之下",id:'0011'},
{name:"百岁之约",id:'0012'},
{name:"三生三世",id:'0013'},
]
})
// 删除被点击的元素
function del(index){
satte.arr.splice(index,1)
}
// 将数据satte 和方法 del 暴露出去
return { satte,del }
}
</script>
6 将他们抽离成单独的文件
我们想在想将添加删除相关的逻辑,单独抽离成一个文件。
add.js 是添加相关的逻辑
del.js 是删除的相关逻辑
add.js
import { reactive } from "vue"
function OnlyaddHander(satte){
console.log('初始化添加',satte)
let addobj=reactive({
watchTv:{
name:"",
id:""
}
});
function addHander(e){
// 重置清空 错吴做法
// satte.arr.push(addobj.watchTv)
// addobj.watchTv.name = "";
// addobj.watchTv.id = "";
// 正确做法
let oldobj = Object.assign({}, addobj.watchTv)
satte.arr.push(oldobj)
e.preventDefault();
}
return { addobj,addHander }
}
export default OnlyaddHander
adel.js
import {reactive } from "vue"
function onlyDelLuoJi() {
console.log('删除初始化')
let satte=reactive({
arr:[
{name:"司藤",id:'0011'},
{name:"皮囊之下",id:'0011'},
{name:"百岁之约",id:'0012'},
{name:"三生三世",id:'0013'},
]
})
// 删除被点击的元素
function del(index){
satte.arr.splice(index,1)
}
// 将数据satte 和方法 del 暴露出去
return { satte,del }
}
export default onlyDelLuoJi
主文件
<template>
<div>
<div>
<input type="text" v-model="addobj.watchTv.name">
<button @click="addHander">添加</button>
</div>
<ul>
<li v-for="(item,index) in satte.arr" :key="index" @click="del(index)">
{{item.name }}
</li>
</ul>
</div>
</template>
<script>
import onlyDelLuoJi from "./components/del"
import OnlyaddHander from "./components/add"
export default {
name: 'App',
setup(){
// onlyDelLuoJi() 方法中含有一个数组 和一个方法;类似于解构
let {satte,del }=onlyDelLuoJi();
// 传递参数
let { addobj,addHander }=OnlyaddHander(satte);
// 暴露给外界使用
return { satte,del,addobj, addHander}
},
}
</script>
如果你觉得不错请点一个推荐。
你的推荐是我写下去的动力。非常感谢!
遇见问题,这是你成长的机会,如果你能够解决,这就是收获。
作者:晚来南风晚相识
出处:https://www.cnblogs.com/IwishIcould/
本文版权归作者所有,欢迎转载,未经作者同意须保留此段声明,在文章页面明显位置给出原文连接
如果文中有什么错误,欢迎指出。以免更多的人被误导。
出处:https://www.cnblogs.com/IwishIcould/
想问问题,打赏了卑微的博主,求求你备注一下的扣扣或者微信;这样我好联系你;(っ•̀ω•́)っ✎⁾⁾!
如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,或者关注博主,在此感谢!
万水千山总是情,打赏5毛买辣条行不行,所以如果你心情还比较高兴,也是可以扫码打赏博主(っ•̀ω•́)っ✎⁾⁾!
想问问题,打赏了卑微的博主,求求你备注一下的扣扣或者微信;这样我好联系你;(っ•̀ω•́)っ✎⁾⁾!

支付宝

微信
如果文中有什么错误,欢迎指出。以免更多的人被误导。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
2019-06-08 vue中如何使用echarts,使用axios获取数据