antd vue json渲染的导航栏

antd vue json渲染的管理系统

布局组件

<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><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) {
      if(this.panes){
         this.panes.splice(targetKey,1)
          if(targetKey>0){
           let len=this.panes.length
           this.$store.commit('setHtmlUrl',this.panes[len-targetKey-1].item.value.url)
         }else{
             this.$store.commit('setHtmlUrl',this.panes[targetKey+1].item.value.url)
		}
      }else{
             this.$store.commit('setHtmlUrl','')
		}
   
    },
},
}
</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" @mouseover="hover=true" @mouseleave="false">
        <span slot="title">
          <img :src="menuInfo.src | srcHover" v-if="hover" />
          <img :src="menuInfo.src | src" v-else />
        </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,
  data(){
  return {
  hover:false
},
filters:{
	src:function(str){
		if(!str) return 
		var newUrl=require(''@assets/img/'+str)
		return newUrl
	},
	srcHover(str){
		if(!str) return 
		var newStr=str.split('.')
		var newUrl=newStr[0].concat('_hover.png')
		var url=require(''@assets/img/'+newUrl)
		return url
	}
}

  
  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、付费专栏及课程。

余额充值