Vue组合式API

文章介绍了Vue3中的组合式API,包括响应式API如ref和reactive,生命周期钩子,以及setup函数的使用。强调了setup函数在非单文件组件和选项式API集成中的作用,以及如何访问和处理props。还提到了ref和reactive在响应式状态管理中的应用,并指出在访问响应式数组或Map中的ref元素时需要注意的解包问题。
摘要由CSDN通过智能技术生成

最近在使用Vue3中,遇到很多阻碍,最后发现,现在多是组合式API了,学习了一部分,但是还是不太熟悉,很烦

组合式 API (Composition API) 是一系列 API 的集合,使我们可以使用函数而不是声明选项的方式书写 Vue 组件。它是一个概括性的术语,涵盖了以下方面的 API:

  • 响应式 API:例如 ref()reactive(),使我们可以直接创建响应式状态、计算属性和侦听器。
  • 生命周期钩子:例如 onMounted()onUnmounted(),使我们可以在组件各个生命周期阶段添加逻辑。
  • 依赖注入:例如 provide()inject(),使我们可以在使用响应式 API 时,利用 Vue 的依赖注入系统。
<script setup>
import { ref, onMounted } from 'vue'

// 响应式状态
const count = ref(0)

// 更改状态、触发更新的函数
function increment() {
  count.value++
}

// 生命周期钩子
onMounted(() => {
  console.log(`计数器初始值为 ${count.value}。`)
})
</script>

<template>
  <button @click="increment">点击了:{{ count }} 次</button>
</template>

1.setup()

setup() 钩子是在组件中使用组合式 API 的入口,通常只在以下情况下使用:

  1. 需要在非单文件组件中使用组合式 API 时。
  2. 需要在基于选项式 API 的组件中集成基于组合式 API 的代码时。

setup()的基本使用,这是选项式API中使用setup()函数

<script>
import { ref } from 'vue'

export default {
  setup() {
    const count = ref(0)

    // 返回值会暴露给模板和其他的选项式 API 钩子
    return {
      count
    }
  },

  mounted() {
    console.log(this.count) // 0
  }
}
</script>

<template>
  <button @click="count++">{{ count }}</button>
</template>

我们可以使用响应式 API 来声明响应式的状态,在 setup() 函数中返回的对象会暴露给模板和组件实例,这里的响应式就是引入的{ref}了,之后会说

setup() 自身并不含对组件实例的访问权,即在 setup() 中访问 this 会是 undefined。你可以在选项式 API 中访问组合式 API 暴露的值,但反过来则不行,这是因为在Vue生命周期中setup()的初始化,是在组件加载之前的,是访问不到组件实例的

如图:

在这里插入图片描述

  • 访问Props

setup 函数的第一个参数是组件的 props,标准的组件一致,一个 setup 函数的 props 是响应式的,并且会在传入新的 props 时同步更新

请注意如果你解构了 props 对象,解构出的变量将会丢失响应性。因此我们推荐通过 props.xxx 的形式来使用其中的 props。

如果你确实需要解构 props 对象,或者需要将某个 prop 传到一个外部函数中并保持响应性,那么你可以使用 toRefs()toRef() 这两个工具函数:

import { toRefs, toRef } from 'vue'

export default {
  setup(props) {
    // 将 `props` 转为一个其中全是 ref 的对象,然后解构
    const { title } = toRefs(props)
    // `title` 是一个追踪着 `props.title` 的 ref
    console.log(title.value)

    // 或者,将 `props` 的单个属性转为一个 ref
    const title = toRef(props, 'title')
  }
}

一些实际应用

2.响应式

  • ref() 定义响应式变量

Vue 提供了一个 ref() 方法来允许我们创建可以使用任何值类型的响应式 ref

import { ref } from 'vue'

const count = ref(0)

ref() 将传入参数的值包装为一个带 .value 属性的 ref 对象:

const count = ref(0)

console.log(count) // { value: 0 }
console.log(count.value) // 0

count.value++
console.log(count.value) // 1

