vue3中的setup方法

news2024/12/23 6:19:34

一、vue2中的定义变量和方法的写法

在介绍v3的setup之前,我们先来看看在v2中是如何定义变量和方法的

<template>
	<h2>姓名:{{name}}</h2>
	<h2>年龄:{{age}}</h2>
	<button @click="sayHello">说话</button>
</template>

<script>
	export default {
		name: 'App',
        data() {
			return {
                name:'张三',
				age:'男',
			}
		},
		methods: {
			sayHello(){
				alert( `你好,我是${this.name}${this.age}岁,很高兴认识你!`)
			},
		},
	}
</script>


在这里插入图片描述
如上面的示例,在v2中我们定义变量要写在data方法中,方法要写在methods中

二、setup简单用法介绍

那么我们用v3中的setup同样完成上面案例,如下:

<template>
	<h2>姓名:{{name}}</h2>
	<h2>年龄:{{age}}</h2>
	<button @click="sayHello">说话</button>
</template>

<script>
	export default {
		name: 'App',
		//此处只是测试一下setup,暂时不考虑响应式的问题。
		setup(){
			//数据
			let name = '张三'
			let age = 18

			//方法
			function sayHello(){
				alert(`你好,我是${name}${age}岁,很高兴认识你!`)
			}

			//返回一个对象(常用)
			return {
				name,
				age,
				sayHello,
			}
		}
	}
</script>


在这里插入图片描述
可以看到,我们只需在setup方法中定义变量和函数,最后通过return将变量和函数暴露出去就可以在template模版中使用了。

就单从写法上而言,是不是感觉v3比v2更简洁呢。v3具有更好的开发体验。

三、setup函数详解

在Vue 3中,setup函数是一个新引入的特殊函数,用于配置组件的使用。

1. setup函数的执行时机

它是组件实例创建之前第一个被执行的函数它还在beforeCreate钩子函数之前被调用

如下示例:

<template>
</template>

<script>
  export default {
    beforeCreate() {
      console.log('beforeCreate');
    },
    setup() {
      console.log('setup函数被调用');
    }
  }
  
</script>

在这里插入图片描述

2.setup函数具有两个参数:props和context。

我们先定义两个组件,一个父组件,一个子组件

  • 子组件TestSetup
<template>
	<h2>姓名:{{person.name}}</h2>
	<h2>年龄:{{person.age}}</h2>
	<button @click="test">测试触发一下Demo组件的Hello事件</button>
</template>

<script>
	import {reactive} from 'vue'
	export default {
		name: 'Demo',
		setup(props,context){
			console.log('---setup---props',props)
			console.log('---setup---',context)
			//数据
			let person = reactive({
				name:'张三',
				age:18
			})

			//方法
			function test(){
				context.emit('hello',666)
			}

			//返回一个对象(常用)
			return {
				person,
				test
			}
		}
	}
</script>


  • 父组件App.vue
<template>
	<test-setup @hello="showHelloMsg" msg="你好啊" hobby="篮球">
		<template v-slot:qwe>
			<span>插槽qwe</span>
		</template>
		<template v-slot:asd>
			<span>插槽asd</span>
		</template>
	</test-setup>
</template>

<script>
	import TestSetup from './components/TestSetup'
	export default {
		name: 'App',
		components:{TestSetup},
		setup(){
			function showHelloMsg(value){
				alert(`你好啊,你触发了hello事件,我收到的参数是:${value}`)
			}
			return {
				showHelloMsg
			}
		}
	}  
</script>


  1. props参数:它是一个响应式的对象,包含了组件接收的所有属性。可以通过解构或直接使用props对象来访问这些属性。

请注意如果你解构了 props 对象解构出的变量将会丢失响应性。因此我们推荐通过 props.xxx 的形式来使用其中的 props。

如果你确实需要解构 props 对象,或者需要将某个 prop 传到一个外部函数中并保持响应性,那么你可以使用 toRefs() 和 toRef() 这两个工具函数:

举例说明:
在上面的父组件中我们传了msg、和hobby两个属性给子组件,这时我们就可以通过setup的props来接收

props:['msg', 'hobby'],
setup(props) {
  const { msg, hobby } = toRefs(props); // 解构属性
  console.log(msg.value); // 直接访问单个属性值
}

打印结果如下:
在这里插入图片描述

  1. context参数:它是一个普通的对象,包含与当前组件有关的一些信息和方法。其中最常用的是attrsemitslots
  • attrs:一个非响应式的对象,包含了未声明为props的所有属性。

举例说明:

props:['msg'],
setup(_, context) {
  console.log('---setup---',context.attrs.hobby) //访问未声明的属性 相当与Vue2中的$attrs
}

在这里插入图片描述

  • emit:用于触发父组件中定义的事件,与Vue 2中的$emit类似。

