亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

Vue.js遞歸組件實現組織架構樹和選人功能

2019-11-19 11:13:58
字體:
來源:轉載
供稿:網友

大家好!先上圖看看本次案例的整體效果。

浪奔,浪流,萬里濤濤江水永不休。如果在jq時代來實這個功能簡直有些噩夢了,但是自從前端思想發展到現在的以MVVM為主流的大背景下,來實現一個這樣繁雜的功能簡直不能容易太多。下面就手把手帶您一步步撥開這個案例的層層迷霧。

實現步驟如下:

1. api構建部門和員工信息接口,vuex全局存放部門list和員工list數據信息。

api:

export default { getEmployeeList () {  return {   returncode: 0,   message: '',   result: [    {     id: 1,     employeeName: '吳亦凡',     departmentId: 44    },    {     id: 2,     employeeName: '鹿晗',     departmentId: 45    },    {     id: 3,     employeeName: '孫紅雷',     departmentId: 44    },    {     id: 4,     employeeName: '周杰倫',     departmentId: 45    },    {     id: 5,     employeeName: '張國榮',     departmentId: 45    },    {     id: 6,     employeeName: '陳百強',     departmentId: 45    },    {     id: 7,     employeeName: '譚詠麟',     departmentId: 41    },    {     id: 8,     employeeName: '谷村新司',     departmentId: 45    },    {     id: 9,     employeeName: '中島美雪',     departmentId: 46    },    {     id: 10,     employeeName: '周潤發',     departmentId: 47    },    {     id: 14,     employeeName: '周慧敏',     departmentId: 58    },    {     id: 13,     employeeName: '張學友',     departmentId: 58    }   ]  } }, getDepartmentList () {  return {   returncode: 0,   message: '',   result: [    {     id: 40,     name: '研發一部',     parentId: 37,     sequence: 2    },    {     id: 41,     name: '研發二部',     parentId: 37,     sequence: 4    },    {     id: 43,     name: '市場',     parentId: 0,     sequence: 6    },    {     id: 44,     name: '銷售',     parentId: 0,     sequence: 4    },    {     id: 45,     name: '財務',     parentId: 0,     sequence: 5    },    {     id: 46,     name: '研發三部',     parentId: 37,     sequence: 1    },    {     id: 47,     name: '研發四部',     parentId: 37,     sequence: 3    },    {     id: 37,     name: '研發',     parentId: 0,     sequence: 5    },    {     id: 58,     name: '研發一部',     parentId: 57,     sequence: 1    },    {     id: 59,     name: '測試',     parentId: 0,     sequence: 5    },    {     id: 60,     name: '測試一部',     parentId: 59,     sequence: 1    },    {     id: 61,     name: '測試二部',     parentId: 59,     sequence: 2    },    {     id: 62,     name: '研發二部',     parentId: 57,     sequence: 2    }   ]  } }}

store:

import dataApi from '@/api/data.api.js'const state = { employeeList: [], departmentList: []}const getters = { employeeList: state => state.employeeList, departmentList: state => state.departmentList}const mutations = { SetEmployeeList (state, { employeeList }) {  state.employeeList = employeeList }, SetDepartmentList (state, { departmentList }) {  state.departmentList = departmentList }}const actions = { getEmployeeList ({ commit }) {  let employeeResult = dataApi.getEmployeeList()  if (employeeResult.returncode === 0) {   commit('SetEmployeeList', { employeeList: employeeResult.result })  } }, getDepartmentList ({ commit }) {  let departmentResult = dataApi.getDepartmentList()  if (departmentResult.returncode === 0) {   commit('SetDepartmentList', { departmentList: departmentResult.result })  } }}export default { state, getters, mutations, actions, namespaced: true}

2. vue.$set為員工對象增加響應式屬性checked控制是否選中,methods中創建選中方法如下:

selectEmployee () {   var self = this   if (self.employee.checked === undefined) {    this.$set(self.employee, 'checked', true)   } else {    self.employee.checked = !self.employee.checked   }  }

