vue3 组合式 API:setup()

news2024/11/17 1:27:43

查看vue3官网介绍:组合式 API:setup()

在 Vue 3 中,组合式 API 的 setup() 函数是一个非常重要的特性,它提供了一种更灵活和可维护的方式来组织组件的逻辑。

基本概念

setup() 函数是在组件实例创建之前执行的,它用于组合组件的逻辑,包括响应式数据、方法、计算属性、监听等。它接收两个参数:propscontext,并返回一个对象,其中包含可以在组件模板中使用的属性和方法。

特点

  • setup函数返回的对象中的内容,可直接在模板中使用。
  • setup中访问thisundefined
  • setup函数会在beforeCreate之前调用,它是“领先”所有钩子执行的。

示例:

<template>
  <div>
    <div>姓名:{{name}}</div>
    <div>年龄:{{age}}</div>
    <button @click="changeName">修改名字</button>
    <button @click="changeAge">修改年龄</button>
  </div>
</template>
<script lang="ts">
export default {
  name: 'Person',
  setup() {
  	console.log(this);  // undefined
    // 数据(在setup中直接声明变量,此时的name、age、tel都不是响应式的数据)
    // 注意:直接声明变量,数据不是响应式的。
    let name = '张三'
    let age = 36

    // 方法
    function changeName() {
      console.log('change name')
      name = 'John'  // 这样修改name,页面是不会响应的
      console.log('changed name: ' + name); // changed name: John
      //  成功修改 name ,但是页面没有响应
    }
    function changeAge() {
      age--
      console.log(age);
      // 成功修改 age ,但是页面没有响应
    }
    // 将数据、方法暴露出去,模板中才可以使用
    return { name, age, changeName, changeAge}
  }
}
</script>

setup函数的返回值

  • 若返回一个对象:则对象中的:属性、方法等,在模板中均可以直接使用。
  • 若返回一个函数:则可以自定义渲染内容。代码如下:
// 不论页面模板是什么样,直接渲染返回的内容
setup(){
  return ()=> 'vue3起飞!'
}

与选项式API的区别

  • setup 与 选项式API可以在vue3项目中同时存在。
  • 选项式API(如 datamethodscomputed 等)中可以访问到 setup中的属性、方法。
    但在setup中不能访问到选项式API(如 datamethodscomputed 等)。
    • 在选项式 API 中可以访问到 setup 中定义的属性和方法,这是因为 Vue 在处理组件时,会先执行 setup 函数,然后将其返回值与选项式 API 的内容进行合并,最终形成组件的实例。
    • setup 函数中不能直接访问选项式 API(如 datamethodscomputed 等),这是因为 setup 函数在组件实例创建之前执行,此时选项式 API 的内容还未被处理和合并到组件实例中。
  • 如果与选项式API冲突,则setup优先。
    • setup 的执行优先级更高,setup 返回的属性会覆盖选项式 API 中同名的属性。

示例:

<template>
  <div>
    <div>姓名:{{name}}</div>
    <div>年龄:{{age}}</div>
    <button @click="changeName">修改名字</button>
    <button @click="changeAge">修改年龄</button>

    <br />

    <div>选项式API data 里的数据:{{ otherName }}</div>
    <div>选项式API data 里读取setup函数中声明的变量: {{ setupName }}</div>
    <button @click="handleShow">选项式API methods 定义的方法:点击显示消息</button>
  </div>
</template>
<script lang="ts">
export default {
  name: 'Person',
  data() {
    return {
      otherName: '李四',
      setupName: this.name
    }
  },
  methods: {
    handleShow() {
      alert('点击了啊啊啊啊啊')
    }
  },
  setup() {
  	console.log(this);  // undefined
    // 数据(在setup中直接声明变量,此时的name、age、tel都不是响应式的数据)
    // 注意:直接声明变量,数据不是响应式的。
    let name = '张三'
    let age = 36

    // 方法
    function changeName() {
      console.log('change name')
      name = 'John'  // 这样修改name,页面是不会响应的
      console.log('changed name: ' + name); // changed name: John
      //  成功修改 name ,但是页面没有响应
    }
    function changeAge() {
      age--
      console.log(age);
      // 成功修改 age ,但是页面没有响应
    }
    // 将数据、方法暴露出去,模板中才可以使用
    return { name, age, changeName, changeAge}
  }
}
</script>

在这里插入图片描述

与传统的选项式 API(如 datamethodscomputed 等)相比,组合式 API 更加灵活和可组合。它允许将相关的逻辑封装在函数中,提高了代码的复用性和可读性。同时,组合式 API 也更好地支持 TypeScript,提供了更好的类型推断和代码提示。

