首页 > 解决方案 > 如何在不展开的情况下将 ref 传递给方法/函数参数?

问题描述

我们正在使用 Vue Composition API 并希望将一个ref对象(而不仅仅是值)作为参数传递给函数。一些代码来澄清:

import { defineComponent, ref } from '@vue/composition-api'

export default defineComponent({
  setup() {
    const driverId = ref()
    const truckId = ref()

    const clearDriverId = () => {
      driverId.value = null
    }

上面的代码工作正常,但我们也需要复制函数clearDriverIdtruckId这就是为什么我们想创建这样的东西:

    const clearField = (field: Ref) => {
      field.value = null
    }

从模板访问:

<q-input
  label="Driver ID"
  v-model="driverId"
>
  <template v-slot:append>
    <q-icon
      name="close"
      @click.stop="clearField(driverId)"
    />
  </template>
</q-input>

当然,这不起作用,因为ref driverId从模板传递到函数时会被解包。ref将完整对象传递给函数的正确方法是什么?

标签: vue.jsvuejs2vue-composition-api

解决方案


一种解决方案setup()是返回一个包含所有refs 的对象/字典(防止它们的自动解包),然后可以将其用于将特定对象传递ref给您的函数。一个返回字典的实用程序(toMyRefs()如下)将有助于最小化重复代码:refref

<template>
  <div>
    <button @click="clearField(myRefs.driverId)">Clear driverId</button>
    <button @click="clearField(myRefs.truckId)">Clear truckId</button>
    <button @click="clearField(myRefs.carId)">Clear carId</button>
    <button @click="clearField(myRefs.trainId)">Clear trainId</button>

    <pre>
      driverId: {{ driverId }}
      truckId: {{ truckId }}
      carId: {{ carId }}
      trainId: {{ trainId }}
    </pre>
  </div>
</template>

<script>
import { defineComponent, ref } from '@vue/composition-api'

const toMyRefs = refs => ({
  ...refs,
  myRefs: {
    ...refs
  }
})

export default defineComponent({
  setup() {
    const driverId = ref(1)
    const truckId = ref(2)
    const carId = ref(3)
    const trainId = ref(4)

    const clearField = (field) => {
      field.value = 0
    }

    return {
      ...toMyRefs({
        driverId,
        truckId,
        carId,
        trainId,
      }),
      clearField,
    }
  }
})
</script>

演示


推荐阅读