举例说明:
子组件中context.emit('hello',666)向父组件触发一个方法hello,并将666作为参数传递过去

<template>
	<button @click="test">测试触发一下Demo组件的Hello事件</button>
</template>

<script>
	import {reactive} from 'vue'
	export default {
		emits:['hello'],
		setup(props,context){
			let person = reactive({
				name:'张三',
				age:18
			})

			//方法
			function test(){
				context.emit('hello',666)
			}

			//返回一个对象(常用)
			return {
				person,
				test
			}
		}
	}
  • 父组件App.vue,通过showHelloMsg方法接收
<template>
	<test-setup @hello="showHelloMsg" msg="你好啊" hobby="篮球">
	</test-setup>
</template>

<script>
	import TestSetup from './components/TestSetup'
	export default {
		name: 'App',
		components:{TestSetup},
		setup(){
			function showHelloMsg(value){
				alert(`你好啊,你触发了hello事件,我收到的参数是:${value}`)
			}
			return {
				showHelloMsg
			}
		}
	}  
</script>


在这里插入图片描述

  • slots:用于访问插槽内容。在Vue 2中,插槽内容是通过this.$slots访问的,而在Vue 3中,需要使用context.slots

举例说明:
父组件中传递两个插槽

<template>
	<test-setup>
		<template v-slot:qwe>
			<span>插槽qwe</span>
		</template>
		<template v-slot:asd>
			<span>插槽asd</span>
		</template>
	</test-setup>
</template>

子组件中访问

setup(_, context) {
  console.log('---setup---slots',context.slots) //插槽
}

在这里插入图片描述

综上所述,setup函数是Vue 3中用于配置组件使用的特殊函数,它可以接收propscontext作为参数,并且通过这些参数提供了访问组件属性、上下文相关信息和方法的能力。

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

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

相关文章

openEuler Linux 光驱开启自动挂载

openEuler Linux 光驱开启自动挂载 创建光驱挂载目录 mkdir -p /mnt/cdrom 手动挂载光驱 但是系统重启后挂载失效 mount /dev/cdrom /mnt/cdrom取消光驱挂载 umount /mnt/cdrom光驱开机自动挂载 临时挂载光驱 mount /dev/cdrom /mnt/cdrom编写配置文件/etc/fstab vi /etc/fst…

【Distributed】分布式监控系统zabbix应用

文章目录 前言一、Zabbix基本概述1. Zabbix 的概念2. Zabbix 的工作原理3. Zabbix 6.0 新特性3.1 Zabbix 可以实现高可用3.2 Zabbix 新增监控系统 4. Zabbix 的构成5. Zabbix 的功能组件5.1 数据库5.2 Web 界面5.3 Zabbix Agent5.4 Zabbix Proxy5.5 Java Gateway 6. Zabbix 和 …

【macOS 系列】如何设置macos的软件、app随系统启动

如何设置app随系统启动 有些app可以在内部实现&#xff0c;如果没有&#xff0c;则需要在系统-偏好设置-用户与群组&#xff0c;切换到登录项&#xff0c;然后在下方可以添加或删除开机启动项。

[管理与领导-6]:新任管理第1课:管理转身--从技术业务走向管理,角色的转变

目录 第1章 管理从转变角色开始 1.1 什么是角色 1.2 角色定位 1.3 技术型与管理型人才差别&#xff1a;六大转变 1.4 不同角色的人能力要求 第2章 管理从定位角色迈步&#xff1a;管理者的四位 2.1 定位 2.1.1 辅助者 2.1.2 教练&#xff1a;以身作则&#xff0c;带领…

【数据结构与算法】树和二叉树课后习题

题目 题目1 知一棵树边的集合为 < I , M > , < I , N > , < E , I > , < B , E > , < B , D > , < A , B > , < G , J > , < G , K > , < C , G > , < C , F > , < H , L > , < C , H > , < A …

财务凭证替代退出类型不正确几个问题汇总

财务凭证替代退出类型不正确几个问题汇总 以上资料均来自网络&#xff0c;纯粹个人工作记录&#xff0c;如有意见请联系删除。 1、两种类型含义 c_exit_param_class. 传参数 代表完全凭证替代 c_exit_param_none. 不传参数 代表行项目替代 exits-name ‘ZFI27’. " …

wpf中DialogResult.Yes方法报错

原因&#xff1a;在WPF里DialogResult没有Yes或No的枚举取值了 所以应该这样写 private void Button_Click(object sender, RoutedEventArgs e) {   if (MessageBox.Show ("要退出程序吗?", "退出程序",MessageBoxButton.YesNo ) MessageBoxResult.Y…

MySQL数据库概述

文章目录 SQL语言的特点SQL的组成部分数据库基本概念数据库性质数据库系统数据库系统的组成部分数据库发展简史 SQL语言的特点 &#xff08;1&#xff09;功能一体化 &#xff08;2&#xff09;高度非过程化 &#xff08;3&#xff09;面向集合的操作方式 &#xff08;4&am…

