轻松学会Vue3的setup

本文深入探讨Vue.js中的组件化开发,包括setup函数、ref、reactive、watch和watchEffect的使用,以及如何创建自定义组合API。通过示例展示了如何在Vue应用中创建可复用的组件,监听数据变化,以及实现响应式编程。此外,还提到了Vue的生命周期钩子函数与选项式API的对比,以及利用<script setup>语法糖简化代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

组合api

通过创建vue组件,我们可以将界面中重复的部分连同其功能一起提取为可重用的代码段。
setup()的执行时机相当于created,没有data 等

<script>
	export default {
		setup(){
		
			return {
			
			}
		}
	}
</script>

ref

接受一个内部值并返回一个响应式且可变的 ref 对象。
ref 对象仅有一个 .value ,指向该内部值。
使用需要引入ref

<script>
	import {ref} from 'vue'
	export default {
		setup(){
			const count = ref(0)
			console.log(count.value)
			
			return {
				count
			}
		}
	}
</script>

reactive

返回对象的响应式副本
响应式转换是“深层”的——它影响所有嵌套 property。

<template>
    <p v-for="(item,index) in list" :key="index">{{item}}</p>
</template>

<script>
	// reactive 定义引用类型的数据
	import {reactive} from 'vue'
	export default {
		setup(){
			const list = reactive([
				'Vue', 'React', 'Angular'
			])
			return {
				list
			}
		}
		
	}
</script>

watch

监听对象的变化

<script>
	import {ref,watch} from 'vue'
	export default {
		setup(){
			const counter = ref(0)
			watch(counter, (newValue, oldValue) => {
			  console.log('最新值: ' + counter.value)
			})

			return {
				counter
			}
		}
	}
</script>

watchEffect

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

<script>
	import {ref,watchEffect} from 'vue'
	export default {
		setup(){
			const num = ref(0)
			const stop = watchEffect(()=>{
			    // 这个回调函数引用的值,都会被监听
			    console.log(num.value);
			    localStorage.setItem("num",num.value);
			})

			return {
				stop
			}
		}
	}
</script>

computed 属性

接受一个 getter 函数,并根据 getter 的返回值返回一个不可变的响应式 ref 对象

const counter = ref(0)
const twiceTheCounter = computed(() => counter.value * 2)

或者,接受一个具有 get 和 set 函数的对象,用来创建可写的 ref 对象。

setup() {
			const counter = computed({
				// 当获取counter值调用函数
				get() {
					return num.value
				},
				// 设置counter值调用函数
				set(v) {
					num.value = v;
					if (v > 10) {
						num.value = 20};
				}
			})
			return {
				counter
			}
		}

生命周期

选项式 APIsetup
beforeCreate不需要*
created不需要*
beforeMountonBeforeMount
mountedonMounted
beforeUpdateonBeforeUpdate
updatedonUpdated
beforeUnmountonBeforeUnmount
unmountedonUnmounted
errorCapturedonErrorCaptured
renderTrackedonRenderTracked
renderTriggeredonRenderTriggered
activatedonActivated
deactivatedonDeactivated

全局配置

添加一个可以在应用的任何组件实例中访问的全局 property

app.config.globalProperties.$mysay = function(msg){alert(msg+"你好")};

setup函数

使用 setup 函数时,它将接收两个参数:props,context
setup 函数中的 props 是响应式的,当传入新的 prop 时,它将被更新。

setup(props,context){

}

context 是一个普通 JavaScript 对象,暴露了其它可能在 setup 中有用的值:

export default {
  setup(props, context) {
    // Attribute (非响应式对象,等同于 $attrs)
    console.log(context.attrs)

    // 插槽 (非响应式对象,等同于 $slots)
    console.log(context.slots)

    // 触发事件 (方法,等同于 $emit)
    console.log(context.emit)

    // 暴露公共 property (函数)
    console.log(context.expose)
  }
}

自定义组合api

定义一个监听窗口大小的api

import {ref,onMounted,onBeforeUnmount} from 'vue'
function useWin(){
	// 定义一个响应式数据size 是窗口的宽高
	const size = ref({
		w:window.innerWidth,
		h:window.innerHeight
	})
	// 定义方法 更新size
	function onReize(){
		// 更新size
		size.value = {
			w:window.innerWidth,
			h:window.innerHeight
		}
	}
	// 当挂载添加window的resize执行onResize方法
	onMounted(()=>{
		window.addEventListener("resize",onReize)
	})
	// 卸载前移除事件
	onBeforeUnmount(()=>{
		window.removeEventListener("resize",onReize)
	})
	// 监听变化更新宽高
	return size;
}
// 导出
export {useWin}
<template>
	<p>宽:{{winSize.w}}</p>
	<p>高:{{winSize.h}}</p>
</template>
<script>
	import {useWin} from '@/utils/utils.js'
	export default {
		setup() {

			return {
				winSize:useWin()
			}
		}
	}
</script>

setup语法糖

一般写法需要导出很不方便,解决这个问题可以使用<script setup></script>
不在需要导出,组件不需要注册非常方便

<script setup>
	import { ref } from "vue";
	import HelloWorld from "@/components/HelloWorld.vue"
	const count = ref(100);
	const setCount = function(v){
		count.value+=v;
	}
</script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值