3. computed計算屬性監控文本框輸入字段searchKey的變化實現左側員工列表實時檢索功能。

searchEmployeeList () {   var self = this   if (self.searchKey.trim() === '') {    console.log(self.employeeList)    return self.employeeList.filter(item => item.checked === undefined || !item.checked)   } else {    return self.employeeList.filter(item => (item.employeeName.indexOf(self.searchKey.trim()) !== -1) && (item.checked === undefined || !item.checked))   }  }

4. 構建組織結構樹的部門組件,部門下可能存在子部門和員工,所以組件內部再調用部門組件和員工組件,以達到循環遞歸的效果。

<template> <li @click.stop="expandTree()">  <a :class="lvl|level">   <span class="expand-tree-icon">    <i class="fa fa-caret-right" :class="{'active':department.expand}"></i>   </span>   <span>    <i class="lcfont lc-department-o"></i>   </span>   <span class="title">    <span>{{department.name}}</span>    <span class="title-desc">({{allChildEmployeeList.length}}人 )</span>    <i class="lcfont lc-add" @click.stop="selectDepartmentEmployees()" title="添加整個部門成員"></i>   </span>  </a>  <ul v-show="department.expand">   <child-employee    v-for="(employee,index) in childEmployeeList"    :employee="employee"    :lvl="lvl+1"    :key="index"   ></child-employee>   <child-department    v-for="(department,index) in childDepartmentList"    :department="department"    :employeeList="employeeList"    :departmentList="departmentList"    :lvl="lvl+1"    :key="index"   ></child-department>  </ul> </li></template>

5. 結構樹之員工組件

<template> <li v-on:click.stop="selectEmployee()">  <a class="member-item" v-bind:class="lvl|level" href="javascript:;" rel="external nofollow" >   <div class="lc-avatar flex-se1" name="true" size="30">    <div class="lc-avatar-30" :title="employee.employeeName">     <span class="lc-avatar-def" style="background-color: rgb(112, 118, 142);">      <div>{{employee.employeeName}}</div>     </span>     <div class="lc-avatar-name">{{employee.employeeName}}</div>    </div>   </div>   <i class="lcfont" v-bind:class="{'lc-check':employee.checked}"></i>  </a> </li></template>

6. 和上面員工的選中原理類似,控制部門節點的展開和合并也通過$set方法擴展一個響應式的expand屬性。

