承诺解决并将道具传递给嵌套子项时如何更新Vue组件

Posted

技术标签:

【中文标题】承诺解决并将道具传递给嵌套子项时如何更新Vue组件【英文标题】:How to update Vue component when promise resolve AND passing props to nested children 【发布时间】:2020-12-02 15:30:42 【问题描述】:

我有父组件和子组件。父母的数据是在 ajax 调用后填充的,我想将其作为道具传递给孩子。

我尝试了不同的解决方案,我将发布两个,但还没有工作:你能指出错误吗?

组件确实会对更改做出反应。我还需要确保将道具正确传递给孩子及其嵌套的孩子。

尝试:

如果我不使用'v-if' 指令,我会收到:query 的错误是 作为 null 传递。

所以我使用v-if(请参阅下面的版本) 并更新渲染,但它没有反应并保持空白(甚至 尽管数据已正确更新)。

我还尝试在不使用的情况下将查询数据初始化为计算结果 v-if 指令,因为毕竟我只需要缓存结果 前提。

我也尝试在总线上发出事件,但组件没有 做出反应。

最后我尝试通过使用 :key(例如:key="ready")应该使组件在以下情况下反应 :key 更改。但还是没有效果。

模板:

<template>
  <div v-if="isLoaded()">
      <input>
      <metroline></metroline>
      <grid :query="query"></grid>
  </div>
</template>

脚本:

export default 

data() 
  return 
    ready : false,
    query : null
  
,
components : 
  metroline : Metroline,
  grid : Grid
,
methods: 

    isLoaded() 
      return this.ready
    ,

    firstQuery( uid, limit, offset) 

      var url = // my url
      
      // using Jquery to handle cross origin issues, solving with jsonp callback...
      
      return $.ajax(
        url : url,
        dataType: 'jsonp',
        jsonpCallback: 'callback',
        crossDomain: true 
        
        )

    

,
created() 
  var vm = self;

  this.firstQuery(...)
      .then(function(data)
                 this.query = data;
                 console.log('firstQuery', this.query);

                 // attempts to pass through the query
                 // bus.$emit('add-query', this.query);

                 this.ready = true;
                 self.isLoaded(); // using a self variable, temporarily, jquery deferred messed up with this; however the this.query of vue instance is properly updated
                 
            )

【问题讨论】:

【参考方案1】:

在 created 钩子中,将组件实例 this 分配给一个名为 that 的变量,并在回调中访问它,因为在回调中你在 vue 组件上下文之外(this):


created() 
  var vm = self;
  var that=this;
  this.firstQuery(...)
      .then(function(data)
                 that.query = data;
                 console.log('firstQuery', this.query);

              

                 that.ready = true;
                 self.isLoaded(); 
            )


【讨论】:

哦,谢谢@Boussadjra Brahim 我对承诺中的“this”对象感到困惑。我在 Promise 中使用 "console.log('firstQuery', this.query) 来检查是否更新,但我只是在 Promise 上创建了一个属性。 附注我查看了您的个人资料 - 您可能想在组件的 git 页面(vueye 等)中添加演示 不客气,感谢您访问我的个人资料,如果您查看组件存储库,您会找到演示

以上是关于承诺解决并将道具传递给嵌套子项时如何更新Vue组件的主要内容,如果未能解决你的问题,请参考以下文章

通过 Vue.js 中的 slot-scope 将 props 传递给所有子项的正确方法

vue,发射与传递函数作为道具

如何将道具传递给递归子组件并保留所有道具

如何将对象数组作为道具传递给组件,然后将数组的成员作为道具传递给嵌套组件?

如何在单个文件 vue 组件中的初始化时将道具传递给 vue 组件(vue-loader 中的依赖注入)?

Vue 2 从嵌套组件更新数组中对象的属性