【问题标题】:ref no longer reactive within a reactive array objectref 在反应式数组对象中不再反应式
【发布时间】:2020-05-29 13:23:24
【问题描述】:

以下代码可以正常工作。当我们更改语言时,由于ref,文本会正确更新:

const mainNavigationLinks = computed(() => [
  { label: context.root.$t('navigationMenu.home') },
  { label: context.root.$t('navigationMenu.tickets') },
])

return {
  mainNavigationLinks,
}

但我们真正想要的是将mainNavigationLinks 作为reactive 对象,这样我们就可以在数组中添加和删除项目,并让Vue 使用ref 使用正确的翻译相应地更新组件在array 内。根据Vue docs,这应该是可能的

但是,当我们尝试下面的代码时,我们发现标签不再是反应性的:

const mainNavigation = reactive([
  { label: context.root.$t('navigationMenu.home') },
  { label: context.root.$t('navigationMenu.tickets') },
])

const mainNavigationLinks = computed(() => mainNavigation)

为了能够将项目添加到数组并仍然具有反应性,我们在这里缺少什么?感谢您的帮助。

【问题讨论】:

    标签: javascript vue.js vue-i18n vue-composition-api


    【解决方案1】:

    看起来你想要的是让数组是反应式的,但数组中的项目是计算属性。

    const mainNavigation = reactive([
      { label: computed(() => context.root.$t('navigationMenu.home')) },
      { label: computed(() => context.root.$t('navigationMenu.tickets')) },
    ])
    

    或者,只要每个label 属性都引用一个您必须调用的函数,您就可以在此处完全不使用computed:

    const mainNavigation = reactive([
      { label: () => context.root.$t('navigationMenu.home') },
      { label: () => context.root.$t('navigationMenu.tickets') },
    ])
    

    这是主要思想:每个label 都需要在使用时进行评估,这就是为什么它必须是computed 属性(您可以从缓存中受益)或函数。您的代码不起作用,因为您在构造数组时会立即获得标签翻译。

    【讨论】:

    • 感谢您的帮助。你说的似乎合乎逻辑,但是当我尝试computed 版本时,它会抱怨type check failed for prop "label". Expected Number, String, got Object 。将匿名函数用作 IIFE 时,它会显示文本,但会再次失去反应性。
    • 对于第 1 点,您可能需要手动解包 :label="mainNavigation[0].label.value";对于#2,它不应该立即在数组中调用,它必须作为你调用的函数保存在数组中,如:label="mainNavigation[0].label()",如果这是你所做的但它仍然不起作用那么这很奇怪而且我没有解释。
    • 奇怪的是我们需要手动打开它。为此制作了issue on GitHub。
    猜你喜欢
    • 2020-05-17
    • 2021-08-18
    • 1970-01-01
    • 2018-11-06
    • 1970-01-01
    • 2020-09-12
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    相关资源
    最近更新 更多