十一、组合API(1)

news2025/1/18 18:49:54

本章概要

  • 为什么要引入组合API
  • setup() 函数

组合(Composition)API 是在 Vue 3.0 中引入的,它是一组附加的、基于函数的 API ,允许灵活地组合组件逻辑。
组合 API 并没有引入新的概念,更多地是将 Vue 的核心功能(如创建和观察响应状态)公开为独立函数,以此来代替 Vue 2.x 中的表达组件逻辑的选项。

11.1 为什么要引入组合API

使用 Vue 构建中小型应用程序是很容易,但随着 Vue 逐渐被开发人员所认可,许多用户开始使用 Vue 构建大型项目,这些项目由一个多名开发人员组成的团队在很长一段时间内迭代和维护,在一些项目中遇到了 Vue 2.x 所要求的编程模型的限制,遇到的问题可以归纳为以下两类:

  • 随着时间的推移,复杂组件的代码越来越难以理解,尤其是当开发人员在阅读不是自己编写的代码时。根本原因是 Vue 2.x 的现有 API 强制按选项组织代码,在某些情况下,按逻辑关注点组织代码更有意义。
  • 缺乏在多个组件之间提取和重用逻辑的干净且无成本的机制。

Vue 3.0 新增的组合 API 为用户组织组件代码提供了更大的灵活性。现在,可以将代码编写为函数,每个函数处理一个特定的功能,而不再需要按选项组织代码了。组合 API 还使用在组件之间甚至外部组件之间提取和重用逻辑变得更加简单。

此外,由于组合 API 是一套基于函数的 API ,因此能够更好地与 TypeScript 集成,使用组合 API 编写的代码可以享受完整的类型推断。组合 API 也可以与现有的基于选项的 API 一起使用,不过组合 API 是在选项(data、computed和methods)之前解析,因此在组合 API 中是无法访问这些选项所定义的属性的。

11.2 setup() 函数

setup() 函数是一个新的组件选项,它作为在组件内部使用组合 API 的入点口。setup() 函数在初始的 prop 解析之后,组件实例创建之前被调用。对于组件的生命周期钩子,setup() 函数在 beforeCreate 钩子之前调用。
如果 setup() 函数返回一个对象,该对象上的属性将被合并到组件模板的渲染上下文中。

const App = {
    setup(){
        // 为目标对象创建一个响应式对象
        const state = Vue.reactive({count: 0});
        function increment(){
            state.count++;
        }
              // 返回一个对象,该对象上的属性可以在模板中使用
        return {
            state,
            increment
        }   
    }
};

setup() 函数返回的对象有两个属性,一个是响应式对象(即为原始对象创建的代理对象),另一个是函数。在 DOM 模板中,可以直接使用这两个属性。如下:

<button @click="increment">count 值:{{ state.count }}</button>

需要注意的是,当和现有的基于选项的 API 一起使用时,从 setup() 函数返回的属性在选项中可以通过 this 访问。
setup() 函数可以接受两个可选参数,第一个参数是已解析的 props ,通过该参数可以访问在 props 选项中定义的 prop。如下:

app.component('PostItem',{
    // 声明 props
    props:['postTitle'],
    setup(props){
        console.log(props.postTitle);
    }
})

setup() 函数接受的 props 对象是响应式的,也就是说,在组件外部传入新的 prop 值时,props 对象也会更新,可以调用 watchEffect() 或 watch() 方法监听对象并对更改做出响应。如下:

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
</head>

<body>
    <div id="app">
        <post-item :post-title="title"></post-item>
    </div>

    <script src="https://unpkg.com/vue@next"></script>
    <script>
        const app = Vue.createApp({
            data() {
                return {
                    title: '扁扁'
                }
            }
        });
        app.component('PostItem', {
            //声明props
            props: ['postTitle'],
            setup(props) {
                Vue.watchEffect(() => {
                    console.log(props.postTitle);
                })
            },
            template: '<h3>{{ postTitle }}</h3>'
        });
        const vm = app.mount('#app');
    </script>
</body>

</html>

在谷歌浏览器中打开页面,在 console 窗口中输入 vm.title=“圆圆” ,会看到除了页面内容发生更新外,Console 窗口中也会输出“圆圆”。如下:
在这里插入图片描述

注意:不要去结构 props 对象,否则会失去响应性。如下:

app.component('PostItem', {
    //声明props
    props: ['postTitle'],
    setup({postTitle}) {
        Vue.watchEffect(() => {
            // 不再是响应式的
            console.log(postTitle); 
        })
    }
});

同时也要注意,不要试图去修改 props 对象,否则,将得到一个警告。

setup() 函数接受的第二个可选参数是一个 context 对象,该对象是一个普通的 JavaScript 对象,它公开了 3 组件属性。代码如下:

