我正在使用Laravel并尝试学习Vue.js.我有一个正常工作的删除请求,并从数据库中删除该对象。问题是在成功删除后没有从DOM中删除它。我正在使用$remove
方法并将其传递给完整的对象,所以我知道我错过了一些东西。
作为旁注,我有main.js
作为入口点,PersonTable.vue
作为组件。 PersonTable.vue
包含该模板的模板和脚本。
这是我的Laravel观点:
<div id="app">
<person-table list="{{ $persons }}">
</person-table>
</div>
这是我的`PersonTable.vue:
<template id="persons-template">
<div class="container">
<div class="row">
<div class="col-sm-12">
<h1>Persons List</h1>
<table class="table table-hover table-striped">
<thead>
<tr>
<td>First Name</td>
<td>Last Name</td>
<td>Email</td>
<td>Gender</td>
</tr>
</thead>
<tbody>
<tr v-for="person in list">
<td>{{person.first_name }}</td>
<td>{{person.last_name }}</td>
<td>{{person.email }}</td>
<td>{{person.gender }}</td>
<td><span @click="deletePerson(person)">X</span>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</template>
<script>
export default {
template: '#persons-template',
props: ['list'],
methods: {
deletePerson: function(person) {
this.$http.delete('/person/' + person.id).then(
function(response) {
this.persons.$remove(person);
}
);
}
},
created: function() {
this.persons = JSON.parse(this.list);
}
};
</script>
我的main.js
入口点:
var Vue = require('vue');
Vue.use(require('vue-resource'));
var Token = document.querySelector('meta[name="_token"]').getAttribute('content');
Vue.http.headers.common['X-CSRF-TOKEN'] = Token;
import PersonTable from './components/PersonTable.vue';
new Vue({
el: '#app',
components: { PersonTable },
})
答案 0 :(得分:7)
我认为您需要将this
绑定到响应函数:
function(response) {
this.persons.$remove(person);
}.bind(this)
当你执行this.persons
时,你仍然指的是Vue组件
编辑:可以尝试 -
props:['personJson'],
data:function(){
return {
persons:[]
}
},
ready:function(){
this.persons = JSON.parse(this.personJson)
}
想想,因为persons
最初是一个字符串,Vue没有正确绑定反应能力?
答案 1 :(得分:2)
我认为您需要在创建的方法中使用this.$set
,如果您不这样做,我担心Vue会失去反应性。
在created
方法中,您可以尝试以下方法:
export default {
template: '#persons-template',
props: ['persons'],
methods: {
deletePerson: function(person) {
var self = this;
this.$http.delete('/person/' + person).then(
function(response) {
self.persons.$remove(person);
}
);
}
},
created: function() {
this.$set('persons',JSON.parse(this.persons));
}
};
答案 2 :(得分:-1)
终于明白了。我需要将JSON数据传递给组件的data
属性。这是代码。
在刀片文件中:
<div id="app">
<person-table list="{{ $persons }}">
</person-table>
</div>
在我的PersonTable.vue文件中:
<template id="persons-template">
<div class="container">
<div class="row">
<div class="col-sm-12">
<h1>Persons List</h1>
<table class="table table-hover table-striped">
<thead>
<tr>
<td>First Name</td>
<td>Last Name</td>
<td>Email</td>
<td>Gender</td>
</tr>
</thead>
<tbody>
// Notice how I am using persons here instead of list
<tr v-for="person in persons">
<td>{{person.first_name }}</td>
<td>{{person.last_name }}</td>
<td>{{person.email }}</td>
<td>{{person.gender }}</td>
<td><span class="delete person" @click="deletePerson(person)"><i class="fa fa-close"></i></span>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</template>
<script>
export default {
template: '#persons-template',
props: ['list'],
data: function() {
return {
persons: []
}
},
methods: {
deletePerson: function(person) {
this.$http.delete('/person/' + person.id).then(
function(response) {
this.persons.$remove(person);
}
);
},
},
created: function() {
// Pushing the data to the data property so it's reactive
this.persons = JSON.parse(this.list);
},
};
</script>
感谢大家的贡献。由于修复此错误需要多长时间,我几乎抛弃了Vue。