学习了vue,最近想着写一写demo练一练,今天写的二级菜单,中间踩过很多坑
1、存数据:最开始想着一级菜单存一个数组,二级菜单存不同的数组。那么问题来了,一级菜单和二级菜单应该是超级相关联的,如果分开存储再去建立关系很麻烦,所以存在一个数组对象中,那么也就是说,不管多少级菜单都可以这样,又方便还不需要我们自己去建立相关关系。
2、‘^’ 的变化,最开始想着不同状态用v-show去操作dom,这样的话就是让我们多写一个b标签,也不是不可行。不过我又想了一下,用动态改变class也是很方便,也就是用v-bind:class=“”,这样我们的样式不管怎么不同,改起来也很方便。
3、绑定点击事件的a标签,我最开始不小心写了href属性,导致一个啥问题呢,就是我们点击后,页面就会刷新,数据又变成了我们之前的数据,就感觉只是闪一下的出现我们要的东西。所以要把href去除,防止它刷新。不过有其他链接应该不一样。
index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>二级导航目录</title> <script src="vue.js"></script> <script src="index.js"></script> <link rel="stylesheet" href="index.css"> </head> <body> <div class="tree" id="my"> <ul> <li class="p_item" v-for="list in lists"> <!-- a标签不能带href,不然会刷新,刷新数据和没调用点击函数一样,此处踩坑了 --> <a class="p_title" v-on:click="curshow(list)">{{list.name}} <b :class="list.flag ? 'down': 'up'">^</b> </a> <ul class="c_item" v-if="list.flag"> <li v-for="sub in list.sublist"> <a>{{sub.name}}</a> </li> </ul> </li> </ul> </div> </body> </html>index.css
* { margin: 0px; padding: 0px; } ul,li { list-style-type: none; } body,html { width: 100%; height: 100%; } a { color: #fff; text-decoration: none; } .tree { width: 200px; height: 100%; background: #316BAA; } .p_title { color: #fff; display: block; padding: 15px; cursor: pointer; } .p_title b{ float: right; transition: all ease 1s; -webkit-transition: all ease 1s; -o-transition: all ease 1s; -moz-transition: all ease 1s; -ms-transition: all ease 1s; } .up { transform: rotate(0deg); -webkit-transform: rotate(0deg); -o-transform: rotate(0deg); -moz-transform: rotate(0deg); -ms-transform: rotate(0deg); } .down { transform: rotate(180deg); -webkit-transform: rotate(180deg); -o-transform: rotate(180deg); -moz-transform: rotate(180deg); -ms-transform: rotate(180deg); } .p_title:hover { color: #999; } .c_item a{ display: block; padding: 10px 20px; background: #275586; color: #fff; } .c_item li{ cursor: pointer; } .c_item li a:hover { color: #999; }index.js
window.onload = function () { var vm = new Vue({ el: '#my', data: { lists: [{ name: '运动服务', //用于状态判定 flag: false, //二级菜单 sublist: [ { name: '运动服务1'}, { name: '运动服务2'}, { name: '运动服务3'}, ] }, { name: '衣服包包', flag: false, sublist: [ { name: '裙子'}, { name: '套装'}, { name: '娃娃鞋'}, { name: '靴子'} ], }, { name: '母婴用品', flag: false, sublist: [ { name: '奶粉'}, { name: '尿不湿'}, { name: '婴儿床'} ] } ] }, methods: { curshow: function(list){ //如果状态是点开的,那么再次点击就隐藏 if(list.flag){ list.flag=false; } //若当前的是隐藏,则点击当前的显示,其余的隐藏 else{ for(let i=0;i<this.lists.length;i++){ this.lists[i].flag=false; } list.flag = true; } } } }) }