please tell me how to make a unique key for v-forFor example, if you use the index as a key, then the last element will always be animated. Several elements with the same text can exist at the same time.How can I implement thisMath.random is unlikely to be a good problem-solving solutionCan I use something like Symbol for a unique id

<!DOCTYPE html><header><script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.js"></script></header><body><div id="message"><transition-group name="msgAnimation" tag="div"><div v-for="(msg, i) in messages" :key="i" class="wrapper"><div class="wrapper__block" @click="messages.splice(i, 1)">{{ msg }}</div></div></transition-group></div></body><style>#message {display: flex;flex-direction: column;}.msgAnimation-enter-active,.msgAnimation-leave-active {transition: opacity 1s;}.msgAnimation-enter,.msgAnimation-leave-to {opacity: 0;}.wrapper {width: 100%;height: 9vmin;margin: 1vmin;}.wrapper__block {background: green;height: 100%;width: 100%;}</style><script>new Vue({el: '#message',data: {messages: ["hi","hi","123321","hi","32112332112sdfs","hi","qweewq","ashjdddsa","asdfddsa","asggghjddsa","ashddsa","asjghjddsa","asjddsa","asdddsa",],},})</script></html>

1

Best Answer


If you have only strings you should wrap each message with object. It's more convenient way to use id instead of index in your case.

data: {currentId: 0,messages: ["hi","hi","123321","hi",]},created: function() {this.messages = this.messages.map(function(message) {return this.wrap(message)})},methods: {wrap: function(msg) { // make message object with unique (not random) id.return {id: ++this.currentId,message: msg}},addMessage: function(msg) {this.messages.push(this.wrap(msg))}}

Now, each new message has own unique id, so problem with removing message by index should gone.

Then key message by id:

<div v-for="(msg, i) in messages" :key="msg.id" class="wrapper"><div class="wrapper__block" @click="messages.splice(i, 1)">{{ msg.message }}</div></div>