Vue 3 中的 this.$forceUpdate 等效项 - 组合 API?

Posted

技术标签:

【中文标题】Vue 3 中的 this.$forceUpdate 等效项 - 组合 API?【英文标题】:this.$forceUpdate equivalent in Vue 3 - Composition API? 【发布时间】:2021-07-31 18:59:30 【问题描述】:

在 Vue 2 中,实例方法 this.$forceUpdate() 可用于手动更新组件。我们如何在 Vue 3 - Composition API 中强制更新组件(在 setup 方法中)?

setup(props, context) 
   const doSomething = () => 
     /* how to call $forceUpdate here? */
   

   return 
       doSomething
   

谢谢,提前。

【问题讨论】:

【参考方案1】:

$forceUpdate 在 Vue3 中仍然可用,但您无法在 setup() 函数中访问它。如果你绝对需要使用它,你可以使用对象 API 组件或这个花哨的技巧......

app.component("my-component", 
  template: `...`,
  methods: 
    forceUpdate()
        this.$forceUpdate()
    
  ,
  setup(props) 
    const instance = Vue.getCurrentInstance();
    Vue.onBeforeMount(()=>
        // instance.ctx is not populated immediately
        instance.ctx.forceUpdate();
    )
    return doSomething;
  ,
)

如果这似乎是一个荒谬的解决方案,请相信您的判断力。理想情况下,您的应用程序不会依赖forceUpdate。如果您依赖它,可能意味着某些配置错误,这应该是首先要解决的问题。

【讨论】:

我知道forceUpdate 应该尽一切可能避免,只是好奇它是如何在setup() 中完成的。一周前刚迁移到 Vue 3,在任何地方的文档中都找不到它。谢谢。 Property 'ctx' does not exist on type 'ComponentInternalInstance' 在 Vue 3.2 中。看起来它在这个提交中被重命名为proxy:github.com/vuejs/vue-next/commit/…。请参阅下面的答案。 我用 vue 3.2.0 测试过,它仍然可以工作 如果您查看提交,ctx 在那里,但是也正在添加 ctx (proxy) 的代理。在某些情况下,可能需要代理来进行反应,但情况似乎并非如此。我没有看到任何提到在release changelog 中删除ctx,这样的更改将保证vue 团队的更多沟通。【参考方案2】:

当我需要在 vue 中强制更新时,我通常会添加一个可以更改值的键,然后强制 vue 更新它。这也应该在 vue 3 中工作,尽管我承认我从未尝试过。这是一个例子:

<template>
  <ComponentToUpdate
    :key="updateKey"
  />
</template>

<script>
  export default 
    data() 
      return 
        updateKey: 0,
      ;
    ,
    methods: 
      forceUpdate() 
        this.updateKey += 1;
      
    
  
</script>

您可以在此处阅读更多信息:https://michaelnthiessen.com/key-changing-technique/

【讨论】:

不错的技巧,谢谢。我正在为 vue2 使用 vue-composition-api,它工作得很好:)【参考方案3】:
<script>
import getCurrentInstance, defineComponent from 'vue'
export default defineComponent(
  setup() 
    const instance = getCurrentInstance();
    instance.proxy.$forceUpdate();
  
)
</script>

在 TypeScript 中它将是 instance?.proxy?.$forceUpdate()

【讨论】:

以上是关于Vue 3 中的 this.$forceUpdate 等效项 - 组合 API?的主要内容,如果未能解决你的问题,请参考以下文章

this.$refs 使用 Vue 3 选项 API 为空

vue 中的this问题

Vue删除data列表中的项

javascript中的this到底指啥?

vue模板内用箭头函数轻松的增加了第二参数吗?

vue2升级vue3: TSX Vue 3 Composition API Refs