const MyComponent = {
    setup(props,context){
        // 属性(非响应式)
        console.log(context.attrs)
        // 插槽(非响应式)
        console.log(context.slots)
        // 发出的事件(方法)
        console.log(context.emit)
    }
}

context 对象是一个普通的 JavaScript 对象,也就是说,他不是响应式的,这意味着可以安全地使用 ES6 的对象解构语法对 context 进行结构。

attrs 和 slots 是有状态的对象,当组件本身被更新时,他们也总是被更新。但 attrs 和 slots 对象本身并不是响应式的,所以不应该对它们进行解构,并始终将属性引用为 attrs.x 或 slots.x。如下:

  const MyComponent = {
      setup(props,{attrs}){
          // 在稍后阶段可能被调用的函数
          function onClick(){
              // 保证是最新的引用
              console.log(attrs.foo) 
          }
      }
  }

最后要强调的是,当 setup() 函数和选项 API 一起使用时,在 setup() 函数内部不要使用 this。因为 setup() 函数是在选项被解析之前调用的。也就是,在 setup() 函数内不能访问 data 、 computed、methods 组件选项。例如,下面的代码是错误的:

setup(){
	function onClick(){
    this // 并不是预期的 this
  }
}

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

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

相关文章

项目相互依赖调用解决方法两种方法

Bmodel依赖于Amodel&#xff0c;但是Amodel又需要BModel的信息。原来是在Amodel创建一块内存&#xff0c;在Bmodel中将内存地址赋给这块内存&#xff0c;然后在Amodel去做其他操作。 方法一&#xff1a;采用静态变量static链接&#xff1a;C开发中一个解决方案里&#xff0c;两…

LeetCode 0808. 分汤:好题【感叹号】

【LetMeFly】808.分汤&#xff1a;好题&#xff01; 力扣题目链接&#xff1a;https://leetcode.cn/problems/soup-servings/ 有 A 和 B 两种类型 的汤。一开始每种类型的汤有 n 毫升。有四种分配操作&#xff1a; 提供 100ml 的 汤A 和 0ml 的 汤B 。提供 75ml 的 汤A 和 2…

Google Earth Engine(GEE)—— 各矿区时序NDVI变化图(包含具体的运行函数)

函数: ee.Filter.eq(name, value) Filter to metadata equal to the given value. Returns the constructed filter. Arguments: name (String): The property name to filter on. value (Object): The value to compare against. Returns: Filter ui.Chart.image.s…

7、Jedis测试

文章目录7、Jedis测试7.1. Jedis所需要的jar包7.2. 连接Redis注意事项7.3. Jedis常用操作7.3.1. 创建动态的工程7.3.2. 创建测试程序7.4. 测试相关数据类型7.4.1. Jedis-API&#xff1a;Key7.4.2. Jedis-API&#xff1a;String7.4.3. Jedis-API&#xff1a;List7.4.4. Jedis-AP…

葡萄糖-聚乙二醇-6-羧甲基荧光素 Glucose-PEG-6-FAM

葡萄糖-聚乙二醇-6-羧甲基荧光素 Glucose-PEG-6-FAM 中文名称&#xff1a;葡萄糖-6-羧甲基荧光素 英文名称&#xff1a;Glucose-6-FAM 别称&#xff1a;6-羧甲基荧光素标记葡萄糖&#xff0c;6-羧甲基荧光素-葡萄糖 PEG接枝修饰葡萄糖 Glucose-PEG-6-FAM 葡萄糖-聚乙二醇…

需求收集方法工具,以及进行需求分析的6大要素

通过本文你将了解&#xff1a;1、需求管理流程包括哪四个步骤&#xff1b;2、如何进行需求收集&#xff1b;3、如何进行需求分析&#xff1f;4、如何进行需求分发&#xff1b;5、如何进行需求验证&#xff1b;6、有哪些辅助软件需求管理的工具系统&#xff1f;一、需求管理包括…

MyBatis核心配置文件

1.environments 注 : environments下面可以配置多个环境 , 需要使用哪个环境default里面的参数就对应哪个Id. 2.properties 配置连接 方法一 :(直接配置参数) 方法二 :(使用properties配置文件) (1)创建一个 properties 文件 , 在里面配置连接 (2)在核心配置文件中配置使用p…

41.朴素贝叶斯Naive Bayes公式推导与理解+求解公园凉鞋问题(借助文氏图)

朴素贝叶斯是基于概率论统计学的分类算法。 贝叶斯理论是指根据一个已发生事件的概率&#xff0c;计算另一个事件的发生概率。 目录 1.相关概念 1.1先验概率 应用举例 1.2条件概率 应用举例 1.3全概率公式 应用举例 1.4后验概率 应用举例 2.课堂笔记 ​ 3.文…