expandTree () {   var self = this   if (self.department.expand === undefined) {    self.$set(self.department, 'expand', true)   } else {    self.department.expand = !self.department.expand   }  }

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩精品极品视频免费观看| 国产精品美女www| 久久久欧美一区二区| 欧美激情极品视频| 日韩三级影视基地| 日本aⅴ大伊香蕉精品视频| 97视频免费在线看| 国产精品第一第二| 亚洲最大福利视频网| 欧美日韩国产色视频| 国产精品日韩欧美| 国产精品视频午夜| 在线精品高清中文字幕| 欧美亚洲视频在线观看| 亚洲精品国产精品国自产观看浪潮| 久久久人成影片一区二区三区| 国产精品一区二区av影院萌芽| 精品国产1区2区| 久久精品电影网站| 国产精品嫩草影院久久久| 国产精品久久久久久婷婷天堂| 亚洲第一男人天堂| 91精品视频在线| 亚洲另类图片色| 一本色道久久综合狠狠躁篇怎么玩| www.亚洲天堂| 欧美日韩亚洲一区二| 久久国产精品99国产精| 亚洲精品二三区| 日韩中文字幕av| 日韩在线视频观看| 国产精品h在线观看| 久久久久中文字幕| 法国裸体一区二区| 自拍亚洲一区欧美另类| 午夜精品久久久久久久男人的天堂| 91免费福利视频| 日韩人在线观看| 久久免费视频这里只有精品| 久色乳综合思思在线视频| 亚洲欧美综合另类中字| 日韩av在线资源| 欧美激情精品久久久久久| 亚洲欧美精品在线| 日本久久91av| 亚洲视频在线观看视频| 国产综合久久久久久| 亚洲国产精品久久久久久| 亚洲人成在线电影| 亚洲第一黄色网| 亚洲免费视频观看| 久久精品一本久久99精品| 精品久久久免费| 97精品一区二区视频在线观看| 国产精品免费视频久久久| 欧美精品免费在线| 国产精品高清在线观看| 久久激情视频免费观看| 精品电影在线观看| 日韩精品欧美激情| 中文国产成人精品久久一| 欧美三级免费观看| 国产精品久久久久久久天堂| 国产日韩欧美91| 国产不卡在线观看| 日韩av在线一区二区| 91精品国产乱码久久久久久久久| 亚洲国产高清自拍| 日韩高清人体午夜| 亚洲精品理论电影| 亚洲欧美另类自拍| 亚洲**2019国产| 国产午夜精品免费一区二区三区| 国产亚洲福利一区| 色琪琪综合男人的天堂aⅴ视频| 成人黄色片网站| 中文字幕免费精品一区高清| 日本在线精品视频| 欧美多人乱p欧美4p久久| 欧美疯狂xxxx大交乱88av| 国产美女精彩久久| 欧美日韩国产丝袜美女| 91精品国产自产在线| 久久亚洲春色中文字幕| 欧美精品激情在线观看| 日韩av电影在线免费播放| 日av在线播放中文不卡| 欧美激情xxxxx| 在线观看日韩av| 日本sm极度另类视频| 亚洲欧洲在线免费| 亚洲欧美中文字幕在线一区| 国产成人激情小视频| 中文字幕在线亚洲| 日韩av网站电影| 亚洲精品日韩激情在线电影| 久久久久久欧美| 欧美激情在线播放| 欧美成人精品在线观看| 欧美精品久久久久a| 日韩精品在线第一页| 国产精品久久久久久中文字| 欧美超级免费视 在线| 国产精品69精品一区二区三区| 久久精品亚洲热| 992tv成人免费视频| 亚洲最大的网站| 亚洲性夜色噜噜噜7777| 国产一区av在线| 在线日韩中文字幕| 亚洲欧美中文日韩在线v日本| 久久99精品久久久久久青青91| 九九九久久国产免费| 91美女福利视频高清| 亚洲亚裔videos黑人hd| 国产成人一区二区在线| 成人久久久久久| 一区二区三区视频在线| 精品国产一区av| 欧美xxxx做受欧美| 亚洲男人天堂久| 91丝袜美腿美女视频网站| 91久久综合亚洲鲁鲁五月天| 国产成人精品免高潮费视频| 国产成人欧美在线观看| 亚洲欧美资源在线| 精品女同一区二区三区在线播放| 亚洲男人av电影| 国产日韩欧美在线播放| 亚洲国产欧美一区二区丝袜黑人| 欧美国产亚洲精品久久久8v| www.日韩欧美| 亚洲成人精品av| 最近中文字幕日韩精品| 亚洲第一福利网站| 日韩色av导航| 亚洲免费福利视频| 欧美激情一级精品国产| 97国产精品视频人人做人人爱| 国产精品jizz在线观看麻豆| 91成人在线播放| 欧美极品美女电影一区| 亚洲欧美另类自拍| 国产精品激情av电影在线观看| 91在线|亚洲| www.日韩av.com| 国产精品自拍偷拍视频| 国产成人avxxxxx在线看| 国产丝袜一区视频在线观看| 亚洲人精选亚洲人成在线| 97高清免费视频| www国产亚洲精品久久网站| 欧美激情a∨在线视频播放| 亚洲美女精品成人在线视频| 992tv成人免费视频| 精品一区二区亚洲| 中文字幕在线精品| 国产精品九九久久久久久久| 亚洲精品福利在线| 伊人久久久久久久久久久| 综合网中文字幕| www日韩中文字幕在线看| 国产一区二区三区在线播放免费观看| 欧美黄色www|