ref 对象是可更改的,也就是说你可以为 .value 赋予新的值。它也是响应式的,即所有对 .value 的操作都将被追踪,并且写操作会触发与之相关的副作用。

  • reactive()返回一个对象的响应式代理

  • 响应式转换是“深层”的:它会影响到所有嵌套的属性。一个响应式对象也将深层地解包任何 ref 属性,同时保持响应性。

    值得注意的是,当访问到某个响应式数组或 Map 这样的原生集合类型中的 ref 元素时,不会执行 ref 的解包。

    若要避免深层响应式转换,只想保留对这个对象顶层次访问的响应性,请使用 shallowReactive() 作替代。

    返回的对象以及其中嵌套的对象都会通过 ES Proxy 包裹,因此不等于源对象,建议只使用响应式代理,避免使用原始对象。

  • 示例

    创建一个响应式对象:

    const obj = reactive({ count: 0 })
    obj.count++
    

    ref 的解包:

    const count = ref(1)
    const obj = reactive({ count })
    
    // ref 会被解包
    console.log(obj.count === count.value) // true
    
    // 会更新 `obj.count`
    count.value++
    console.log(count.value) // 2
    console.log(obj.count) // 2
    
    // 也会更新 `count` ref
    obj.count++
    console.log(obj.count) // 3
    console.log(count.value) // 3
    

    注意当访问到某个响应式数组或 Map 这样的原生集合类型中的 ref 元素时,不会执行 ref 的解包:

    const books = reactive([ref('Vue 3 Guide')])
    // 这里需要 .value
    console.log(books[0].value)
    
    const map = reactive(new Map([['count', ref(0)]]))
    // 这里需要 .value
    console.log(map.get('count').value)
    

    将一个 ref 赋值给为一个 reactive 属性时,该 ref 会被自动解包:

    ts

    const count = ref(1)
    const obj = reactive({})
    
    obj.count = count
    
    console.log(obj.count) // 1
    console.log(obj.count === count.value) // true
    

之前一直使用的选项式API,刚使用组合式还是有点不适应。很多API不熟悉,今天使用Element Plus时,发现很多实例都是TS,后面还需要补一下ts的

Vue 3.0 推出了一种全新的 API,即组合式 API,它可以让我们更好地组织 Vue 组件代码。这里是一些 Vue 组合式 API 的笔记: ### setup `setup` 是组合式 API 中的一个钩子函数,它在 `beforeCreate` 之前被调用。`setup` 函数接收两个参数: - `props`: 组件的属性对象 - `context`: 组件上下文对象 `setup` 函数必须返回一个对象,这个对象包含组件内部需要用到的数据、方法等。 ```javascript import { ref } from 'vue' export default { props: { msg: String }, setup(props, context) { const count = ref(0) // ref 可以用来定义响应式数据 const increase = () => count.value++ return { count, increase } } } ``` 在组件模板中,可以直接使用 `count` 和 `increase`,它们都是响应式的。 ### reactive `reactive` 可以用来创建一个响应式的对象。 ```javascript import { reactive } from 'vue' const state = reactive({ count: 0, msg: 'Hello' }) ``` 在模板中,可以直接使用 `state.count` 和 `state.msg`。 ### ref `ref` 可以用来创建一个响应式的值。 ```javascript import { ref } from 'vue' const count = ref(0) ``` 在模板中,可以直接使用 `count.value`。 ### computed `computed` 可以用来定义一个计算属性。 ```javascript import { computed, ref } from 'vue' const count = ref(0) const doubleCount = computed(() => count.value * 2) ``` 在模板中,可以直接使用 `doubleCount`。 ### watch `watch` 可以用来监听一个响应式值的变化。 ```javascript import { watch, ref } from 'vue' const count = ref(0) watch(count, (newValue, oldValue) => { console.log(`count changed from ${oldValue} to ${newValue}`) }) ``` ### 生命周期钩子函数 组合式 API 中,可以使用 `onBeforeMount`、`onMounted`、`onBeforeUpdate`、`onUpdated`、`onBeforeUnmount`、`onUnmounted` 等函数来替代传统的生命周期钩子函数。 ```javascript import { onMounted, onUnmounted } from 'vue' export default { setup() { onMounted(() => { console.log('mounted') }) onUnmounted(() => { console.log('unmounted') }) } } ``` 以上是 Vue 组合式 API 的一些笔记,希望对你有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

栀梦星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值