如何在不展开的情况下将 ref 传递给 method/function 参数?
How to pass a ref to a method/function argument without unwrapping?
我们正在使用 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
}
上面的代码工作正常,但我们也需要为 truckId
复制函数 clearDriverId
。这就是为什么我们想创建这样的东西:
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
对象传递给函数的正确方法是什么?
setup()
中的一个解决方案是 return 一个包含所有 ref
的 object/dictionary(防止它们自动展开),然后可以用来将特定的 ref
传递给您的函数。 return 将 ref
与 ref
字典一起使用的实用程序(下面的 toMyRefs()
)将有助于最大程度地减少重复代码:
<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>
我们正在使用 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
}
上面的代码工作正常,但我们也需要为 truckId
复制函数 clearDriverId
。这就是为什么我们想创建这样的东西:
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
对象传递给函数的正确方法是什么?
setup()
中的一个解决方案是 return 一个包含所有 ref
的 object/dictionary(防止它们自动展开),然后可以用来将特定的 ref
传递给您的函数。 return 将 ref
与 ref
字典一起使用的实用程序(下面的 toMyRefs()
)将有助于最大程度地减少重复代码:
<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>