我试图在VueJS中使用转换来处理表格单元格元素,并让它们处理在对象中更改的项目。我正在使用Vuex进行数据存储,而我似乎无法让它们在单个单元格上工作(See Fiddle 1)
// This call state data.
const state = {
items: [{
id: 1,
text: 'Hello',
name: 'Bill'
}, {
id: 2,
text: 'There',
name: 'Diane'
}, {
id: 3,
text: 'My',
name: 'John'
}, {
id: 4,
text: 'Name',
name: 'Anne'
}, {
id: 5,
text: 'is',
name: 'Fred'
}, {
id: 6,
text: 'Hello',
name: 'Yasmine'
}, ]
}
// This is look like events.
const mutations = {
UPDATEITEM(state, item) {
var changedItem = state.items.find((checkItem) => {
return checkItem.id == item.id;
});
if (item.text) {
changedItem.text = item.text;
} else if (item.name) {
changedItem.name = item.name;
}
},
}
// This is store!!!.
const store = new Vuex.Store({
state,
mutations,
getters: {
items: function(state) {
return state.items
}
},
// Call action to dispatch
actions: {
UPDATEITEM: function(store, item) {
store.commit('UPDATEITEM', item)
}
}
})
// Vue
const vm = new Vue({
el: '#container',
data: {
id: 3,
name: '',
text: ''
},
store,
methods: {
changeName: function() {
const item = {
id: this.id,
name: this.name
};
this.$store.dispatch('UPDATEITEM', item);
},
changeText: function() {
const item = {
id: this.id,
text: this.text
};
this.$store.dispatch('UPDATEITEM', item);
},
getItemById: function(id) {
var item = this.items.find((checkItem) => {
return checkItem.id == id;
});
if (item) {
return item;
} else {
return {
name: ''
};
}
}
},
computed: {
items: {
get() {
return this.$store.getters.items;
}
}
}
})

.update-enter-active {
transition: all .5s ease-in;
}
.update-leave-active {
transition: all .5s ease-out;
}
.update-enter, .update-leave-to {
opacity: .5;
background-color: #fd0;
}

<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.4.4/vue.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/vuex/2.4.0/vuex.js"></script>
<div id="container">
<ul>
<table>
<thead>
<tr>
<th>Name</th>
<th>message</th>
</tr>
</thead>
<tbody>
<tr v-for="item in items">
<td><transition name="update"><span :key="item.id + '-name'">{{item.name}}</span></transition></td>
<td><transition name="update"><span :key="item.id + '-text'">{{item.text}}</span></transition></td>
</tr>
</tbody>
</table>
</ul>
<div>
User id:
<input v-model="id">
{{getItemById(id).name}}
</div>
<div>
Change Name:
<input v-model="name" v-on:keyup.enter="changeName">
</div>
<div>
Change Text:
<input v-model="text" v-on:keyup.enter="changeText">
</div>
</div>
&#13;
或行(See Fiddle 2)的转换组:
// This call state data.
const state = {
items: [{
id: 1,
text: 'Hello',
name: 'Bill'
}, {
id: 2,
text: 'There',
name: 'Diane'
}, {
id: 3,
text: 'My',
name: 'John'
}, {
id: 4,
text: 'Name',
name: 'Anne'
}, {
id: 5,
text: 'is',
name: 'Fred'
}, {
id: 6,
text: 'Hello',
name: 'Yasmine'
}, ]
}
// This is look like events.
const mutations = {
UPDATEITEM(state, item) {
var changedItem = state.items.find((checkItem) => {
return checkItem.id == item.id;
});
if (item.text) {
changedItem.text = item.text;
} else if (item.name) {
changedItem.name = item.name;
}
},
}
// This is store!!!.
const store = new Vuex.Store({
state,
mutations,
getters: {
items: function(state) {
return state.items
}
},
// Call action to dispatch
actions: {
UPDATEITEM: function(store, item) {
store.commit('UPDATEITEM', item)
}
}
})
// Vue
const vm = new Vue({
el: '#container',
data: {
id: 3,
name: '',
text: ''
},
store,
methods: {
changeName: function() {
const item = {
id: this.id,
name: this.name
};
this.$store.dispatch('UPDATEITEM', item);
},
changeText: function() {
const item = {
id: this.id,
text: this.text
};
this.$store.dispatch('UPDATEITEM', item);
},
getItemById: function(id) {
var item = this.items.find((checkItem) => {
return checkItem.id == id;
});
if (item) {
return item;
} else {
return {
name: ''
};
}
}
},
computed: {
items: {
get() {
return this.$store.getters.items;
}
}
}
})
&#13;
.update-enter-active {
transition: all .5s ease-in;
}
.update-leave-active {
transition: all .5s ease-out;
}
.update-enter, .update-leave-to {
opacity: .5;
background-color: #fd0;
}
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.4.4/vue.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/vuex/2.4.0/vuex.js"></script>
<div id="container">
<ul>
<table>
<thead>
<tr>
<th>Name</th>
<th>message</th>
</tr>
</thead>
<tbody name="update" is="transition-group">
<tr v-for="item in items" :key="item.id">
<td>{{item.name}}</td>
<td>{{item.text}}</td>
</tr>
</tbody>
</table>
</ul>
<div>
User id:
<input v-model="id">
{{getItemById(id).name}}
</div>
<div>
Change Name:
<input v-model="name" v-on:keyup.enter="changeName">
</div>
<div>
Change Text:
<input v-model="text" v-on:keyup.enter="changeText">
</div>
</div>
&#13;
是否无法使用对象成员(文本,名称)进行转换,或者我做错了什么?
答案 0 :(得分:2)
试试这个键:
<td><transition name="update">
<span :key="item.name">{{item.name}}</span>
</transition></td>