【问题标题】:Vue - Issue with props filled using axios requestVue - 使用 axios 请求填充道具的问题
【发布时间】:2019-11-13 10:12:07
【问题描述】:

我有3个vue组件List、Car、AddNew

List.vue 是父组件,有 2 个这样的组件:

<add-new :cars-models="carModels"></add-new>                

<car
 v-for="(car, index) in items"              
:key="car.id" 
:data="car" 
:car-models="carModels" 
>                   
</car>  

后来有这个:

data(){

   return{
     items:'',
     carModels:''     
  }

}
,
created(){
     axios.get('car-models')
         .then(({data})=>{                              
            this.carModels= data;                           
        }); 

      axios.get('cars')
         .then(({data})=>{                  
            this.items = data;  
         });                    
}

addNew.vue 我有这个:

props: ['carModels'],
data(){
   return {
      models:''
   }
},
watch:{

        carModels(){
            this.models= this.carModels;
        }

    }

我不得不使用观察者,因为父组件中填充了carModels,这里可以吗,但是,在Car.vue

props: ['carModels'],
data(){
   return {
      models:''
   }
},
watch:{

        carModels(){
            this.models= this.carModels;
        }

    }

正如你所看到的,它是一样的,但是 this.models 没有用道具 carModels 填充,尽管道具被填充了!。我不知道发生了什么。 谢谢

【问题讨论】:

  • 控制台有错误吗?

标签: javascript vue.js axios vue-component


【解决方案1】:

我的猜测是这是一个时间问题。观察者 carModels 没有被触发,因为 carModels 的值自组件创建以来就存在。您可以做的是修改数据,使其看起来像这样:

 return {
      models:this.carModels
   }

这样,props 数据首先被复制,然后在 props 更新时由 watcher 更新

props: ['carModels'],
data(){
   return {
      models:this.carModels
   }
},
watch:{    
        carModels(){
            this.models= this.carModels;
        }    
    }

【讨论】:

  • 现在可以了,谢谢,但我想知道为什么在其他组件中一切正常
  • axios 调用是异步的,所以它们可能会在调用创建的方法后的某个时间完成。事实上,创建的方法很可能会完成,并且组件将在您的数据返回之前到达挂载的方法。这意味着您的第一个组件将在没有数据的情况下呈现,然后它将在到达时提供数据,因此它会触发您的观察者
  • 您的第二个组件不同,因为它是一个 for 语句,除非有数据要迭代,否则它们不存在。 watcher 正在等待 parent 修改 prop 的值。它不会在创建组件时触发因此,如果您首先获得模型列表,那么稍后您将获得汽车列表。 Vue 会在 watcher 激活之前渲染已经填充模型 props 的汽车组件,因此它不会触发 watcher。这就是为什么在这种情况下,您还需要确保将道具复制到您的数据中。
猜你喜欢
  • 2021-10-20
  • 1970-01-01
  • 1970-01-01
  • 2019-06-08
  • 2017-05-28
  • 2023-03-12
  • 2021-03-09
  • 2020-02-14
  • 2021-04-07
相关资源
最近更新 更多