setup 语法糖

在 Vue 3 中,<script setup>是一种语法糖,它极大地简化了组合式 API 的使用方式。

<script setup>语法糖,可以把setup独立出去:
在 Vue 组件中,使用<script setup>标签来代替传统的<script>标签。
<script setup>中,不需要使用传统的export default语法来包裹组件的逻辑。可以直接定义响应式数据、计算属性、方法等,并且这些定义会自动暴露给模板使用(不需要return语句来暴露数据、方法)。

把上面例子中的setup函数改为<script setup>语法糖:

<script setup lang="ts">
console.log(this) // undefined
// 数据(在setup中直接声明变量,此时的name、age、tel都不是响应式的数据)
// 注意:直接声明变量,数据不是响应式的。
let name = '张三'
let age = 36

// 方法
function changeName() {
  console.log('change name')
  name = 'John' // 这样修改name,页面是不会响应的
  console.log('changed name: ' + name) // changed name: John
  //  成功修改 name ,但是页面没有响应
}
function changeAge() {
  age--
  console.log(age)
  // 成功修改 age ,但是页面没有响应
}
</script>

注意:用<script setup>改写setup函数后,现在有两个 <script> 标签:

  • 一个用于使用组合式 API 的 <script setup>
  • 一个用于传统的选项式 API 和组件配置:
<script lang="ts">
export default {
  name: 'Person'
}
</script>

这个<script> 标签目前只用来配置组件的名称。

是否可以在<script setup>标签上写组件的名称呢?

插件vite-plugin-vue-setup-extend

vite-plugin-vue-setup-extend是一个用于增强 Vue 3 在 Vite 项目中使用<script setup>语法的插件。

在 插件vite-plugin-vue-setup-extend 中,有更详细的用法示例。

安装插件:

npm i vite-plugin-vue-setup-extend -D

vite.config.js文件中,引入并使用该插件:

import VueSetupExtend from 'vite-plugin-vue-setup-extend'
// https://vitejs.dev/config/
export default defineConfig({
  plugins: [
    vue(),
    VueSetupExtend(),
  ]
})

修改<script setup>标签:

<script setup lang="ts" name="Person">
<script>

参数介绍

setup() 函数接收两个参数:propscontext:

  • props:包含了父组件传递给当前组件的属性。可以通过解构赋值的方式获取特定的属性。
  • context:包含了一些与组件相关的上下文信息,如 attrsslotsemit 等。可以通过解构赋值的方式获取特定的上下文信息。

示例:

<script setup lang="ts">
// defineProps 用于定义组件接收的父组件传递过来的属性(props)。
// defineExpose 用于明确指定哪些属性和方法可以在组件外部被访问。
import { defineProps, defineExpose } from 'vue';

// 定义props
// 通过 defineProps 返回的对象可以访问到父组件传递过来的这个属性的值。
const props = defineProps({
  message: String
});

console.log(props.message);

// defineEmits 用于定义组件可以触发的自定义事件。
// 这里定义了一个名为 customEvent 的自定义事件。
const emit = defineEmits(['customEvent']);

// customMethod 是一个方法,当这个方法被调用时,
// 会触发 customEvent 事件,并传递 'some data' 作为事件参数。
const customMethod = () => {
  emit('customEvent', 'some data');
};

// 通过 defineExpose 指定了组件外部可以访问的内容。
// 这里只暴露了 customMethod 方法,在父组件或者其他组件中可以调用这个方法,
// 但不能直接访问组件内部的其他未暴露的属性和方法。
defineExpose({
  customMethod
});
</script>

返回值

  1. 响应式数据:可以在 setup() 函数中使用 refreactive 函数来创建响应式数据。这些数据可以在组件模板中使用,并且会自动更新视图。

示例:

<template>
   <div>
     <p>Count: {{ count }}</p>
     <button @click="increment">Increment</button>
   </div>
</template>
<script setup lang="ts">
 import { ref } from 'vue';

 const count = ref(0);

 const increment = () => {
   count.value++;
 };
 </script>
  1. 计算属性:可以在 setup() 函数中使用 computed 函数来创建计算属性。计算属性是基于响应式数据计算得到的值,并且会自动更新。

示例:

<template>
  <div>
    <p>Full Name: {{ fullName }}</p>
  </div>
</template>
<script setup lang="ts">
import { ref, computed } from 'vue';

const firstName = ref('John');
const lastName = ref('Doe');

