组合式API- 1-Setup

本文深入探讨 Vue3 中的 `setup` 函数,解析其接受的 `props` 和 `context` 参数。讲解了如何在 `setup` 中处理响应式 `props`,避免使用 ES6 解构导致的响应性丢失,并介绍了 `toRefs` 的作用。同时,解释了 `context` 对象中的 `attrs`, `slots` 和 `emit` 属性。还讨论了在 `setup` 中无法访问组件实例的 `data`、`computed` 和 `methods`。最后,展示了如何在模板中使用 `ref` 和 `reactive` 创建响应式数据。

#参数

使用 setup 函数时,它将接受两个参数:

  1. props

  2. context

#第一个参数-Props

setup 函数中的第一个参数是 props。正如在一个标准组件中所期望的那样,setup 函数中的 props 是响应式的,当传入新的 prop 时,它将被更新。

// MyBook.vue

export default {
  props: {
    title: String
  },
  setup(props) {
    console.log(props.title)
  }
}

WARNING 

但是,因为 props 是响应式的,你不能使用 ES6 解构,因为它会消除 prop 的响应性。

使用 setup 函数中的 toRefs 来安全地完成此操作

const { title } = toRefs(props)

vue3中ref、toRef、toRefs的区别

toRefs——>可以看作toRef的语法糖,toRefs会遍历传入对象的属性

ref——>原有数据的复制,修改数据不会影响原数据UI界面会更新

toRef——>原有数据的引用,修改数据影响原数据UI界面不更新

 第二个参数是 context

context 是一个普通的 JavaScript 对象,它暴露三个组件的 property:

export default {
  setup(props, context) {
    // Attribute (非响应式对象)
    console.log(context.attrs)

    // 插槽 (非响应式对象)
    console.log(context.slots)

    // 触发事件 (方法)
    console.log(context.emit)
  }
}

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

// MyBook.vue
export default {
  setup(props, { attrs, slots, emit }) {
    ...
  }
}

 访问组件的 property

                     因为组件实例尚未被创建

不可访问可访问
  • data
  • computed
  • methods
  • props
  • attrs
  • slots
  • emit

 结合模板使用

<template>
  <div>{{ readersNumber }} {{ book.title }}</div>
</template>

<script>
  import { ref, reactive } from 'vue'

  export default {
    setup() {
      const readersNumber = ref(0)
      const book = reactive({ title: 'Vue 3 Guide' })

      // expose to template
      return {
        readersNumber,
        book
      }
    }
  }
</script>
refreactive
不同点用于基本数据类型用于复杂数据类型,比如对象和数组
相同点将数据变成响应式数据,当数据发生变化时UI也会自动更新

使用 this

在 setup() 内部,this 不会是该活跃实例的引用,因为 setup() 是在解析其它组件选项之前被调用的,所以 setup() 内部的 this 的行为与其它选项中的 this 完全不同。这在和其它选项式 API 一起使用 setup() 时可能会导致混淆。

setup语法与组合式API并不是完全等同的概念,但它们紧密相关且在Vue 3中常常一起使用组合式API(Composition API)是一种更灵活、更模块化的代码组织方式,允许开发者通过函数的方式复用逻辑,而不是传统的选项式API(Options API)。它提供了一种更加直观和可维护的方式来管理组件的逻辑,尤其是在处理复杂业务逻辑时。组合式API的核心包括`ref`、`reactive`、`computed`、`watch`等响应式相关的函数,以及生命周期钩子如`onMounted`、`onUnmounted`等[^2]。 而`setup()`是一个特殊的函数,它是使用组合式API的入口点。当一个组件使用了`setup()`函数时,它就成为了使用组合式API的载体。在`setup()`中,可以通过返回一个对象来暴露模板需要使用的响应式属性、计算数据、方法等。此外,`setup()`函数中无法直接访问`this`实例,这意味着不能直接访问选项式API中定义的数据或方法,但在选项式API中可以访问`setup()`中暴露出来的数据[^2]。 因此,`setup()`是实现组合式API的一种方式,但它本身并不是组合式API的全部。组合式API还包括了其他一系列的函数和机制,用于构建响应式和可复用的逻辑块。例如,在Vue 3.2之后引入的`<script setup>`语法糖进一步简化了组合式API使用,使得编写组件变得更加简洁和直观[^3]。 为了更好地理解两者的区别与联系,下面是一个简单的例子展示如何在`setup()`中创建响应式数据: ```javascript import { ref, reactive } from 'vue'; export default { setup() { // 使用ref创建一个响应式的数值 const count = ref(0); // 使用reactive创建一个响应式的对象 const state = reactive({ message: 'Hello Vue 3!', count, }); // 返回模板需要使用的变量 return { count, state, }; }, }; ``` 在这个例子中,`setup()`函数内部使用了`ref`和`reactive`这两个组合式API来创建响应式数据,并将这些数据返回给模板使用。这说明了`setup()`作为组合式API表演舞台的作用。 总结来说,虽然`setup()`是使用组合式API的关键部分,但它只是整个组合式API生态系统中的一个组成部分。组合式API提供了更多的功能和灵活性,使得开发者能够以更加高效和清晰的方式编写Vue应用程序。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值