Vue.js Vuejs反应性v-if模板组件

Vue.js Vuejs反应性v-if模板组件,vue.js,Vue.js,我正在努力理解如何使我的组件具有反应性。此时按钮已正确呈现,但一旦发生创建/删除事件,模板不会更改。关于事件发生后如何更新组件的任何提示 new Vue({ el: '#app' }); Vue.component('favourite-button', { props: ['id', 'favourites'], template: '<input class="hidden" type="input" name="_method" value="{{ id }}" v-

我正在努力理解如何使我的组件具有反应性。此时按钮已正确呈现,但一旦发生创建/删除事件,模板不会更改。关于事件发生后如何更新组件的任何提示

new Vue({
  el: '#app'
});


Vue.component('favourite-button', {
  props: ['id', 'favourites'],
  template: '<input class="hidden" type="input" name="_method" value="{{ id }}" v-model="form.listings_id"></input><button v-if="isFavourite == true" class="favourited" @click="delete(favourite)" :disabled="form.busy"><i class="fa fa-heart" aria-hidden="true"></i><button class="not-favourited" v-else @click="create(favourite)" :disabled="form.busy"><i class="fa fa-heart" aria-hidden="true"></i></button><pre>{{ isFavourite == true }}</pre>',

  data: function() {
    return {
        form: new SparkForm({
            listings_id: ''
        }),
    };

  },


  created() {
      this.getFavourites();

  },

  computed: {
      isFavourite: function() {

        for (var i = 0; this.favourites.length; i++)
          {
            if (this.favourites[i].listings_id == this.id) {
            return true;

          }
        }
      },

    },

  methods: {

    getFavourites() {
        this.$http.get('/api/favourites')
          .then(response => {
            this.favourites = response.data;
          });
        },

    create() {
        Spark.post('/api/favourite', this.form)
            .then(favourite => {
            this.favourite.push(favourite);
            this.form.id = '';

            });


        },

        delete(favourite) {
            this.$http.delete('/api/favourite/' + this.id);
            this.form.id = '';

        }
      }

    });

Vue.component('listings',  {
    template: '#listing-template',

    data: function() {
      return {
            listings: [], favourites: [],
        };
    },

    created() {
        this.getListings();
    },

    methods: {
      getListings() {
          this.$http.get('/api/listings')
            .then(response => {
              this.listings = response.data;
          });
        }
      }
});
newvue({
el:“#应用程序”
});
Vue.component('Favorite-button'{
道具:['id','favorites',],
模板:“{isfavorite==true}}”,
数据:函数(){
返回{
形态:新SparkForm({
清单\u id:“”
}),
};
},
创建(){
这个.getFavorites();
},
计算:{
isfavorite:function(){
对于(var i=0;this.favorites.length;i++)
{
if(this.favorites[i].listings_id==this.id){
返回true;
}
}
},
},
方法:{
GetFavorites(){
这是.http.get(“/api/favorites”)
。然后(响应=>{
this.favorites=response.data;
});
},
创建(){
Spark.post('/api/favorite',this.form)
。然后(收藏夹=>{
这个.favorite.push(favorite);
this.form.id='';
});
},
删除(收藏夹){
this.$http.delete('/api/favorite/'+this.id);
this.form.id='';
}
}
});
Vue.component('列表'{
模板:“#列出模板”,
数据:函数(){
返回{
列表:[],收藏夹:[],
};
},
创建(){
这个.getListings();
},
方法:{
getListings(){
这是.http.get(“/api/listings”)
。然后(响应=>{
this.listings=response.data;
});
}
}
});

Vue希望HTML模板标记完美无瑕。否则,您将遇到多个问题

我刚刚检查了您的模板,发现了一个问题-第一个
元素没有关闭

以下是代码的更新版本:

Vue.component('favorite-button'{
道具:['id','favorites',],
模板:`
编辑:在代码中发现可能的错误

以下是您的
收藏夹按钮
组件的
创建方法中的另一个问题:

方法:{
// ...
创建(){
Spark.post('/api/favorite',this.form)
。然后(收藏夹=>{
this.favorite.push(favorite);//注意:这是问题所在
this.form.id='';
});
},
//...
}

您的成功处理程序引用的是
this.favorite.push(…)
。您的组件的
数据
道具
中没有
this.favorites
。Vue希望HTML模板标记是完美的。否则您将遇到多个问题

我刚刚检查了您的模板,发现了一个问题-第一个
元素没有关闭

以下是代码的更新版本:

Vue.component('favorite-button'{
道具:['id','favorites',],
模板:`
编辑:在代码中发现可能的错误

以下是您的
收藏夹按钮
组件的
创建方法中的另一个问题:

方法:{
// ...
创建(){
Spark.post('/api/favorite',this.form)
。然后(收藏夹=>{
this.favorite.push(favorite);//注意:这是问题所在
this.form.id='';
});
},
//...
}

您的成功处理程序引用了
this.favorite.push(…)
。你没有
这个。你的组件的
数据
道具
中有最喜欢的
。应该是
这个吧。最喜欢的

谢谢,我没有发现问题,我还采用了你的多行模板的背景标记-非常有用!但是,这并没有修复按钮的反应性。我还在调查一个问题解决方案。@BenF您能检查我在上面答案中的编辑吗?您的
收藏夹按钮
组件的
创建
方法中有一个潜在的错误。注意并感谢。出于某种原因,
this.favorite.push(收藏夹);
this.favorites.push(收藏夹)
工作。问题是我没有看到按钮反应,因为我没有在
数据中动态调用
isfavorite
?我很惊讶这个.favorite.push可以工作,因为它在理想情况下会给出错误,比如
无法调用未定义的
推送。然而,
isfavorite
是一个计算属性,它h对我来说似乎没问题。只要正确计算其值,它就不必是
数据的一部分。这看起来不像是Vue渲染问题,但需要使用
控制台在很多地方彻底评估应用程序逻辑。使用您知道其输出的预定义测试数据记录
。最重要的是,如果逻辑正确,您需要测试
isfavorite
的computed属性。感谢mani,我没有发现错误,我还采用了您对多行模板的反勾号-非常有用!但是,这并没有修复按钮的反应性。我仍在研究解决方案。@BenF您能检查我在上面答案中的编辑吗?有一个p您的
创建
收藏夹按钮的
方法中存在潜在错误。注意并感谢。出于某种原因,
此.favorite.push(收藏夹);
此.favorites.push(收藏夹)
工作。问题是因为我没有在
数据中动态调用
isfavorite
,所以我看不到按钮有反应吗?我很惊讶这个.favorite.push可以工作,因为它会理想地给出错误,比如
不能调用未定义的push