const fullName = computed(() => `${firstName.value} ${lastName.value}`);
</script>
  1. 方法:可以在 setup() 函数中定义普通的函数,这些函数可以在组件模板中使用。

示例:

<template>
  <div>
    <p>Count: {{ count }}</p>
    <button @click="increment">Increment</button>
    <button @click="decrement">Decrement</button>
  </div>
</template>
<script setup lang="ts">
import { ref } from 'vue';

const count = ref(0);

const increment = () => {
  count.value++;
};

const decrement = () => {
  count.value--;
};
</script>

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

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

相关文章

重复玩一个游戏就是自闭症吗?自闭的特征有哪些?

重复玩一个游戏并不一定是自闭症的标志。儿童在成长过程中&#xff0c;有时会因为对某个游戏或活动的喜爱而反复进行&#xff0c;这是他们探索世界、发展兴趣和技能的一种方式。然而&#xff0c;如果这种行为伴随着其他自闭症的典型特征&#xff0c;如语言障碍、社交障碍和兴趣…

C语言 ——— 修改默认对齐数以及结构传参

目录 前言 修改默认对齐数 结构体传参 前言 在上一篇中&#xff0c;有讲解到结构体内存对齐的规则以及默认对齐数 C语言 ——— 结构体内存对齐-CSDN博客 修改默认对齐数 修改默认对齐数所需要的宏命令&#xff1a;#pragma 代码演示&#xff1a; #pragma pack(1) // 将默…

MVCC工作原理深入解析

一、事务概述 mysql事务是指一组命令操作&#xff0c;在执行过程中用来保证要么全部成功&#xff0c;要么全部失败。事务是由引擎层面来支持的&#xff0c;MyISM引擎不支持事务&#xff0c;InnoDB引擎支持事务。 事务具有ACID四大特性 原子性&#xff08;Atomicity&#xff0…

XSS靶场(1-11关)

目录 简述xss xss第1关 xss第2关 ​编辑 xss第3关 xss第4关 xss第5关过滤了 on script xss第6关 xss第7关 xss第8关 xss第9关 xss第10关 xss11关 我把源代码靶场放到了最顶端 简述xss XSS攻击通常指的是通过利用网页开发时留下的漏洞&#xff0c;通过巧妙的方法…

【数据结构与算法 | 图篇】最小生成树之Prim算法

1. 前言 普里姆算法&#xff08;Prims Algorithm&#xff09;是一种用于寻找加权无向图中的最小生成树&#xff08;Minimum Spanning Tree, MST&#xff09;的贪心算法。 最小生成树是指对于一个给定的无向图&#xff0c;连接所有顶点且边的总权重最小的生成树。 2. 算法步骤 …

Spring Boot 核心配置

一、 Spring Boot配置文件分类 SpringBoot是基于约定的&#xff0c;所以很多配置都有默认值&#xff0c;但如果想使用自己的配置替换默认配置的话&#xff0c;就可以使用application.properties或者application.yml&#xff08;application.yaml&#xff09;进行配置 applicat…

外贸市场开发【越南】

​作为“新兴之秀” 越南的经济发展可谓是突飞猛进 并在2022年&#xff0c;成为全亚洲经济增长最快速经济体 经济的增长也让越南的地位变得不一样了 一起来看看外贸人聚焦的东南亚排名前五的越南 越南社会主义共和国&#xff0c;通称越南&#xff0c;是位于东南亚的中南半岛…

谷粒商城实战笔记-213-商城业务-认证服务-整合短信验证码服务

文章目录 一&#xff0c;开通阿里云云市场短信服务1&#xff0c;阿里云开通免费短信服务并调试2&#xff0c;整合短信服务2.1 下载HttpUtils代码2.2 开发调用短信服务的组件2.3 测试 HttpUtils代码 这一节主要内容是整合短信发送服务。 一&#xff0c;开通阿里云云市场短信服务…

多输入多输出 | Matlab实现CPO-BP冠豪猪优化算法优化BP神经网络多输入多输出预测

多输入多输出 | Matlab实现CPO-BP冠豪猪优化算法优化BP神经网络多输入多输出预测 目录 多输入多输出 | Matlab实现CPO-BP冠豪猪优化算法优化BP神经网络多输入多输出预测预测效果基本介绍程序设计往期精彩参考资料 预测效果 基本介绍 多输入多输出 | Matlab实现CPO-BP冠豪猪优化…

CUDA-MODE课程笔记 第6课: 如何优化PyTorch中的优化器

