Vue 3 - 如何使用响应式引用并在没有 .value 的情况下进行计算?

问题描述 投票:0回答:2

当我们使用Options API时,我们可以在

computed
部分定义一些属性,在
data
部分定义一些属性。所有这些都可以通过
this
引用从实例访问,即在同一个对象中。非常适合。

例如:

if (this.hasMore) {
   this.loading = true;
   ...
}

其中

hasMore
是计算属性,
loading
是反应属性。

是否有可能通过Composition API做类似的事情?例如,要实现类似的代码,但其中

pagination
是一个简单对象,而不是组件的链接,例如:

if (pagination.hasMore) {
   pagination.loading = true;
   ...
}

computed
根本不是解决方案,因为它返回
ref
并且它的使用将与上面示例中使用
this
完全不同。

javascript vue.js vue-component vuejs3 vue-composition-api
2个回答
13
投票

您可以使用具有计算属性的

reactive
对象。然后一切都可以按照您想要的方式访问:

const pagination = reactive({
  loading: false,
  hasMore: computed(() => {
    return true;
  })
})

演示:

const { createApp, reactive, computed } = Vue;
const app = createApp({
  setup() {
    const pagination = reactive({
      loading: false,
      hasMore: computed(() => {
        return true;
      })
    })
    if (pagination.hasMore) {
      pagination.loading = true;
      // ...
    }
    return {
      pagination
    }
  }
});
app.mount("#app");
<div id="app">
  {{ pagination }}
</div>

<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/3.4.7/vue.global.min.js"></script>


9
投票

如果您真的不喜欢将 .value 与 ref 一起使用,您可能会对反应性转换编译器宏感兴趣。

2023 年更新: Reactivity Transform 功能不会作为核心功能添加到 Vue 3 中。相反,使用 Vue Macros 库添加该功能。 https://vue-macros.sxzz.moe/features/reactivity-transform.html

// declaring a reactive variable backed by an underlying ref
let count = $ref(1)
console.log(count); //no .value needed!

vite.config.js

import { defineConfig } from 'vite'
import ReactivityTransform from '@vue-macros/reactivity-transform/vite'

export default defineConfig({
  plugins: [ReactivityTransform()],
})
© www.soinside.com 2019 - 2024. All rights reserved.