vue3 setup的小知识

本文详细探讨了Vue3的setup函数及其相关的组合API,包括ref、reactive、watch、watchEffect、computed属性的使用。还讨论了生命周期、全局配置、自定义组合API以及setup语法糖的便利性,帮助开发者更好地理解和应用Vue3的新特性。

摘要生成于 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>
### Vue3 中 `setup()` 函数的使用方法 `setup()` 是 Vue3 提供的一个新的组合式 API,用于替代 Options API,在组件初始化之前调用。它允许开发者通过函数的方式定义组件逻辑,提供更加灵活强大的功能。 #### 1. **为什么使用 `setup()`** `setup()` 的主要目的是为了简化复杂组件的状态管理以及提高代码可维护性复用性。相比传统的 Options API,`setup()` 更加直观地展示了状态之间的关系[^1]。 --- #### 2. **创建 Vue3 项目** 在使用 `setup()` 前,需要先安装并配置好 Vue3 环境。可以通过 Vue CLI 或 Vite 创建一个新的 Vue3 项目: ```bash npm install -g @vue/cli vue create my-vue3-project ``` 或者使用 Vite: ```bash npm init vite@latest my-vue3-project --template vue cd my-vue3-project npm install npm run dev ``` --- #### 3. **在组件中编写 `setup()` 方法** 以下是 `setup()` 的基本结构及其作用域: ```javascript <template> <div>{{ message }}</div> </template> <script> import { ref } from &#39;vue&#39;; export default { setup() { // 定义响应式变量 const message = ref(&#39;Hello, Vue3!&#39;); // 返回模板可以访问的内容 return { message, }; }, }; </script> ``` 在这个例子中,`message` 被定义为一个响应式的变量,并通过 `return` 将其暴露给模板部分使用。 --- #### 4. **`setup()` 生命周期** ##### 4.1 执行时机 `setup()` 在组件实例被创建之后、选项 (如 `data` `methods`) 初始化之前执行。因此无法直接访问这些选项中的内容。 ##### 4.2 包含的生命周期钩子 虽然传统生命周期钩子(如 `beforeCreate` `created`)仍然可用,但在 `setup()` 中可以直接导入对应的 Composition API 钩子来实现相同的功能。例如: ```javascript import { onMounted } from &#39;vue&#39;; export default { setup() { onMounted(() => { console.log(&#39;Component mounted!&#39;); }); return {}; }, }; ``` --- #### 5. **使用 `ref` 对数据进行响应式绑定** `ref` 是 Vue3 提供的一种方式,用来创建基础类型的响应式对象。当值发生变化时,视图会自动更新。 ```javascript import { ref } from &#39;vue&#39;; export default { setup() { const count = ref(0); const increment = () => { count.value++; }; return { count, increment, }; }, }; ``` 在这里,`count` 是一个响应式变量,而 `increment` 则是一个修改该变量的方法。 --- #### 6. **使用 `watch` `computed`** ##### 6.1 对变化作出反应 (`watch`) 如果希望监听某个响应式属性的变化,则可以使用 `watch` 来处理副作用。 ```javascript import { ref, watch } from &#39;vue&#39;; export default { setup() { const firstName = ref(&#39;&#39;); const lastName = ref(&#39;&#39;); watch([firstName, lastName], ([newFirstName, newLastName]) => { console.log(`Full Name Changed to ${newFirstName} ${newLastName}`); }); return { firstName, lastName, }; }, }; ``` ##### 6.2 使用 `computed` 计算派生值 对于依赖其他响应式数据计算得出的结果,推荐使用 `computed` 属性。 ```javascript import { ref, computed } from &#39;vue&#39;; export default { setup() { const width = ref(10); const height = ref(20); const area = computed(() => width.value * height.value); return { width, height, area, }; }, }; ``` 在此示例中,每当 `width` 或 `height` 发生改变时,`area` 的值都会重新计算[^1]。 --- #### 7. **关于 Props 的传递与解构** 在 `setup()` 中接收父级传入的 `props` 参数时需要注意,默认情况下它们是非响应式的。如果想让其保持响应特性,需借助 `defineProps` 或者手动声明。 ```javascript // 方式一:使用 defineProps const props = defineProps({ title: String, }); console.log(props.title); // 方式二:显式声明 export default { props: [&#39;title&#39;], setup(props) { console.log(props.title); // 此处仍具有响应能力 return {}; }, }; ``` --- #### 8. **实际案例分析** 以下是从引用[2]提取的实际应用案例,展示如何结合 ECharts 实现动态图表渲染: ```javascript <template> <div id="questionStatus" class="questionStatus"></div> </template> <script> import { reactive, onMounted } from &#39;vue&#39;; import * as echarts from &#39;echarts&#39;; export default { setup() { const data = reactive({ questions: { xAxis: { type: &#39;category&#39;, data: [ &#39;1月&#39;, &#39;2月&#39;, &#39;3月&#39;, &#39;4月&#39;, &#39;5月&#39;, &#39;6月&#39;, &#39;7月&#39;, &#39;8月&#39;, &#39;9月&#39;, &#39;10月&#39;, &#39;11月&#39;, &#39;12月&#39;, ], }, yAxis: { type: &#39;value&#39;, }, series: [ { data: [0, 10, 30, 20, 30, 30, 70, 20, 5, 65, 40, 30], type: &#39;line&#39;, smooth: true, }, ], }, }); const drawChart = (id) => { const myEchart = echarts.init(document.getElementById(id)); myEchart.setOption(data.questions); window.onresize = () => myEchart.resize(); }; onMounted(() => { drawChart(&#39;questionStatus&#39;); }); return {}; }, }; </script> ``` 此代码片段演示了如何利用 `reactive` 维护图表所需的数据源,并通过 `onMounted` 进行动态挂载操作[^2]。 --- ### 总结 以上介绍了 Vue3 中 `setup()` 的核心概念及其实战技巧,涵盖了从基础知识到高级特性的多个方面。无论是简单的状态管理还是复杂的业务场景,都可以基于 `setup()` 构建高效且优雅的应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值