用vue写的带动画效果的留言板,但点击后总是最后一条留言带动画,而不是最新的一条。

我想实现的效果是点击发表后,最新的留言在最上面显示并且带动画效果(透明度从0到1,高度由0到30px)。为了让留言在最上面显示,我是用的this.list.unshift(this.msg)而不push,但却发现,即使最新留言在最上面显示了,动画效果却每次都是在最下面的那条微博上发生。请问如何实现每次都是让最上方的最新留言有动画效果?谢谢!

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.js"></script>
<style>
*{margin: 0;padding: 0;}
body{background-color: #fff;font-size: 13px;color: #333;font-family: "微软雅黑";}
ul{list-style: none;}


#main{
width: 480px;
/*height:270px;*/
padding:10px;
border:1px solid #ccc;
margin:50px auto;
}
#main textarea{
    width:100%;
    height:150px;
    box-sizing:border-box;
    display:block;
}
#main input[type=submit]{margin-top:5px;}
#main ul{margin:0 auto;width: 400px;}
#main ul li{
    height: 30px;
    line-height: 30px;
    border-bottom: 1px solid #ebebeb;
    color:red;
    position: relative;
}
.v-enter,.v-leave-to{height:0;opacity:0;}
.v-enter-active,.v-leave-active{
    transition:all 2s ease;
}
</style>
</head>
<body>
<div id="main">
    发表评论:<br>
    <textarea v-model="msg"></textarea>
    <input type="submit" value="发表" @click="add">
    <ul>
        <transition-group>
            <li v-for="(item,index) in list" :key="index">{{item}}</li>
        </transition>
    </ul>
</div>
</body>
<script>
var vm = new Vue({
    el:"#main",
    data:{
        msg:"",
        list:[]
    },
    methods:{
        add:function (){
            this.list.unshift(this.msg);
            this.msg = '';
        }
    }
});
</script> 
</html>
阅读 2.1k
1 个回答
<transition-group tag="ul" name="list">
    <li v-for="(item,index) in list" :key="index">{{item}}</li>
</transition>
.list-v-enter,.list-v-leave-to{height:0;opacity:0;}
.list-v-enter-active,.v-leave-active{
    transition:all 2s ease;
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题