我的课程笔记&#xff0c;欢迎关注&#xff1a;https://github.com/BBuf/how-to-optim-algorithm-in-cuda/tree/master/cuda-mode CUDA-MODE课程笔记 第6课: 如何优化PyTorch中的优化器 课程内容 上面三张Slides讲述了运行时间&#xff08;runtime&#xff09;和内存使用&…

ChatGPT 3.5/4.0 新手使用手册(详细版)

1. 什么是 ChatGPT&#xff1f; ChatGPT是由 OpenAI 开发的先进人工智能语言模型&#xff0c;能够理解并生成自然语言文本。它可以帮助你进行写作、回答问题、提供建议&#xff0c;甚至参与对话。ChatGPT 3.5 和 4.0 是两个不同版本&#xff0c;它们都拥有强大的语言处理能力&…

sublime text 4 安装(含激活码)安装破解汉化 Sublime Text 4 的操作指南

sublime text 4 安装&#xff08;含激活码&#xff09; 一、下载步骤 官网地址&#xff1a;Sublime Text - the sophisticated text editor for code, markup and prosehttps://link.zhihu.com/?targethttps://www.sublimetext.com/ windows下载链接&#xff1a;Thank You -…

【数据结构算法经典题目刨析(c语言)】使用数组实现循环队列(图文详解)

&#x1f493; 博客主页&#xff1a;C-SDN花园GGbond ⏩ 文章专栏&#xff1a;数据结构经典题目刨析(c语言) 目录 一.题目描述 二.解题思路 1.循环队列的结构定义 2.队列初始化 3.判空 4.判满 5.入队列 6.出队列 7.取队首元素 8.取队尾元素 三.完整代码实…

【Datawhale AI夏令营第四期】魔搭-AIGC方向 Task03笔记 原神风格Lora尝试 ComfyUI Lora微调 补充选学内容

【Datawhale AI夏令营第四期】魔搭-AIGC方向 Task03笔记 原神风格Lora尝试 ComfyUI Lora微调 首先我们继续推进网课进度。 https://space.bilibili.com/1069874770 传送门 WorldArt锦书产品介绍&#xff1a; 我属实是没想到这个产品居然还可以用作遗迹鉴定和名家笔记仿写这样…

2.2算法的时间复杂度与空间复杂度——经典OJ

本博客的OJ标题均已插入超链接&#xff0c;点击可直接跳转~ 一、消失的数字 1、题目描述 数组nums包含从0到n的所有整数&#xff0c;但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗&#xff1f; 2、题目分析 &#xff08;1&#xff09;numsS…

Java流程控制之循环结构(附案例说明)超详细

循环结构&#xff1a;根据循环条件&#xff0c;重复性执行某段代码 for循环 while 循环 do-while 循环 凡是循环 就有4个要素&#xff1a; 1、初始化要素2、循环条件&#xff08;一定是boolean类型的变量或表达式&#xff09; 3、循环体 4、迭代部分 for 循环格式 for(1;2;…

阿里声音项目Qwen2-Audio的部署安装,在服务器Ubuntu22.04系统——点动科技

阿里声音项目Qwen2-Audio的部署安装&#xff0c;在服务器Ubuntu22.04系统——点动科技 一、ubuntu22.04基本环境配置1.1 更换清华Ubuntu镜像源1.2 更新包列表&#xff1a;2. 安装英伟达显卡驱动2.1 使用wget在命令行下载驱动包2.2 更新软件列表和安装必要软件、依赖2.2 卸载原有…

JAVA学习之知识补充(下)

六&#xff1a;File类与IO流&#xff1a; 这里给出三种常见的初始化方法&#xff1a; 通过文件路径初始化: File file new File("C:/example/test.txt");这种方法用于创建一个文件对象&#xff0c;该文件对象表示指定路径的文件或目录。例如&#xff1a;File fil…

Zookeeper服务注册及心跳机制详解

ZooKeeper提供了一种类似于文件目录的结构来保存key值&#xff0c;其提供了四种key类型&#xff0c;分别是持久节点&#xff0c;临时节点&#xff0c;持久有序节点&#xff0c;临时有序节点。其中临时节点的特性是当创建此节点的会话断开时&#xff0c;节点也会被删除。这一特性…

xss.function靶场(easy)

文章目录 第一关Ma Spaghet!第二关Jefff第三关Ugandan Knuckles第四关Ricardo Milos第五关Ah Thats Hawt第六关Ligma第七关Mafia第八关Ok, Boomer 网址&#xff1a;https://xss.pwnfunction.com/ 第一关Ma Spaghet! 源码 <!-- Challenge --> <h2 id"spaghet&qu…