vue3 setup() 高级用法

文章目录

  • 前言
  • 一、选项式API 和 组合式API 区别
    • 用一张图告诉你它们的区别:
  • 二、setup 具体怎么用?
    • 2.1、setup 什么时候执行?
    • 2.2、setup 数据和方法如何使用?
    • 2.3、setup 内部有 this 吗?
    • 2.4、setup 内钩子函数如何使用?
    • 2.5、setup与钩子函数关系
  • 三、setup 参数
    • 3.1、props
    • 3.2、context
  • 四、setup 特性总结
  • 参考文章


前言

从 vue2 升级到 vue3,vue3 是可以兼容 vue2 的,所以 vue3 可以采用 vue2 的选项式API。由于选项式API一个变量存在于多处,如果出现问题时,就需要去多个函数内检查,项目较大时,遇到问题,增加排故的难度。所以 vue3 中新增了 setup 配置项,用它来写组合式API。


一、选项式API 和 组合式API 区别

稀里糊涂用了vue一年了,竟然不知道选项式api !

vue2 中的Options API 就是选项式api,一个中文,一个英文,怎么叫都可以。

在一个 vue 文件内,会有 data、methods、mounted、computed、watch 等等用来定义属性和方法,共同来处理页面逻辑,我们把这种方式称为 Options API。

Vue3 的 Composition API 就是组合式api。

组合式api 就是一个功能所定义的 api 会放在一起,这样子即使项目变大,功能增大,我们能够很快找到功能相关的所有api,不像 Options API 功能分散,需要改动时,需要多处查找过程比较困难。

用一张图告诉你它们的区别:

在这里插入图片描述


二、setup 具体怎么用?

2.1、setup 什么时候执行?

setup 用来写组合式 api,从生命周期钩子函数角度分析,相当于取代了 beforeCreate 。会在 creted 之前执行。

2.2、setup 数据和方法如何使用?

<template>
	{{a}}
</template>
<script> 
	export default{  
	setup(){   
		const a = 0  } 
	}
</script>

运行后发现结果异常:runtime-core.esm-bundler.js?5c40:6584 [Vue warn]: Property "a" was accessed during render but is not defined on instance.

提示我们访问的属性 a 并没有挂载到实例上。

setup 内部的属性和方法,必须 return 暴露出来,将属性挂载到实例上,否则没有办法使用,上述代码添加 return:

<script>
export default {
  setup() {
    const a = 0
    return {a}
  }
}
</script>

2.3、setup 内部有 this 吗?

自己在 setup 中打印下 this ,返回结果 是undefined 。说明在 setup 内部是不存在 this ,不能挂载 this 相关的东西。

2.4、setup 内钩子函数如何使用?

vue3 是可以兼容 vue2 的选项式写法,所以 钩子函数可以与 setup 并列存在,就相当于 Options API。

export default{ 
	setup(){  console.log('setup'); }, 
	mounted(){  console.log('mounted'); }
}

vue3 新增的 setup() 函数用来写组合式 api,所以不建议这样写代码。所以需要使用 onXXX 一族的函数来注册钩子函数,注册成功之后调用时传递的是一个回调函数。

import { onMounted } from "vue";
export default{ 
	setup(){  const a = 0  return{   a  },  
	onMounted(()=>{   console.log("执行"); }) }
}

注册的这些生命周期钩子函数只能在 setup 期间同步使用,因为它们依赖全局内部状态来定位当前组件实例,不在当前组件下调用函数时会抛出错误。

其他的钩子函数是一样的,根据需要引入就好了。

2.5、setup与钩子函数关系

setup 与钩子函数并列时,setup 不能调用生命周期相关函数,但生命周期可以调用 setup 相关的属性和方法。

<template>
  <button @click="log">点我</button>
</template>
<script>export default {
  setup() {
    const a = 0
    return {a}
  },
  methods: {
    log() {
      console.log(this.$options.setup())
    }
  }
}
</script>

this.$options.setup() 返回的是一个大对象,该对象内包含了 setup 内的所有属性和方法。


三、setup 参数

使用setup 时,它将接收两个参数:props 和 context

3.1、props

第一个参数是 props ,表示父组件给子组件传值,props 是响应式的,当传入新的 props 时,自动更新。

export default{ 
props: {  msg: String,  ans: String, }, 
  setup(props,context){  
  console.log(props);
  }
}

因为 props 是响应式的,不能使用 ES6 解构,会消除prop的响应特性,此时需要借用 toRefs 解构。

import { toRefs } from "vue"; 
export default{  
	props: {   msg: String,   ans: String,  },  
	setup(props,context){   
		console.log(props);   
		const { msg,ans } = toRefs(props)   
		console.log(msg.value);  
	}
}

使用组件时,经常会遇到可选参时,有些地方需要传递某个值,有些时候不需要,该如何处理呢?

