Vue3 Composition API 之 setup 函数

简介: Vue 3 中引入的一种新的编写 Vue 组件的方式,可以将 2.x 中与组件逻辑相关的选项以 API 函数的形式重新设计。
Vue 3 中引入的一种新的编写 Vue 组件的方式,可以将 2.x 中与组件逻辑相关的选项以 API 函数的形式重新设计。

在说 Vue3 之前,我们先看看 Vue2 项目中是如何编写逻辑代码的,
新建一个组件

<template>
  <div></div>
</template>
<script>
export default {
  name: "demo",
  props: {},
  data() {
    return {};
  },
  created() {},
  watch: {},
  computed: {},
  methods: {}
};
</script>
<style></style>

每个属性都有自己的功能,比如 data 定义数据、methods 中定义方法、computed 中定义计算属性、watch 中监听属性改变,小项目中这种方式确实能带来很大的便利,但是当我们组件变得更大,更复杂时,逻辑会不断增长,那么同一个功能的逻辑就会被拆分的很分散。尤其是对于后面接手的同事,可读性会很低,很难理解。一个功能会跳到多个地方,比较容易出差错,而且后期维护会很复杂。

是不是可以将一个功能点涉及到的数据和逻辑组织到一起,Composition API 就这么诞生了,它很好的解决了上面的问题。接下来认识下 Composition API,由于对 TS 支持更友好,所以 demo 用 ts 做示例

<template>
  <div>
    <a-button type="primary" @click="getValue(22)">Primary Button</a-button>
    <a-input v-model:value="count"></a-input>
    <div>{{ count }}</div>
    <div>{{ x }}-{{ y }}</div>
    <a-button @click="add">点击</a-button>
    <div>{{ counter.count }}</div>
  </div>
</template>

<script setup lang="ts">
import { ref, onMounted } from "vue";
import { postLogin } from "@/api/user";
import { useMouse } from "@/hooks/main";
import { useCounterStore } from "@/store/modules/counter";

defineProps<{ msg: string }>();

// 获取鼠标位置信息
const { x, y } = useMouse();
const counter = useCounterStore();
function add() {
  counter.count++;
  counter.$patch({ count: counter.count });
  counter.increment();
}

// 获取数据
function getdata(title?: string) {
  postLogin({ username: "22", password: "33" })
    .then(res => {
      console.log(res);
    })
    .catch(err => {
      console.log("0000");
    });
}

// 获取值
const count = ref(0);
function getValue(value?: any): void {
  count.value = value;
}

</script>

<style scoped lang="less">
.read-the-docs {
  color: #888;
}
.vue {
  .vue-child {
    font-size: 40px;
    background: @main-color-theme1;
  }
}
</style>

代码中我们可以看到,少了一些选项,功能点逻辑更加集中,看不懂没关系,这里只是演示,后面会详细讲解,这篇文章主要讲解 Composition API 的 setup 函数

一 setup 函数

setup 其实就是组件的另外一个选项,只不过这个选项强大到我们可以使用它来替代之前所编写的大部分其他选项,比如:methods、computed、data、生命周期等选项。

参数

props:父组件传递过来的属性
context:是一个普通的 JavaScript 对象,它暴露三个组件的 property
props
因为 props 是响应式的,你不能使用 ES6 解构,因为它会消除 prop 的响应性。如果需要解构 prop,可以通过使用 setup 函数中的 toRefs 来安全地完成此操作。

Vue3.0 使用

<script>
export default {
  setup (props) {
      return {}
  }
}
</script>

Vue3.2 使用

<script setup>
export default {
  const props = defineProps({
    treeCode: String,
  });
}
</script>

script setup 是一种编译时语法糖,可在 SFC 内使用 Composition API 时极大地提升工作效率。

context
里面包含有三个属性 attrs、slots 和 emit

(1)attrs:里面包含了所有的非 props 属性。
(2)slots:父组件传递过来的插槽。
(3)emit:当我们组件内部需要发出事件时会用到 emit。

Vue3.0 使用

<script>
export default {
  setup (props.{attrs,slots,emit}) {
      return {}
  }
}
</script>

Vue3.2 使用


<script setup>
export default {
  // defineProps
  const props = defineProps({
    treeCode: String,
  });
  // defineEmits
  const emit = defineEmits(['on-confirm'])
  // useSlots
  const slots = useSlots()
}
</script>

在 script setup 使用 slots 和 attrs 的情况应该是很比较少见的,大部分人是(SFC)模式开发,在 template 通过 slot 标签就可以渲染插槽,可以在模板中通过 $slots 和 $attrs 来访问它们。主要在 JSX /TSX 使用比较多。

