【问题标题】:Vue.JS not update data into nested ComponentVue.JS 不会将数据更新到嵌套组件中
【发布时间】:2019-10-05 16:35:43
【问题描述】:

我正在使用 3 个 VUE 嵌套组件(主组件、父组件和子组件),但在传递数据时遇到问题。

主组件根据输入请求获取简单的API数据:结果用于获取其他组件中的其他信息。

例如,第一个 API 返回区域“DE”,填充第一个组件,然后尝试从区域“DE”获取“食谱”,但出现问题:控制台中的调试 cmets 顺序错误并且使用的变量在第二个请求中结果为空(第 3 步):

  app.js:2878 Step_1: DE 
  app.js:3114 Step_3:  0
  app.js:2890 Step_2: DE

这是父(包含在主组件中)代码:

父模板

<template>
   <div>
       <recipes :region="region"/>
   </div>
</template>

父代码

 data: function () {
        return {
            region: null,
        }
    },

 beforeRouteEnter(to, from, next) {

        getData(to.params.e_title, (err, data) => {
           
             console.log("Step_1: "+data.region); // return  Step_1: DE

             // here I ned to update the region value to "DE"
           
            next(vm => vm.setRegionData(err, data));
        });
    },

    methods: {
        setRegionData(err, data) {
            if (err) {
                this.error = err.toString();
            } else {
                console.log("Step_2: " + data.region); // return DE
                this.region = data.region;
                
            }
        }
    },

子模板

<template>
     <div v-if="recipes" class="content">
      <div class="row">
            <recipe-comp v-for="(recipe, index) in recipes" :key="index" :title="recipe.title" :vote="recipe.votes">
    </recipe-comp>
        </div>
       </div>
     </template>

子代码

props: ['region'],
....
 beforeMount () {
        console.log("Step_3 "+this.region); // Return null!!
        this.fetchData()
    },

我认为问题应该是父 beforeRouteEnter 钩子。

重要调试说明:

1) 看起来子代码工作正常,因为如果我将父数据中的默认值替换为“IT”而不是 null,子组件将返回正确的来自第二个 API 请求的食谱。这确认默认数据更新得太晚,而不是在第一次 API 请求得到结果时更新。

data: function () {
    return {
        region: 'IT',
    }
},

2)如果我在子模板中使用 {{region}},它会显示正确(和更新的)数据:'DE'!

我需要新鲜的眼睛来修复它。你能帮帮我吗?

【问题讨论】:

  • 您可以使用watch 代替孩子中的beforeMount 来表示该道具..?当该道具发生变化时,它会触发this.fetchData?老实说,我需要查看更多代码才能完全掌握逻辑......这感觉像是一个后勤问题。
  • 是的,我认为这也是一个逻辑问题。我已经用更多细节更新了这个问题:基本上第一步从用户输入中获取 ID 并运行返回用户数据 (REGION) 的第一个 API 请求。第二个组件应该将 REGION 传递给第二个 API 请求以获取配方,但是......出了点问题(请参阅我帖子中的第一个代码控制台日志块)。 A传递的值尚未更新。
  • 是的!谢谢!观看 'region': 'fetchData' 完美运行!我是如此接近,我测试了'this.region',但我不得不使用'region'。再次感谢您的宝贵时间!
  • 完全!!!再次感谢马特的帮助!我是 Vue.js 的初学者,使用不好的手表让我发疯了。当您发布您的答案时,我会提交它,我会删除我自己的答案。谢谢。

标签: laravel vue.js


【解决方案1】:

您应该能够使用watch 属性来完成此操作,而不是在子组件内部使用beforeMount 挂钩。我相信这是因为 beforeMount 钩子在父级能够设置该属性之前被触发。



简而言之,您可以尝试更改此设置:

props: ['region'],
....
 beforeMount () {
    console.log("Step_3 "+this.region); // Return null!!
    this.fetchData()
},

到这样的事情:

props: ['region'],
....
 watch: {
    region() {
        console.log("Step_3 "+this.region); // Return null!!
        this.fetchData()
    }
},

干杯!!

【讨论】:

  • 非常感谢!它有效。正如你所建议的,我使用了 watch 的快捷方式:watch: { 'region': 'fetchData'},现在组件和子组件是同步的!是的!
猜你喜欢
  • 2018-06-06
  • 2017-06-28
  • 2020-07-09
  • 2015-11-22
  • 2018-08-16
  • 1970-01-01
  • 1970-01-01
  • 2022-12-31
  • 2017-04-30
相关资源
最近更新 更多