vue 二维菜单多选

65 阅读1分钟

image.png

<html lang="en">
<head>
    <title>Document</title>
    <meta charset="utf-8">
    <!-- 引入本地组件库 -->
    <script src="https://unpkg.com/vue@2/dist/vue.js"></script>
    <!-- 引入样式 -->
    <link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
    <!-- 引入组件库 -->
    <script src="https://unpkg.com/element-ui/lib/index.js"></script>
    <style lang="scss" scoped>
      @mixin fs12{
        font-size: 12px;
        font-weight: normal;
      }
      .icon {
        width: 2.2em; height: 2.2em;
        vertical-align: -0.15em;
        fill: currentColor;
        overflow: hidden;
      }
      .page-white{
        background: #fff;
        height: 100vh;
        overflow: auto;
        padding:30px 30px 120px;
        box-sizing: border-box;
        .skip{
          display: flex;
          justify-content: flex-end;
          span{
            border-radius: 30px;
            border: 1px solid #EBEFF3;
            padding:7px 20px;
            color:#728195;
            font-size: 12px;
          }
        }
        h2{
          font-size: 26px;
          font-weight: bold;
          text-align: center;
          small{
            color:#728195;
            @include fs12;
            display: block;
          }
        }
        .board-list{
          & > li {
            & > span {
              font-size: 18px;
              color: #222C39;
              margin-bottom: 12px;
              display: block;
              margin-top: 24px;
            }
            & > ul.sub-list{
              display: grid;
              grid-template-columns: repeat(3,1fr);
              grid-gap: 15px;
              li {
                background:#F6F7FC;
                border-radius: 16px;
                padding:26px 0;
                display: flex;
                flex-direction: column;
                align-items: center;
                border:3px solid transparent;
                span{
                  color:#222C39;
                  font-size:14px;
                  margin-bottom: 0;
                  margin-top: 4px;
                }
                &.active{
                  background: #D8EBFF;
                  border:3px solid #1B73E9;
                }
              }
            }
          }
        }
        .btn-fixed{
          position: absolute;
          left:45px;
          right:45px;
          bottom:30px;
          height: 54px;
          color:#fff;
        }
      }
    </style>
</head>

<body>
<div id="app">
    <!-- 待选标签 -->
    <ul class="board-list">
        <li v-for="(item,itemIndex) in boardList" :key="item.id">
            <span>{{item.title}}</span>
            <ul class="sub-list">
                <li v-for="(sub,subIndex) in item.subMenu" :class="{'active':isActive(item,sub)}"  :key="sub.subIndex"  @click="currentToggle(item,sub)">
                    <i :class="item.icon" class=""></i>
                    <span>{{sub.name}}</span>
                </li>
            </ul>
        </li>
    </ul>
</div>

<script>
    var app = new Vue({
        el: '#app',
        data() {
            return {
                boardList:[
                    {
                        title: '经济运行',
                        id:1,
                        subMenu:[
                            {
                                icon:'#icon-a-iconxianxingshuishou',
                                name:'税收'
                            },
                            {
                                icon:'#icon-a-iconxianxingzhaoshang',
                                name:'招商引资'
                            },
                            {
                                icon:'#icon-a-iconxianxingyingshanghuanjing',
                                name:'营商环境'
                            }
                        ]
                    },{
                        title: '综合监管',
                        id:2,
                        subMenu:[
                            {
                                icon:'#icon-a-iconxianxingjianguan',
                                name:'分类1'
                            },
                            {
                                icon:'#icon-a-iconxianxingjianguan',
                                name:'分类2'
                            },
                            {
                                icon:'#icon-a-iconxianxingjianguan',
                                name:'分类3'
                            }
                        ]
                    },{
                        title: '城市管理',
                        id:3,
                        subMenu:[
                            {
                                icon:'#icon-a-iconxianxingshehuibaozhang',
                                name:'社会保障底线'
                            },
                            {
                                icon:'#icon-a-iconxianxingchengshi',
                                name:'提升城市品质'
                            },
                            {
                                icon:'#icon-a-iconxianxinghuanjing',
                                name:'生态环境'
                            }
                        ]
                    },{
                        title: '基层治理',
                        id:4,
                        subMenu:[
                            {
                                icon:'#icon-a-iconxianxingwangluo',
                                name:'一网统管'
                            },
                            {
                                icon:'#icon-a-iconxianxingpinganchengqu',
                                name:'平安城区'
                            },
                            {
                                icon:'#icon-a-iconxianxingjiayuan',
                                name:'同心家园'
                            }
                        ]
                    },{
                        title: '总体安全',
                        id:5,
                        subMenu:[
                            {
                                icon:'#icon-a-iconxianxingjianguan3',
                                name:'分类1'
                            },
                            {
                                icon:'#icon-a-iconxianxingjianguan3',
                                name:'分类2'
                            },
                            {
                                icon:'#icon-a-iconxianxingjianguan3',
                                name:'分类3'
                            }
                        ]
                    }
                ],
                currentList:[],
            }
        },
        methods: {
            isActive(item,sub){
                let checkItem = {
                    id:item.id,
                    name: sub.name
                }
                return this.currentList.some(cItem=>{
                    return cItem.id === checkItem.id && cItem.name === checkItem.name
                })
            },
            currentToggle(item,sub){
                let checkItem = {
                    id:item.id,
                    name: sub.name
                }
                console.log(checkItem);
                if(this.currentList.some(cItem=>{
                    return cItem.id === checkItem.id && cItem.name === checkItem.name
                })){
                    this.currentList = this.currentList.filter((v) => {
                        if(v.id === checkItem.id && v.name === checkItem.name){
                            return false
                        }
                        return true
                    })
                } else {
                    this.currentList.push(checkItem)
                }
            }
        }
    });
</script>

</body>

</html>