企业利用bi商业智能工具有哪些改变呢?以瓴羊QuickBI为例

当下的趋势是数字化已经成为一股不可抗拒的力量&#xff0c;推动着全球各国社会经济的发展。在数字经济中&#xff0c;数据是核心基础&#xff0c;包括数据的收集、整合、分析和应用等各个方面。为了充分挖掘数据的价值&#xff0c;各种相关技术近年来得到了迅猛发展。在这些技…

MFC管理系统

文章目录 登录设置登录界面登录用户判断 界面设计嵌入对话框 添加列表添加员工添加按钮 完成添加员工删除员工修改员工信息修改 完成修改员工保存数据打开时显示读取内容全部代码 登录 设置登录界面 初始化窗口实列 添加控件变量 登录用户判断 void CLoginDlg::OnBnClickedB…

C语言程序环境和预处理

本章主要以图片和文字的形式给大家讲解 程序的翻译环境和程序的执行环境 在ANSI C的任何一种实现中&#xff0c;存在两个不同的环境。 第1种是翻译环境&#xff0c;在这个环境中源代码被转换为可执行的机器指令。 第2种是执行环境&#xff0c;它用于实际执行代码 2. 详解编译…

visio常用功能

1.常规对象&#xff0c;鼠标左键操作进行旋转、下图旋转柄是鼠标左键拖动可以任意改变方向&#xff0c;改变大小&#xff08;长度、宽度、等比例&#xff09;。 2.注意&#xff1a;用大小和位置定量改变形状的大小和角度 在选中形状对象后&#xff0c;页面底部会出现该形状的大…

【Spring Boot】Spring Boot日志详情:基于lombok的日志输出

文章目录 1. 何为日志文件&#xff1f;2. 日志文件的作用3. 日志文件的基本使用3.1 Spring Boot中的日志3.2 自定义日志打印 4 日志级别4.1 日志级别的作用4.2 日志级别的分类4.3 日志级别的设置 5 日志持久化6 基于lombok的日志输出6.1 lombok 简单输出日志案例6.2 浅谈 lombo…

如果遇到洪灾导致网络瘫痪,对讲机能起到什么作用?

当我们遇到洪灾这种突发事件时&#xff0c;网络基本就会处于瘫痪状态&#xff0c;人们的安全和生命也将面临着极大的威胁。而在这种时候&#xff0c;一种看似普通的通讯工具&#xff0c;却能够成为拯救生命的关键&#xff0c;它就是——对讲机&#xff01; 网络已经成为我们生…

使用3D Slicer进行图像配准

在3D Slicer官网上&#xff08;https://www.slicer.org/&#xff09;下载最新版本的软件 下载完成后按照指示安装软件&#xff0c;并在安装目录下打开软件 打开后在插件市场搜索并安装需要的配准插件 安装完成后重新打开软件&#xff0c;进行图像配准操作&#xff0c;首先需…

FreeRTOS ~(四)同步互斥与通信 ~ (1/3)同步的缺陷

举例子说明&#xff1a;同步的缺陷 首先创建两个任务&#xff1a;Task1和Task2; 让Task1执行一个比较耗时的计算,计算完成之后,通知Task2; Task1&#xff1a;求和,sum,累加10000000次,然后标志位置1 Task2&#xff1a;检测到标志位置1,打印sum值 为了可以在逻辑分析仪上更准确…

Kibana的对索引库的操作(2)

使用Kibana对文档操作 1.新增文档 新增文档并随机生成id: POST /索引库名/类型名{"key","value"} 新增文档并自定义id:POST /索引库名/类型名/id值 {"key","value"} 2.查看文档 如果查询的文档不存在则返回false 3.修改文档 这里需…

【Telephony】SIM单卡到双卡的变化

1、注册观察者 --> PhoneFactory.makeDefaultPhones() --> TelephonyComponentFactory.makeSubscriptionInfoUpdater() --> new SubscriptionInfoUpdater() --> PhoneConfigurationManager.registerForMultiSimConfigChange(this, EVENT_MULTI_SIM_CONFIG_CHAN…

linux下载安装jdk

1、一般linux系统会自带jdk&#xff0c;执行搜索命令&#xff0c;会查询到不同版本jdk。 2、执行yum install java-1.8.0-openjdk 命令下载对应版本jdk 3、java -version 验证

charles 如何获取电脑端微信小程序接口

安装证书 设置代理端口 即可抓取美团酒店小程序的数据 从charles 可以抓取出header 请求&#xff0c;没有所谓的通过遍历循环能简单的得到数据&#xff0c;请求包含加密信息 随便改下数据就是 所以如果要得到这些数据&#xff0c;还非得通过小程序模拟人滑动获取数据&…