新手使用VUE做菜单/组织结构树

        本人之前一直做得java后端,了解一点前端没有正式自己做过项目,都是改改别人东西,近期觉得得前后通吃,就随手搭建了一个前后端分离的项目,前端用的vue,这里分享下常用到的菜单树,前端新手不足的地方希望能有大佬指出,感谢!

        本来看了下论坛什么的,人家用的element-ui的el-tree,我试用了下,对修改样式,包括里面的动态添加节点,鼠标事件等等想做性化修改时总有问题,就自己写了一个,为了方便其他人拷贝参照,这里分享整片代码。

        

<template>
  <div id="menumanage" >
    <div class="menulist" @contextmenu.prevent="test">
      <div :class="rootmenu.checkroute ? 'menusselected': 'menus'" @click="loademenu(rootmenu,olddata)">
        <span class="spanclass">{{rootmenu.name}}</span><img :class="rootmenu.route ? 'imgclassdown': 'imgclass'" style="float: right;height: 21px;width: 21px;" src="../../../assets/next.png"/>
      </div>
      <div v-if="firstshow"  v-for="item in menus" >
        <div :class="item.checkroute ? 'menusselected': 'menus'" @click="getmenus(item,olddata)">
          <span class="spanclass firstspan">{{item.menuName}}</span><img :class="item.route ? 'imgclassdown': 'imgclass'" style="float: right;height: 21px;width: 21px;" src="../../../assets/next.png"/>
        </div>
        <div v-if="item.childshow"  v-for="item_s in item.children" >
         <div :class="item_s.checkroute ? 'menusselected': 'menus'" @click="getmenus(item_s,olddata)">
            <span class="spanclass firstspan secondspan">{{item_s.menuName}}</span><img :class="item_s.route ? 'imgclassdown': 'imgclass'" style="float: right;height: 21px;width: 21px;" src="../../../assets/next.png"/>
          </div>
        </div>
      </div>
    </div>
  </div>
</template>

<script>export default {
  data () {
    return {
      rootmenu: {
        id: 'sfawgg',
        name: '根菜单',
        route: false,
        checkroute: false
      },
      firstshow: false,
      olddata: {
        id: 'sfawgg',
        name: '根菜单',
        route: false,
        checkroute: false
      },
      menus: []
    }
  },
  mounted () {
  },
  methods: {
    loademenu (datanow, olddata) {
      // 重置上一个节点
      // this.olddata.route = !this.olddata.route
      this.olddata.checkroute = false
      // 这里循环关闭下子节点 逻辑不是很好 欢迎指正
      this.menus.forEach(element => {
        element.route = false
        // console.log(this.orglist)
      })
      // 复制历史节点
      this.olddata = datanow
      datanow.route = !datanow.route
      datanow.checkroute = !datanow.checkroute
      this.firstshow = !this.firstshow
      // 加载所有一级菜单
      // 后台接口获取数据
      if (this.firstshow === true) {
        this.$http.get(config.server + '/menu/getallmenu', {
          headers: {
            'authorization': sessionStorage.getItem('token')
          },
          params: {
            level: '1',
            id: '-1'
          }
        })
          .then((response) => {
            if (response.data.status === 10002) {
              this.$message('未加载到数据')
            } else if (response.data.status === 10001) {
              // 清空历史记录
              this.menus = []
              response.data.data.forEach(element => {
                const newChild = {
                  id: element.id,
                  menuId: element.menuId,
                  menuName: element.menuName,
                  objectId: element.menuUrl,
                  level: element.level,
                  delFalg: element.delFalg,
                  pMenuId: element.pMenuId,
                  checkroute: false,
                  route: false,
                  childshow: false,
                  children: []
                }
                this.menus.push(newChild)
              })
            } else {
              this.$message('发生内部错误,请重试')
            }
          })
          .catch(function (error) {
            console.log(error)
          })
      }
    },
    getmenus (thismenu, olddata) {
      olddata.checkroute = false
      this.olddata = thismenu
      thismenu.route = !thismenu.route
      thismenu.checkroute = true
      // 获取下级菜单
      thismenu.childshow = !thismenu.childshow
      if ( thismenu.childshow === true) {
        this.$http.get(config.server + '/menu/getallmenu', {
          headers: {
            'authorization': sessionStorage.getItem('token')
          },
          params: {
            level: '2',
            id: thismenu.id
          }
        })
          .then((response) => {
            if (response.data.status === 10002) {
              this.$message('未加载到数据')
            } else if (response.data.status === 10001) {
              // 清空历史记录
              thismenu.children = []
              response.data.data.forEach(element => {
                const newChild = {
                  id: element.id,
                  menuId: element.menuId,
                  menuName: element.menuName,
                  objectId: element.menuUrl,
                  level: element.level,
                  delFalg: element.delFalg,
                  pMenuId: element.pMenuId,
                  checkroute: false,
                  route: false,
                  childshow: false
                }
                thismenu.children.push(newChild)
              })
            } else {
              this.$message('发生内部错误,请重试')
            }
          })
          .catch(function (error) {
            console.log(error)
          })
      }
    },
    test () {
      alert(111)
    }
  }
}
</script>
<style>
  #menumanage{
    border: 1px red solid;
    padding: 20px;
  }
  .menus{
    padding: 2px;
    color: #000000a8;
  }
  .menus:focus{
    /*padding: 2px;*/
    color: #b9b1b13d;
  }
  .menus:hover{
    background: #b9b1b13d;
  }
  .menusselected{
    padding: 2px;
    background: #b9b1b13d;
    color: #000000a8;
  }
  .menulist{
    /*border: 1px blue solid;*/
    height: 400px;
    width: 200px;
    display: inline-block;
    background: rgba(255, 255, 255, 0.1);
  }
  .spanclass{
    /*position: absolute;*/
    top: 50%;
    /*margin-top: -10.5px;*/
  }
  .firstspan{
    margin-left: 20px;
  }
  .secondspan{
    margin-left: 40px;
  }
  .imgclass{
    transition: all 0.2s;
  }
  .imgclassdown{
    transform:rotate(90deg);
    transition: all 0.2s;
  }
</style>

        

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue 3中,我们可以使用组织结构图来展示不同组件之间的关系。组织结构图是一种可视化工具,可以帮助我们更好地理解和管理整个Vue项目的结构。 首先,我们可以使用Vue 3的官方命令行工具Vue CLI创建一个新的Vue项目。在项目中,我们可以使用Vue Router来管理不同页面之间的导航和路由。在组织结构图中,我们可以将Vue Router作为项目的根节点,表示项目的整体结构。 接下来,我们可以创建不同的Vue组件,每个组件负责一个特定的功能。在组织结构图中,我们可以将这些组件作为Vue Router的子节点,表示它们是由Vue Router管理和导航的。 除了Vue组件,我们还可以在组织结构图中表示其他的结构化内容,例如Vue插件、开发工具和第三方库等。这些内容可以作为Vue组件的子节点或者兄弟节点,表示它们与Vue组件之间的关系。 在组织结构图中,我们可以使用不同的形状、颜色和线条来表示不同类型的节点和关系。例如,我们可以使用长方形表示Vue组件,使用圆形表示Vue插件,使用实线表示父子关系,使用虚线表示兄弟关系等。 通过使用组织结构图,我们可以更清晰地展示和描述整个Vue项目的结构。这不仅有助于我们理解和维护项目,还可以帮助团队成员之间更好地进行沟通和协作。同时,组织结构图也可以帮助我们发现和解决项目中的潜在问题和风险。 综上所述,Vue 3中可以使用组织结构图来展示和管理项目的结构,从而提高开发效率和团队协作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值