this

setup 不可以使用 this

setup() 自身并不含对组件实例的访问权,即在 setup() 中访问 this 会是 undefined。我们可以理解为:this未指向当前的组件实例,在setup被调用之前,data,methods,computed等都没有被解析,但是组件实例确实在执行setup函数之前就已经被创建好了。

相关文章
|
1月前
|
JavaScript API
vue 3.0 所采用的 Composition Api 和 vue 2.0 使用的 Option Api 区别
vue 3.0 所采用的 Composition Api 和 vue 2.0 使用的 Option Api 区别
29 0
|
26天前
|
人工智能 关系型数据库 Serverless
Serverless 应用引擎常见问题之API生成的函数镜像改为自定义的镜像如何解决
Serverless 应用引擎(Serverless Application Engine, SAE)是一种完全托管的应用平台,它允许开发者无需管理服务器即可构建和部署应用。以下是Serverless 应用引擎使用过程中的一些常见问题及其答案的汇总:
37 3
|
7天前
|
JavaScript 前端开发 API
Vue3 组合式 API
Vue3 组合式 API
|
9天前
|
JavaScript API UED
Vue3.0新特性解析与实战:Composition API、Teleport与Suspense
【4月更文挑战第6天】Vue3.0引入了颠覆性的Composition API,通过函数式方法提升代码可读性和复用性,例如`setup()`、`ref`等,便于逻辑模块化。实战中,自定义的`useUser`函数可在多个组件中共享用户信息逻辑。另外,Teleport允许组件渲染到DOM特定位置,解决模态框等场景的上下文问题。再者,Suspense提供异步组件加载的延迟渲染,使用fallback内容改善用户体验。这些新特性显著优化了开发和性能,适应现代Web需求。
17 0
|
17天前
|
JavaScript API
Composition Api 与 Options Api 有什么区别?
Composition Api 与 Options Api 有什么区别?
12 0
|
25天前
|
Java 数据库连接 API
Java 学习路线:基础知识、数据类型、条件语句、函数、循环、异常处理、数据结构、面向对象编程、包、文件和 API
Java 是一种广泛使用的、面向对象的编程语言,始于1995年,以其跨平台性、安全性和可靠性著称,应用于从移动设备到数据中心的各种场景。基础概念包括变量(如局部、实例和静态变量)、数据类型(原始和非原始)、条件语句(if、else、switch等)、函数、循环、异常处理、数据结构(如数组、链表)和面向对象编程(类、接口、继承等)。深入学习还包括包、内存管理、集合框架、序列化、网络套接字、泛型、流、JVM、垃圾回收和线程。构建工具如Gradle、Maven和Ant简化了开发流程,Web框架如Spring和Spring Boot支持Web应用开发。ORM工具如JPA、Hibernate处理对象与数
90 3
|
10天前
|
缓存 前端开发 API
API接口封装系列
API(Application Programming Interface)接口封装是将系统内部的功能封装成可复用的程序接口并向外部提供,以便其他系统调用和使用这些功能,通过这种方式实现系统之间的通信和协作。下面将介绍API接口封装的一些关键步骤和注意事项。
|
17天前
|
监控 前端开发 JavaScript
实战篇:商品API接口在跨平台销售中的有效运用与案例解析
随着电子商务的蓬勃发展,企业为了扩大市场覆盖面,经常需要在多个在线平台上展示和销售产品。然而,手工管理多个平台的库存、价格、商品描述等信息既耗时又容易出错。商品API接口在这一背景下显得尤为重要,它能够帮助企业在不同的销售平台之间实现商品信息的高效同步和管理。本文将通过具体的淘宝API接口使用案例,展示如何在跨平台销售中有效利用商品API接口,以及如何通过代码实现数据的统一管理。
|
29天前
|
安全 算法 API
产品经理必备知识——API接口
前言 在古代,我们的传输信息的方式有很多,比如写信、飞鸽传书,以及在战争中使用的烽烟,才有了著名的烽火戏诸侯,但这些方式传输信息的效率终究还是无法满足高速发展的社会需要。如今万物互联的时代,我通过一部手机就可以实现衣食住行的方方面面,比如:在家购物、远程控制家电、自动驾驶等等,背后都离不开我们今天要聊的API接口。
|
29天前
|
数据采集 JSON API
如何实现高效率超简洁的实时数据采集?——Python实战电商数据采集API接口
你是否曾为获取重要数据而感到困扰?是否因为数据封锁而无法获取所需信息?是否因为数据格式混乱而头疼?现在,所有这些问题都可以迎刃而解。让我为大家介绍一款强大的数据采集API接口。