如果 ans 是一个可选参数,则传入 props 中可能没有 ans 。在这种情况下 toRefs 将不会为 ans 创建一个 ref ,需要使用 toRef 代替它。

import { toRef } from "vue";setup(props,context){ let ans  = toRef(props ,'ans')// 不存在时,创建一个ans console.log(ans.value);}

3.2、context

context 上下文环境,其中包含了 属性、插槽、自定义事件三部分。

setup(props,context){ 
const { attrs,slots,emit } = context 
}

attrs 是一个非响应式对象,主要接收 no-props 属性,经常用来传递一些样式属性。

slots 是一个 proxy 对象,其中 slots.default() 获取到的是一个数组,数组长度由组件的插槽决定,数组内是插槽内容。

setup 内不存在this,所以 emit 用来替换 之前 this.$emit 的,用于子传父时,自定义事件触发。

<template>
  <div :style="attrs.style">
    <slot></slot>
    <slot name="hh"></slot>
    <button @click="emit('getVal','传递值')">子向父传值</button>
  </div>
</template>
<script>
import {toRefs, toRef} from "vue";
export default {
  setup(props, context) {
    const {
      attrs,
      slots,
      emit
    } = context
  }
</script>


四、setup 特性总结

1、这个函数会在 created 之前执行,上述已解释。

2、setup 内部没有 this,不能挂载 this 相关的东西。

3、setup 内部的属性和方法,必须 return 暴漏出来,否则没有办法使用。

4、setup 内部数据不是响应式的。

5、setup不能调用生命周期相关函数,但生命周期函数可以调用setup内的函数。


参考文章

前端人

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

进博会再现上亿大单 EZZ携手HIC海橙嗨选签署2024年度合作备忘录

正在举行的第六届中国国际进口博览会上&#xff0c;再现上亿大单。11月6日&#xff0c;在澳大利亚新南威尔士州政府代表的见证下&#xff0c;澳交所基因组龙头上市公司EZZ生命科学和中国跨境社交电商龙头HIC海橙嗨选签署2024合作备忘录&#xff0c;在未来的一年&#xff0c;EZZ…

分类预测 | Matlab实现PSO-GRU粒子群算法优化门控循环单元的数据多输入分类预测

分类预测 | Matlab实现PSO-GRU粒子群算法优化门控循环单元的数据多输入分类预测 目录 分类预测 | Matlab实现PSO-GRU粒子群算法优化门控循环单元的数据多输入分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 Matlab实现PSO-GRU粒子群算法优化门控循环单元的数据多…

【算法每日一练]-单调队列(保姆级教程 篇2)#琪露诺 #选数游戏 #寻找段落

最后一期单调队列了啊 目录 题目&#xff1a;琪露诺 思路&#xff1a; 题目&#xff1a;选数游戏 思路&#xff1a; 题目&#xff1a;寻找段落 思路&#xff1a; 之前做的都是连续的长度区间求最值&#xff0c;今天体验一下不连续的区间。 然后就是要注意维护单调队列时…

说说你对immutable的理解?如何应用在react项目中?

一、是什么 Immutable,不可改变的,在计算机中,即指一旦创建,就不能再被更改的数据 对 Immutable对象的任何修改或添加删除操作都会返回一个新的 Immutable对象 Immutable 实现的原理是 Persistent Data Structure(持久化数据结构): 用一种数据结构来保存数据当数据被修…

1.jvm基本知识

目录 概述jvm虚拟机三问jvm是什么&#xff1f;java 和 jvm 的关系 为什么学jvm怎么学习为什么jvm调优?什么时候jvm调优调优调什么 结束 概述 相关文章在此总结如下&#xff1a; 文章地址jvm类加载系统地址双亲委派模型与打破双亲委派地址运行时数据区地址 jvm虚拟机三问 j…

OpenCV:图像矫正与仿射变换

人工智能的学习之路非常漫长&#xff0c;不少人因为学习路线不对或者学习内容不够专业而举步难行。不过别担心&#xff0c;我为大家整理了一份600多G的学习资源&#xff0c;基本上涵盖了人工智能学习的所有内容。点击下方链接,0元进群领取学习资源,让你的学习之路更加顺畅!记得…

Java_常用API

API(全称Application Programming Interface:应用程序编程接口) String 常用方法 注意事项 每一次试图改变字符串对象都产生了新的字符串对象 ArrayList 常用方法 ATM系统 01系统架构搭建、欢迎页设计 02开户功能实现 03登录功能实现 04操作页展示、查询账户、退出账户 05存…

笔尖笔帽检测1:笔尖笔帽检测数据集(含下载链接)

笔尖笔帽检测1&#xff1a;笔尖笔帽检测数据集(含下载链接) 目录 笔尖笔帽检测1&#xff1a;笔尖笔帽检测数据集(含下载链接) 1. 前言 2. 手笔检测数据集 &#xff08;1&#xff09;Hand-voc1 &#xff08;2&#xff09;Hand-voc2 &#xff08;3&#xff09;Hand-voc3 …

Allegro层叠中的Etch Factor-铜皮的腐蚀因子如何计算

Allegro层叠中的Etch Factor-铜皮的腐蚀因子如何计算 在用Allegro进行PCB设计的时候,Cross-section中需要填入对应的信息,一般填入每层的厚度即可,如下图 当PCB需要进行仿真分析的时候,Etch-Factor这个值是必须要填写的,如下图 目前看到的都是90这个值,这是一个理论值。 …

iOS群控手机App的开发难点是什么?

随着智能手机的普及&#xff0c;手机App已经成为我们生活中不可或缺的一部分&#xff0c;在众多手机操作系统中&#xff0c;iOS系统因其封闭性、安全性和流畅性而备受用户青睐&#xff0c;然而&#xff0c;开发一款针对iOS系统的手机App却并非易事。 一、开发语言与框架 iOS系…

【IDE】【实战系列】掌握这些技巧发现阅读源码不过如此简单

文章目录 IDE 版本前言IDE Debug主界面介绍字段断点&#xff08;field breakpoints&#xff09;使用方式配置EnabledSuspendLog 行断点&#xff08;line breakpoints&#xff09;使用方式配置方式 方法断点&#xff08;method breakpoints&#xff09;使用方式配置方式 异常断点…

datax 搭建使用

文章目录 datax 环境搭建使用一、解压文件二、配置 json 文件三、执行命令 datax 环境搭建使用 用于全量同步 一、解压文件 将包上传至服务器 输入命令&#xff1a; tar -zxvf datax.tar.gz -C /opt/module/ 将包 解压到 /opt/module 目录 解压完之后&#xff0c;不需要任何…

在线教育与跨境电商:数字时代的知识传播

随着数字技术的不断发展和全球互联网的普及&#xff0c;在线教育和跨境电商在数字时代崭露头角&#xff0c;共同推动了知识的全球传播。 这两个领域的结合为学生、教育者和知识提供者创造了新的机遇和可能性&#xff0c;同时也带来了一系列有趣的挑战。本文将深入探讨在线教育…

【01】Istio-1.17 部署

1.1 部署Istio控制平面 部署方法 istioctl istio的专用管理工具&#xff0c;支持定制控制平面和数据平面通过命令行的选项支持完整的IstioOperator API命令行各选项可用于单独设置&#xff0c;以及接收包含IstioOperator自定义资源(CR)的yaml文件 Istio Operator Istio相关的自…

linux 安装 mini conda,linux下安装 Miniconda

下载地址 https://docs.conda.io/projects/miniconda/en/latest/index.html 安装conda mkdir -p ~/miniconda3 wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda3/miniconda.sh bash ~/miniconda3/miniconda.sh -b -u -p ~/mini…

数据结构上机实验——图的实现(以无向邻接表为例)、图的深度优先搜索(DFS)、图的广度优先搜索(BFS)

文章目录 数据结构上机实验1.要求2.图的实现&#xff08;以无向邻接表为例&#xff09;2.1创建图2.1.1定义图的顶点、边及类定义2.1.2创建无向图和查找2.1.3插入边2.1.4打印函数 2.2图的深度优先搜索&#xff08;DFS&#xff09;2.3图的广度优先搜索&#xff08;BFS&#xff09…

C/C++ #define与编译器的预处理

文章目录 预处理#define新版本特性旧版本特性#define除了定义明示常量的其他用途 #define的组成#define本身&#xff1a;预处理指令宏替换列表或替换体宏展开 参考资料 预处理 在预处理之前&#xff0c;编译器必须对该程序进行一些翻译处理。首先&#xff0c;编译器 把源代码中…

WampServer下载安装并结合内网穿透实现本地服务的公网访问

文章目录 前言1.WampServer下载安装2.WampServer启动3.安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4.固定公网地址访问 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的 人工智能学习网站&#xff0c;…

【Kettle实战】数据分批处理及参数化传递子作业任务

对于大表操作&#xff0c;本来离线数据需要分批处理&#xff0c;刚开始只会用具体日期去做&#xff0c;通过复制多分转换和作业来处理。当日期范围大了后&#xff0c;这是个苦力活儿&#xff0c;kettle里面有参数化传递功能&#xff0c;多动手实操&#xff0c;懂得灵活变通自然…

宝塔开心版hostcli的广告去除

首先感谢hostcli把宝塔7.6剥离了&#xff0c;直接安装我这里是缺少pyenv的包。 直接进入正题吧。 定位到页面左下方的广告位于 /www/server/panel/BTPanel/templates/default/layout.html “退出”按钮下方有条线开始去掉 去掉之前的忘了截图了&#xff0c;就这样吧&#xff…