ubuntu16.04+cuda10.0+cudnn7.6+tensorflow_gpu-1.11.0环境安装

为了搭深度学习环境,又装了一遍各种库,在此记录安装版本和流程. ubuntu16.04cuda10.0cudnn7.6tensorflow_gpu-1.11.0环境安装1 安装NVIDIA显卡2 安装CUDA10.03 安装CUDNN4 安装tensorflow_gpu-1.11.01 安装NVIDIA显卡 查看自己的显卡型号: lspci |grep -i nvidianvidia官网:h…

linux安装Zookeeper3.5.7详解

官网下载链接&#xff1a;Apache ZooKeeper 如下图可以下载历史版本 然后找到3.5.7版本&#xff0c;直接下载即可然后将Zookeeper拷贝到一个文件夹下&#xff0c;这里我选择的是/opt/software文件夹 然后将其解压到指定目录下 tar -zxvf apache-zookeeper-3.5.7-bin.tar.gz -C …

让你全方位了解tftp协议,学tftp协议不再难

TFTP(Trivial File Transfer Protocol,简单文件传输协议)是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议&#xff0c;端口号为69&#xff0c;是一种高效的文件传输方式。 其目标是在UDP之上建立一个类似于FTP的但仅支持文件上传和下载功能的传输协议&a…

【Jmeter基础篇】06:HTTP信息头管理器的使用 | 梯度加压性能测试

一、什么是信息头&#xff1f; 其实就是请求头&#xff0c;它会随着我们的HTTP请求一起发送到服务器。 二、使用场景 需要传输cookie&#xff0c;token或其他某些信息&#xff0c;或是需要伪造请求头的时候。 三、实际案例 比如我在使用Apache Jmeter发送请求的时候&#…

【Hack The Box】linux练习-- Haircut

HTB 学习笔记 【Hack The Box】linux练习-- Haircut &#x1f525;系列专栏&#xff1a;Hack The Box &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4c6;首发时间&#xff1a;&#x1f334;2022年9月7日&#x1f334; &#x1f36…

Fiddler收费没得用?这款抓包神器 Github star 过万,一个字:香

关于抓包&#xff0c;那是测试人员必备技能之一了&#xff0c;通常我们会通过一些抓包工具来辅助我们测试、定位bug。 我最早接触并使用的就是 fiddler &#xff0c;不过目前最新版本已经要开始付费了&#xff0c;以前很老的那版我也不爱用了&#xff0c;这可咋整&#xff1f;…

软件测试投了几十份简历为什么没有面试邀约?

最近有不少人问&#xff0c;测试岗位&#xff0c;为啥投了简历却连一个面试机会都没有&#xff1f;如下图&#xff1a; 投3份简历没有回音&#xff0c;有可能是投的公司规模较大&#xff0c;你自身条件不过关&#xff08;如学历&#xff0c;年龄不符合要求&#xff09;。 投30…

网络是怎样连接的--DNS服务器查询原理

文章目录3.1 DNS服务器基本工作3.2 寻找相应的DNS服务器并获取ip地址3.3 通过缓存加快DNS服务器的响应3.1 DNS服务器基本工作 DNS服务器的基本工作就是接收来自客户端的查询消息&#xff0c;然后根据消息的内容返回响应。 其中&#xff0c;来自客户端的查询消息包含以下3种信…

Java 面试题 —— 简单工厂、工厂方法、抽象工厂的区别

Java 面试题 —— 简单工厂、工厂方法、抽象工厂的区别 1、简单工厂模式 ​ 简单工厂模式&#xff08;Simple Factory Pattern&#xff09;&#xff1a;又称为静态工厂方法&#xff08;Static Factory Method&#xff09;模式&#xff0c;它属于类创建型模式。 ​ 在简单工厂…

常见仿射变换矩阵

旋转&#xff08;Rotation&#xff09; def _get_rotation_matrix(rotate_degrees):radian math.radians(rotate_degrees)rotation_matrix np.array([[np.cos(radian), -np.sin(radian), 0.],[np.sin(radian), np.cos(radian), 0.], [0., 0., 1.]],dtypenp.float32)return r…

C# 学习之路(C# 的概念)

C# 学习之路&#xff08;C# 的概念&#xff09; - 什么是 C# C# 的发音是 “C sharp”&#xff0c;不是念作 “C 井”&#xff08;虽然&#xff0c;我在没有接触之前是念“C 井”&#x1f923;&#xff09;。C# 的第一个版本是 2002年发布的 C# 1.0&#xff0c;但到如今&#x…

Redis——》内存淘汰策略

推荐链接&#xff1a; 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 Redis——》内存淘汰策略一、内存淘汰策略二、设置缓存大小三、设置过期时间…