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