antd vue json数据动态渲染导航

本文展示了使用Ant Design Vue库创建的非路由后台管理系统,包括布局组件和导航组件的实现。布局组件采用A-LAYOUT进行头部、侧边栏和主要内容区域的划分,支持动态添加和编辑标签页。导航组件则通过A-MENU和SUB-MENU实现多级菜单,动态响应用户的点击操作,并缓存导航历史。
摘要由CSDN通过智能技术生成

antd vue 非路由的后台管理系统

布局组件

<template>
  <div >
      <a-layout>
          <a-layout-header>
              <div class="logo"></div>
          </a-layout-header>
          <a-layout>
            <a-layout-sider> <sub-nav/></a-layout-sider>
            <a-layout>
             <a-layout-content>
                 <a-tabs  v-model="activeKey" hide-add type="editable-card" @edit="onEdit" @tabClick="jump">
                   <a-tab-pane v-for="(pane,index) in panes" :key="index" :tab="pane.title" :closable="pane.closable">{{pane.title}}</a-tab-pane>
                 </a-tabs>
                 <!-- <div class="html" v-html=""></div> -->
                 <!-- 可以模板引入外部html -->
                 <div><iframe :src="htmlUrl"></iframe></div>
             </a-layout-content>
            </a-layout>
          </a-layout>
      </a-layout>
  </div>
</template>

<script>
import subNav from './subNav'
import {mapState} from 'vuex'
export default {
components:{subNav},
data() {
    return {
        activeKey: undefined,
      newTabIndex: 0,
    }
},
computed: {
    ...mapState({
        panes:(state)=>state.list,
        htmlUrl:(state)=>state.url
    })
},
methods: {
  callback(key) {
      console.log(key);
    },
    onEdit(targetKey, action) {
      this[action](targetKey);
    },
    jump(i){
        let {valueObj} =this.panes[i].item.value
       this.$store.commit('setUrl',valueObj.src)
    },
    remove(targetKey) {
      let activeKey = targetKey;
      this.panes.splice(targetKey,1)
    },
},
}
</script>

<style>

</style>

导航组件

<template>
  <div>
      <div class="box"></div>
      <a-menu>
    <a-menu
      mode="inline"
      theme="dark"
      :inline-collapsed="collapsed"
      @click="clickMenuItem"
    >
      <template v-for="item in list">
        <a-menu-item v-if="!item.children" :key="item.key" :title="item.title" :value="item">
          <a-icon type="pie-chart" />
          <span>{{ item.title }}</span>
        </a-menu-item>
        <sub-menu v-else :key="item.key" :menu-info="item" />
      </template>
    </a-menu>
  </div>
</template>

<script>
import { Menu } from 'ant-design-vue';
const SubMenu = {
  template: `
      <a-sub-menu :key="menuInfo.key" v-bind="$props" v-on="$listeners">
        <span slot="title">
          <a-icon type="mail" /><span>{{ menuInfo.title }}</span>
        </span>
        <template v-for="item in menuInfo.children">
          <a-menu-item v-if="!item.children" :key="item.key" :title="item.title" :value="item">
            <a-icon type="pie-chart" />
            <span>{{ item.title }}</span>
          </a-menu-item>
          <sub-menu v-else :key="item.key" :menu-info="item" :title="item.title" :value="item"/>
        </template>
      </a-sub-menu>
    `,
  name: 'SubMenu',
  // must add isSubMenu: true
  isSubMenu: true,
  props: {
    ...Menu.SubMenu.props,
    // Cannot overlap with properties within Menu.SubMenu.props
    menuInfo: {
      type: Object,
      default: () => ({}),
    },
  },
};
export default {
 components: {
    'sub-menu': SubMenu,
  },
  data() {
    return {
      collapsed: false,
      list: [],
     clickArr:[]
    };
  },
  created() {
      this.list=jssdk.dataJson.list
  },
  methods: {
    toggleCollapsed() {
      this.collapsed = !this.collapsed;
    },
    clickMenuItem(data){
        let itemUrl=''
        let isEqual=this.clickArr.some(item=>{
            if(!isEqual){
                this.clickArr.push(data)
            }
            itemUrl=data.item.value.itemUrl
            this.$store.commit('setPanes',this.clickArr)//缓存点击的导航item,layout里的panes
            this.$store.commit('setUrl',itemUrl)
        })
    }
  },
}
</script>

<style>

</style>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值