uniapp实现目次树效果,异步加载数据

打印 上一主题 下一主题

主题 1781|帖子 1781|积分 5343

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
uniapp目次树
  

  • 父组件调用目次树组件
  1. <DaTreeVue2
  2.    :data="treeData"
  3.    :field="{
  4.       label: 'name',
  5.       key: 'id',
  6.    }"
  7.    @change="handleTreeChange"
  8.    :defaultCheckedKeys="addressDefaultCheckedKey"
  9.    :defaultExpandedKeys="addressDefaultCheckedKey"
  10.    :loadApi="getTreeData"
  11.    ref="addressRef"
  12.    loadMode
  13. />
复制代码


  • 父组件方法
  1. handleTreeChange(allSelectedKeys, currentItem, parentKeys) {
  2.   this.addressDefaultCheckedKey = parentKeys;
  3. }
  4. // 获取树
  5.     async getTreeData(code) {
  6.       let result = {};
  7.       await this.$u.api.jobPost
  8.         .getseekTreeData({
  9.           parentCode: code,
  10.         })
  11.         .then((res) => {
  12.           result = res.map((it) => {
  13.             if (it.isParent) {
  14.               it.children = [];
  15.               return it;
  16.             } else {
  17.               return it;
  18.             }
  19.           });
  20.         });
  21.       return result;
  22.     }
复制代码


  • 子组件 
  1. <template>
  2.         <view class="da-tree" :style="{'--theme-color': themeColor}">
  3.                 <scroll-view class="da-tree-scroll" :scroll-y="true" :scroll-x="false">
  4.                         <view class="da-tree-item" :class="{'is-show': item.show}"
  5.                                 :style="{paddingLeft: item.level * indent + 'rpx'}" v-for="item in datalist" :key="item.key">
  6.                                 <view v-if="item.showArrow" class="da-tree-item__icon" @click="handleExpandedChange(item)">
  7.                                         <view :class="['da-tree-item__icon--arr','is-loading']" v-if="loadLoading && item.loading" />
  8.                                         <view :class="['da-tree-item__icon--arr','is-expand', {'is-right':!item.expand}]" v-else />
  9.                                 </view>
  10.                                 <view v-else class="da-tree-item__icon" />
  11.                                 <view class="da-tree-item__checkbox"
  12.                                         :class="[`da-tree-item__checkbox--${checkboxPlacement}`,{'is--disabled': item.disabled}]"
  13.                                         v-if="showCheckbox" @click="handleCheckChange(item)">
  14.                                         <view class="da-tree-item__checkbox--icon da-tree-checkbox-checked"
  15.                                                 v-if="item.checkedStatus === isCheckedStatus" />
  16.                                         <view class="da-tree-item__checkbox--icon da-tree-checkbox-indeterminate"
  17.                                                 v-else-if="item.checkedStatus === halfCheckedStatus" />
  18.                                         <view class="da-tree-item__checkbox--icon da-tree-checkbox-outline" v-else />
  19.                                 </view>
  20.                                 <view class="da-tree-item__checkbox"
  21.                                         :class="[`da-tree-item__checkbox--${checkboxPlacement}`,{'is--disabled': item.disabled}]"
  22.                                         v-if="!showCheckbox && showRadioIcon" @click="handleRadioChange(item)">
  23.                                         <view class="da-tree-item__checkbox--icon da-tree-radio-checked"
  24.                                                 v-if="item.checkedStatus === isCheckedStatus" />
  25.                                         <view class="da-tree-item__checkbox--icon da-tree-radio-indeterminate"
  26.                                                 v-else-if="item.checkedStatus === halfCheckedStatus" />
  27.                                         <view class="da-tree-item__checkbox--icon da-tree-radio-outline" v-else />
  28.                                 </view>
  29.                                 <view class="da-tree-item__label" :class="'da-tree-item__label--'+item.checkedStatus"
  30.                                         @click="handleLabelClick(item)">{{ item.label }} <text class="da-tree-item__label--append"
  31.                                                 v-if="item.append">{{ item.append }}</text></view>
  32.                         </view>
  33.                 </scroll-view>
  34.         </view>
  35. </template>
  36. <script>
  37.         import {
  38.                 unCheckedStatus,
  39.                 halfCheckedStatus,
  40.                 isCheckedStatus,
  41.                 deepClone,
  42.                 getAllNodeKeys,
  43.                 getAllNodes
  44.         } from './utils'
  45.         export default {
  46.                 name: 'DaTree',
  47.                 props: {
  48.                         /**
  49.                          * 树的数据
  50.                          */
  51.                         data: {
  52.                                 type: Array,
  53.                                 default: () => [],
  54.                         },
  55.                         /**
  56.                          * 主题色
  57.                          */
  58.                         themeColor: {
  59.                                 type: String,
  60.                                 default: '#007aff',
  61.                         },
  62.                         /**
  63.                          * 默认选中的节点,注意单选时为单个key,多选时为key的数组
  64.                          */
  65.                         defaultCheckedKeys: {
  66.                                 type: [Array, String, Number],
  67.                                 default: null,
  68.                         },
  69.                         /**
  70.                          * 选择框的位置,可选 left/right
  71.                          */
  72.                         checkboxPlacement: {
  73.                                 type: String,
  74.                                 default: 'left',
  75.                         },
  76.                         /**
  77.                          * 是否默认展开全部
  78.                          */
  79.                         defaultExpandAll: {
  80.                                 type: Boolean,
  81.                                 default: false,
  82.                         },
  83.                         /**
  84.                          * 默认展开的节点
  85.                          */
  86.                         defaultExpandedKeys: {
  87.                                 type: Array,
  88.                                 default: null,
  89.                         },
  90.                         /**
  91.                          * 子项缩进距离,默认40,单位rpx
  92.                          */
  93.                         indent: {
  94.                                 type: Number,
  95.                                 default: 40,
  96.                         },
  97.                         /**
  98.                          * 字段对应内容,默认为 {label: 'label',key: 'key', children: 'children', disabled: 'disabled', append: 'append'}
  99.                          */
  100.                         field: {
  101.                                 type: Object,
  102.                                 default: null,
  103.                         },
  104.                         /**
  105.                          * 是否开启多选,默认单选
  106.                          */
  107.                         showCheckbox: {
  108.                                 type: Boolean,
  109.                                 default: false,
  110.                         },
  111.                         /**
  112.                          * 是否显示单选图标,默认显示
  113.                          */
  114.                         showRadioIcon: {
  115.                                 type: Boolean,
  116.                                 default: true,
  117.                         },
  118.                         /**
  119.                          * 单选时只允许选中末级,默认可随意选中
  120.                          */
  121.                         onlyRadioLeaf: {
  122.                                 type: Boolean,
  123.                                 default: false,
  124.                         },
  125.                         /**
  126.                          * 多选时,是否执行父子不关联的任意勾选,默认父子关联
  127.                          */
  128.                         checkStrictly: {
  129.                                 type: Boolean,
  130.                                 default: false,
  131.                         },
  132.                         /**
  133.                          * 为 true 时,空的 children 数组会显示展开图标
  134.                          */
  135.                         loadMode: {
  136.                                 type: Boolean,
  137.                                 default: false,
  138.                         },
  139.                         /**
  140.                          * 异步加载接口
  141.                          */
  142.                         loadApi: {
  143.                                 type: Function,
  144.                                 default: null,
  145.                         },
  146.                         /**
  147.                          * 是否渲染禁用值
  148.                          */
  149.                         checkedDisabled: {
  150.                                 type: Boolean,
  151.                                 default: false,
  152.                         },
  153.                         /**
  154.                          * 是否返回已禁用的但已选中的key
  155.                          */
  156.                         packDisabledkey: {
  157.                                 type: Boolean,
  158.                                 default: true,
  159.                         },
  160.                         /**
  161.                          * 选择时是否展开当前已选的所有下级节点,默认不展开
  162.                          */
  163.                         expandChecked: {
  164.                                 type: Boolean,
  165.                                 default: false,
  166.                         },
  167.                 },
  168.                 data() {
  169.                         return {
  170.                                 unCheckedStatus,
  171.                                 halfCheckedStatus,
  172.                                 isCheckedStatus,
  173.                                 /** 原始的树数据 */
  174.                                 dataRef: [],
  175.                                 /** 处理后的一维树项数据 */
  176.                                 datalist: [],
  177.                                 /** 处理后的以key为键值的树项数据 */
  178.                                 datamap: {},
  179.                                 /** 默认的展开数据 */
  180.                                 expandedKeys: [],
  181.                                 /** 默认的已选数据 */
  182.                                 checkedKeys: null,
  183.                                 /** 加载状态 */
  184.                                 loadLoading: false,
  185.                         }
  186.                 },
  187.                 watch: {
  188.                         defaultExpandedKeys: {
  189.                                 // deep: true,
  190.                                 immediate: true,
  191.                                 handler: function(v) {
  192.                                         if (v?.length) {
  193.                                                 this.expandedKeys = v
  194.                                         } else {
  195.                                                 this.expandedKeys = []
  196.                                         }
  197.                                         // if (v) this.checkInitData(this.datalist)
  198.                                 },
  199.                         },
  200.                         defaultCheckedKeys: {
  201.                                 // deep: true,
  202.                                 immediate: true,
  203.                                 handler: function(v) {
  204.                                         if (this.showCheckbox) {
  205.                                                 if (v?.length) {
  206.                                                         this.checkedKeys = v
  207.                                                 } else {
  208.                                                         this.checkedKeys = []
  209.                                                 }
  210.                                         } else {
  211.                                                 if (v || v === 0) {
  212.                                                         this.checkedKeys = v
  213.                                                 } else {
  214.                                                         this.checkedKeys = null
  215.                                                 }
  216.                                         }
  217.                                         // this.checkInitData(this.datalist)
  218.                                 },
  219.                         },
  220.                         data: {
  221.                                 deep: true,
  222.                                 immediate: true,
  223.                                 handler: function(v) {
  224.                                         this.dataRef = deepClone(v)
  225.                                         setTimeout(() => {
  226.                                                 this.initData()
  227.                                         }, 36)
  228.                                 },
  229.                         },
  230.                 },
  231.                 methods: {
  232.                         /**
  233.                          * 初始化数据结构
  234.                          */
  235.                         initData() {
  236.                                 const data = deepClone(this.dataRef)
  237.                                 this.datalist = []
  238.                                 this.datamap = {}
  239.                                 // clean tree
  240.                                 this.handleTreeData(data)
  241.                                 // flat tree
  242.                                 this.datalist = this.checkInitData(this.datalist)
  243.                                 // console.log('init datalist', this.datalist)
  244.                                 // console.log('init datamap', this.datamap)
  245.                         },
  246.                         /**
  247.                          * 转换为节点数据
  248.                          * @param data
  249.                          * @param parent
  250.                          * @param level
  251.                          */
  252.                         handleTreeData(data = [], parent = null, level = 0, insertIndex = -1, secondIndex) {
  253.                                 return data.reduce((prev, cur, index) => {
  254.                                         const key = cur[this.field?.key || 'key']
  255.                                         const children = cur[this.field?.children || 'children'] || null
  256.                                         const newItem = this.createNewItem(cur, index, parent, level)
  257.                                         this.datamap[key] = newItem
  258.                                         if (insertIndex > -1) {
  259.                                                 this.datalist.splice(insertIndex + 1, 0, newItem)
  260.                                                 parent.children.push(newItem)
  261.                                                 if (newItem.parentKeys?.length) {
  262.                                                         newItem.parentKeys.forEach(k => {
  263.                                                                 this.datamap[k].childrenKeys = [...this.datamap[k].childrenKeys,
  264.                                                                         newItem
  265.                                                                         .key
  266.                                                                 ]
  267.                                                         })
  268.                                                 }
  269.                                         } else {
  270.                                                 this.datalist.push(newItem)
  271.                                         }
  272.                                         const hasChildren = children && children.length > 0
  273.                                         if (hasChildren) {
  274.                                                 const childrenData = this.handleTreeData(children, newItem, level + 1)
  275.                                                 newItem.children = childrenData
  276.                                                 const childrenKeys = childrenData.reduce((p, k) => {
  277.                                                         const keys = k.childrenKeys
  278.                                                         p.push(...keys, k.key)
  279.                                                         return p
  280.                                                 }, [])
  281.                                                 newItem.childrenKeys = childrenKeys
  282.                                         }
  283.                                         newItem.positionCode = cur.positionCode
  284.                                         // newItem.parentCodes = cur.parentCodes.split(',')
  285.                                         prev.push(newItem)
  286.                                         return prev
  287.                                 }, [])
  288.                         },
  289.                         /**
  290.                          * 创建节点
  291.                          * @param item
  292.                          * @param index
  293.                          * @param parent
  294.                          * @param level
  295.                          */
  296.                         createNewItem(item, index, parent, level) {
  297.                                 const key = item[this.field?.key || 'key']
  298.                                 const label = item[this.field?.label || 'label']
  299.                                 const children = item[this.field?.children || 'children'] || null
  300.                                 const append = item[this.field?.append || 'append'] || null
  301.                                 let disabled = item[this.field?.disabled || 'disabled'] || false
  302.                                 const hasChildren = children && children.length > 0
  303.                                 const hasEmptyChildren = children && children.length === 0
  304.                                 let showArrow = true
  305.                                 let isLeaf = !hasChildren
  306.                                 let expand = this.defaultExpandAll
  307.                                 if (this.loadMode && hasEmptyChildren) {
  308.                                         isLeaf = false
  309.                                         expand = false
  310.                                         showArrow = true
  311.                                 }
  312.                                 if (disabled) {
  313.                                         showArrow = false
  314.                                 }
  315.                                 if (hasChildren) {
  316.                                         showArrow = true
  317.                                 } else {
  318.                                         if (this.loadMode && hasEmptyChildren && !disabled) {
  319.                                                 showArrow = true
  320.                                         } else {
  321.                                                 showArrow = false
  322.                                         }
  323.                                 }
  324.                                 if (!isLeaf && !this.showCheckbox && this.onlyRadioLeaf) {
  325.                                         disabled = true
  326.                                         showArrow = true
  327.                                 }
  328.                                 const parentKey = parent ? parent.key : null
  329.                                 const show = this.defaultExpandAll ? true : level === 0
  330.                                 const newItem = {
  331.                                         key,
  332.                                         parentKey,
  333.                                         label,
  334.                                         append,
  335.                                         isLeaf,
  336.                                         showArrow,
  337.                                         level,
  338.                                         expand,
  339.                                         show,
  340.                                         disabled,
  341.                                         loading: false,
  342.                                         indexs: [index],
  343.                                         checkedStatus: unCheckedStatus,
  344.                                         parentKeys: [],
  345.                                         childrenKeys: [],
  346.                                         children: [],
  347.                                         originItem: item,
  348.                                 }
  349.                                 if (parent) {
  350.                                         newItem.parentKeys = [parent.key, ...parent.parentKeys]
  351.                                         newItem.indexs = [...parent.indexs, index]
  352.                                 }
  353.                                 return newItem
  354.                         },
  355.                         /**
  356.                          * 处理初始化内容
  357.                          * @param list
  358.                          */
  359.                         checkInitData(list) {
  360.                                 let checkedKeyList = null
  361.                                 let expandedKeyList = []
  362.                                 if (this.showCheckbox) {
  363.                                         checkedKeyList = [...new Set(this.checkedKeys || [])]
  364.                                 } else {
  365.                                         checkedKeyList = this.checkedKeys || null
  366.                                 }
  367.                                 this.handleCheckState(list, checkedKeyList)
  368.                                 // 处理初始展开
  369.                                 expandedKeyList = [...new Set(this.expandedKeys || [])]
  370.                                 if (!this.defaultExpandAll) {
  371.                                         this.handleExpandState(list, expandedKeyList, true)
  372.                                 }
  373.                                 return list
  374.                         },
  375.                         /**
  376.                          * 处理选中
  377.                          * @param list
  378.                          * @param checkedKeyList
  379.                          */
  380.                         handleCheckState(list, checkedKeyList, checked = true) {
  381.                                 if (this.showCheckbox) {
  382.                                         for (let i = 0; i < list.length; i++) {
  383.                                                 const item = list[i]
  384.                                                 if (checkedKeyList?.includes(item.key)) {
  385.                                                         if (this.checkedDisabled || !item.disabled) {
  386.                                                                 this.handleExpandParentNode(item, checked)
  387.                                                                 this.checkTheChecked(item, checked)
  388.                                                         }
  389.                                                 }
  390.                                         }
  391.                                 } else {
  392.                                         // 单选
  393.                                         for (let i = 0; i < list.length; i++) {
  394.                                                 const item = list[i]
  395.                                                 if (item.key === checkedKeyList && !item.disabled) {
  396.                                                         if (this.checkedDisabled || !item.disabled) {
  397.                                                                 this.checkTheRadio(item, checked)
  398.                                                                 break
  399.                                                         }
  400.                                                 }
  401.                                         }
  402.                                 }
  403.                         },
  404.                         /**
  405.                          * 校验多选节点
  406.                          * @param item
  407.                          * @param checked
  408.                          */
  409.                         checkTheChecked(item, checked = true) {
  410.                                 const {
  411.                                         childrenKeys,
  412.                                         parentKeys,
  413.                                         disabled = false
  414.                                 } = item
  415.                                 if (!this.checkedDisabled && disabled) return
  416.                                 // 当前
  417.                                 item.checkedStatus = checked ? isCheckedStatus : unCheckedStatus
  418.                                 if (!this.checkStrictly) {
  419.                                         // 子类
  420.                                         childrenKeys.forEach(k => {
  421.                                                 const childrenItem = this.datamap[k]
  422.                                                 childrenItem.checkedStatus = (!this.checkedDisabled && childrenItem.disabled) ?
  423.                                                         childrenItem.checkedStatus : item.checkedStatus
  424.                                         })
  425.                                         // 父类
  426.                                         parentKeys.forEach(k => {
  427.                                                 const parentItem = this.datamap[k]
  428.                                                 parentItem.checkedStatus = this.getParentCheckedStatus(parentItem)
  429.                                         })
  430.                                 }
  431.                         },
  432.                         /**
  433.                          * 校验单选节点
  434.                          * @param item
  435.                          */
  436.                         checkTheRadio(item, checked) {
  437.                                 // console.log('item',item);
  438.                                 // console.log('checked',checked);
  439.                                 const {
  440.                                         parentKeys,
  441.                                         isLeaf,
  442.                                         disabled = false
  443.                                 } = item
  444.                                 if (!this.checkedDisabled && disabled) return
  445.                                 // 限制末节点选中,但当前非末节点
  446.                                 if (this.onlyRadioLeaf && !isLeaf) {
  447.                                         console.error(`DaTree: 限制了末节点选中,当前[${item.label}]非末节点`)
  448.                                         return
  449.                                 }
  450.                                 if (this.datalist?.length) {
  451.                                         for (let i = 0; i < this.datalist.length; i++) {
  452.                                                 const k = this.datalist[i]
  453.                                                 k.checkedStatus = unCheckedStatus
  454.                                         }
  455.                                 }
  456.                                 parentKeys.forEach(k => {
  457.                                         const parentItem = this.datamap[k]
  458.                                         parentItem.checkedStatus = this.getParentCheckedStatus(parentItem, checked)
  459.                                 })
  460.                                 // 当前
  461.                                 if (checked === true) {
  462.                                         item.checkedStatus = isCheckedStatus
  463.                                 }
  464.                                 if (checked === false) {
  465.                                         item.checkedStatus = unCheckedStatus
  466.                                 }
  467.                                 // item.checkedStatus = unCheckedStatus  
  468.                         },
  469.                         /**
  470.                          * 处理父节点展开
  471.                          * @param item
  472.                          * @param expand
  473.                          */
  474.                         handleExpandParentNode(item, expand = true) {
  475.                                 if (!expand) return
  476.                                 if (item?.parentKeys?.length) {
  477.                                         item.parentKeys.forEach(pk => {
  478.                                                 if (!this.datamap[pk].expand) {
  479.                                                         this.datamap[pk].expand = true
  480.                                                 }
  481.                                         })
  482.                                 }
  483.                         },
  484.                         /**
  485.                          * 处理节点展开
  486.                          * @param list
  487.                          * @param expandedKeyList
  488.                          * @param expand
  489.                          */
  490.                         handleExpandState(list, expandedKeyList, expand = true) {
  491.                                 for (let i = 0; i < list.length; i++) {
  492.                                         const item = list[i]
  493.                                         if (expand === true) {
  494.                                                 // 处理展开
  495.                                                 if (expandedKeyList?.includes(item.key)) {
  496.                                                         item.expand = true
  497.                                                         this.handleExpandParentNode(item, true)
  498.                                                 }
  499.                                         } else {
  500.                                                 // 处理收起
  501.                                                 if (expandedKeyList?.includes(item.key)) {
  502.                                                         item.expand = false
  503.                                                         if (item?.childrenKeys?.length) {
  504.                                                                 item.childrenKeys.forEach(ck => {
  505.                                                                         this.datamap[ck].expand = false
  506.                                                                         this.datamap[ck].show = false
  507.                                                                 })
  508.                                                         }
  509.                                                 }
  510.                                         }
  511.                                 }
  512.                                 for (let i = 0; i < list.length; i++) {
  513.                                         const item = list[i]
  514.                                         if (item.level > 0) {
  515.                                                 const parentItem = this.datamap[item.parentKey]
  516.                                                 if (parentItem) {
  517.                                                         if (parentItem.expand && parentItem.show) {
  518.                                                                 item.show = true
  519.                                                         }
  520.                                                 }
  521.                                         }
  522.                                 }
  523.                         },
  524.                         /**
  525.                          * 点击选框
  526.                          * @param item
  527.                          */
  528.                         handleCheckChange(item) {
  529.                                 const {
  530.                                         childrenKeys,
  531.                                         parentKeys,
  532.                                         checkedStatus,
  533.                                         isLeaf,
  534.                                         originItem = null,
  535.                                         disabled = false
  536.                                 } = item
  537.                                 if (!this.showCheckbox) return
  538.                                 if (disabled) return
  539.                                 // 当前
  540.                                 item.checkedStatus = checkedStatus === isCheckedStatus ? unCheckedStatus : isCheckedStatus
  541.                                 // 子类
  542.                                 if (!this.checkStrictly) {
  543.                                         if (this.expandChecked) {
  544.                                                 item.show = true
  545.                                                 item.expand = childrenKeys?.length > 0 || isLeaf
  546.                                         }
  547.                                         childrenKeys.forEach(k => {
  548.                                                 const childrenItem = this.datamap[k]
  549.                                                 childrenItem.checkedStatus = childrenItem.disabled ? childrenItem.checkedStatus : item
  550.                                                         .checkedStatus
  551.                                                 if (this.expandChecked) {
  552.                                                         childrenItem.show = true
  553.                                                         childrenItem.expand = childrenItem?.childrenKeys?.length > 0 || childrenItem.isLeaf
  554.                                                 }
  555.                                         })
  556.                                 } else {
  557.                                         if (this.expandChecked) {
  558.                                                 console.error(`DaTree: 多选时,当 checkStrictly 为 true 时,不支持选择自动展开子节点属性(expandChecked)`)
  559.                                         }
  560.                                 }
  561.                                 // 父类
  562.                                 if (!this.checkStrictly) {
  563.                                         parentKeys.forEach(k => {
  564.                                                 const parentItem = this.datamap[k]
  565.                                                 parentItem.checkedStatus = this.getParentCheckedStatus(parentItem)
  566.                                         })
  567.                                 }
  568.                                 const hasCheckedKeys = []
  569.                                 for (let i = 0; i < this.datalist.length; i++) {
  570.                                         const k = this.datalist[i]
  571.                                         if (k.checkedStatus === isCheckedStatus) {
  572.                                                 if ((this.packDisabledkey && k.disabled) || !k.disabled) {
  573.                                                         hasCheckedKeys.push(k.key)
  574.                                                 }
  575.                                         }
  576.                                 }
  577.                                 this.checkedKeys = [...hasCheckedKeys]
  578.                                 this.$emit('change', hasCheckedKeys, originItem)
  579.                         },
  580.                         /**
  581.                          * 点击单选
  582.                          * @param item
  583.                          */
  584.                         handleRadioChange(item) {
  585.                                 const {
  586.                                         parentKeys,
  587.                                         checkedStatus,
  588.                                         key,
  589.                                         originItem = null,
  590.                                         disabled = false
  591.                                 } = item
  592.                                 if (this.showCheckbox) return
  593.                                 if (this.onlyRadioLeaf) {
  594.                                         this.handleExpandedChange(item)
  595.                                 }
  596.                                 if (disabled) return
  597.                                 // 重置所有选择
  598.                                 if (this.datalist?.length) {
  599.                                         for (let i = 0; i < this.datalist.length; i++) {
  600.                                                 const k = this.datalist[i]
  601.                                                 k.checkedStatus = unCheckedStatus
  602.                                         }
  603.                                 }
  604.                                 parentKeys.forEach(k => {
  605.                                         const parentItem = this.datamap[k]
  606.                                         parentItem.checkedStatus = this.getParentCheckedStatus(parentItem)
  607.                                 })
  608.                                 // 当前
  609.                                 item.checkedStatus = checkedStatus === isCheckedStatus ? unCheckedStatus : isCheckedStatus
  610.                                 this.checkedKeys = key
  611.                                 this.$emit('change', key, originItem, parentKeys)
  612.                         },
  613.                         /**
  614.                          * 点击标签
  615.                          */
  616.                         handleLabelClick(item) {
  617.                                 if (this.showCheckbox) {
  618.                                         this.handleCheckChange(item)
  619.                                 } else {
  620.                                         this.handleRadioChange(item)
  621.                                 }
  622.                         },
  623.                         /**
  624.                          * 点击展开收起
  625.                          * @param item
  626.                          */
  627.                         async handleExpandedChange(item) {
  628.                                 const {
  629.                                         expand,
  630.                                         originItem = null,
  631.                                         loading = false
  632.                                 } = item
  633.                                 if (this.loadLoading && loading) return
  634.                                 this.checkExpandedChange(item)
  635.                                 // 异步
  636.                                 item.expand = !expand
  637.                                 let currentItem = null
  638.                                 if (!this.showCheckbox && this.onlyRadioLeaf && this.loadMode) {
  639.                                         console.error(`DaTree: 单选时,当 onlyRadioLeaf 为 true 时不支持动态数据`)
  640.                                 } else {
  641.                                         currentItem = await this.loadExpandNode(item)
  642.                                 }
  643.                                 this.$emit('expand', item, !expand, currentItem || originItem || null)
  644.                         },
  645.                         /**
  646.                          * 检查展开状态
  647.                          * @param item
  648.                          */
  649.                         checkExpandedChange(item) {
  650.                                 const {
  651.                                         expand,
  652.                                         childrenKeys,
  653.                                         children = null
  654.                                 } = item
  655.                                 if (expand) {
  656.                                         if (childrenKeys?.length) {
  657.                                                 childrenKeys.forEach(k => {
  658.                                                         if (this.datamap[k]) {
  659.                                                                 this.datamap[k].show = false
  660.                                                                 this.datamap[k].expand = false
  661.                                                         }
  662.                                                 })
  663.                                         }
  664.                                 } else {
  665.                                         if (children?.length) {
  666.                                                 const childrenKeys = children.map(k => k.key)
  667.                                                 childrenKeys.forEach(k => {
  668.                                                         if (this.datamap[k]) {
  669.                                                                 this.datamap[k].show = true
  670.                                                         }
  671.                                                 })
  672.                                         }
  673.                                 }
  674.                         },
  675.                         /**
  676.                          * 加载异步数据
  677.                          * @param item
  678.                          */
  679.                         async loadExpandNode(item) {
  680.                                 const {
  681.                                         expand,
  682.                                         key,
  683.                                         children = null
  684.                                 } = item
  685.                                 if (expand && this.loadMode && (!children || children.length === 0)) {
  686.                                         if (typeof this.loadApi === 'function') {
  687.                                                 this.expandedKeys.push(key)
  688.                                                 this.loadLoading = true
  689.                                                 item.loading = true
  690.                                                 const currentNode = deepClone(item)
  691.                                                 const apiRes = await this.loadApi(currentNode.positionCode)
  692.                                                 item.originItem = apiRes || null
  693.                                                 if (apiRes?.length) {
  694.                                                         const insertIndex = this.datalist.findIndex(k => k.key === item.key)
  695.                                                         this.handleTreeData(apiRes, item, item.level + 1, insertIndex)
  696.                                                         this.datalist = this.checkInitData(this.datalist)
  697.                                                 } else {
  698.                                                         // 加载后无数据就移除展开图标
  699.                                                         item.expand = false
  700.                                                         item.isLeaf = true
  701.                                                         item.showArrow = false
  702.                                                 }
  703.                                                 this.loadLoading = false
  704.                                                 item.loading = false
  705.                                         }
  706.                                 } else {
  707.                                         const eki = this.expandedKeys.findIndex(k => k === key)
  708.                                         if (eki >= 0) {
  709.                                                 this.expandedKeys.splice(eki, 1)
  710.                                         }
  711.                                 }
  712.                                 return item
  713.                         },
  714.                         /**
  715.                          * 获取父类的选中状态
  716.                          * @param item
  717.                          */
  718.                         getParentCheckedStatus(item, checked = true) {
  719.                                 console.log(item);
  720.                                 console.log(checked);
  721.                                 if (!item) {
  722.                                         return unCheckedStatus
  723.                                 }
  724.                                 if (!this.checkedDisabled && item.disabled) {
  725.                                         return item.checkedStatus || unCheckedStatus
  726.                                 }
  727.                                 // 单选时,父类永远为半选
  728.                                 // checked为false  unCheckedStatus取消选择
  729.                                 if (!this.showCheckbox && checked == true) {
  730.                                         // console.log('半半');
  731.                                         return halfCheckedStatus
  732.                                 }
  733.                                 if (!this.showCheckbox && checked === false) {
  734.                                         // console.log('add');
  735.                                         return unCheckedStatus
  736.                                 }
  737.                                 const {
  738.                                         children
  739.                                 } = item
  740.                                 // 子类全选中
  741.                                 const childrenCheckedAll = children.every(k => k.checkedStatus === isCheckedStatus)
  742.                                 if (childrenCheckedAll) {
  743.                                         return isCheckedStatus
  744.                                 }
  745.                                 // 子类全不选中
  746.                                 const childrenUncheckedAll = children.every(k => k.checkedStatus === unCheckedStatus)
  747.                                 if (childrenUncheckedAll) {
  748.                                         return unCheckedStatus
  749.                                 }
  750.                                 return halfCheckedStatus
  751.                         },
  752.                         /**
  753.                          * 返回已选的 key
  754.                          */
  755.                         getCheckedKeys() {
  756.                                 return getAllNodeKeys(this.datalist, 'checkedStatus', isCheckedStatus, this.packDisabledkey)
  757.                         },
  758.                         /**
  759.                          * 根据key设置已选
  760.                          * @param keys 多选时为key的数组,单选时为key
  761.                          * @param checked 多选时为key的数组,单选时为key
  762.                          */
  763.                         setCheckedKeys(keys, checked = true) {
  764.                                 // console.log('--==========================',keys);
  765.                                 // console.log('--==========================',checked);
  766.                                 if (!Array.isArray(keys) && this.showCheckbox) {
  767.                                         console.error('DaTree: setCheckedKeys 第一个参数非数组,传入的是:', keys)
  768.                                         return
  769.                                 }
  770.                                 const list = this.datalist
  771.                                 if (checked === false) {
  772.                                         // console.log('11111111111111111111111111111111111111111111111111111111111111111111111');
  773.                                         let newCheckedKeys
  774.                                         if (this.showCheckbox) {
  775.                                                 newCheckedKeys = []
  776.                                                 for (let i = 0; i < this.checkedKeys.length; i++) {
  777.                                                         const ck = this.checkedKeys[i]
  778.                                                         if (!keys.includes(ck)) {
  779.                                                                 newCheckedKeys.push(ck)
  780.                                                         }
  781.                                                 }
  782.                                                 newCheckedKeys = [...new Set(newCheckedKeys)]
  783.                                         } else {
  784.                                                 // 单选时,必须至少勾选一个,所以单选不支持取消选中。
  785.                                                 // newCheckedKeys = null
  786.                                                 newCheckedKeys = keys
  787.                                         }
  788.                                         this.checkedKeys = newCheckedKeys
  789.                                         // console.log(this.checkedKeys);
  790.                                         console.log(list);
  791.                                         this.handleCheckState(list, keys, false)
  792.                                 } else {
  793.                                         this.handleCheckState(list, keys, true)
  794.                                         if (this.showCheckbox) {
  795.                                                 this.checkedKeys = [...new Set([...(this.checkedKeys || []), ...(keys || [])])]
  796.                                                 this.handleExpandState(list, keys, true)
  797.                                         } else {
  798.                                                 // 单选时如果为数组则拿第一个
  799.                                                 if (Array.isArray(keys)) {
  800.                                                         keys = keys[0]
  801.                                                 }
  802.                                                 this.checkedKeys = keys || null
  803.                                                 this.handleExpandState(list, [keys], true)
  804.                                         }
  805.                                 }
  806.                         },
  807.                         /**
  808.                          * 返回半选的 key
  809.                          */
  810.                         getHalfCheckedKeys() {
  811.                                 return getAllNodeKeys(this.datalist, 'checkedStatus', halfCheckedStatus, this.packDisabledkey)
  812.                         },
  813.                         /**
  814.                          * 返回已展开的 key
  815.                          */
  816.                         getExpandedKeys() {
  817.                                 return getAllNodeKeys(this.datalist, 'expand', true)
  818.                         },
  819.                         /**
  820.                          * 根据key展开/收起
  821.                          * @param keys key的数组
  822.                          * @param expand true为展开/false为收起
  823.                          */
  824.                         setExpandedKeys(keys, expand = true) {
  825.                                 if (!Array.isArray(keys)) {
  826.                                         console.error('DaTree: setExpandedKeys 第一个参数非数组,传入的是:', keys)
  827.                                         return
  828.                                 }
  829.                                 const list = this.datalist
  830.                                 if (expand === false) {
  831.                                         const newExpandedKeys = []
  832.                                         for (let i = 0; i < this.expandedKeys.length; i++) {
  833.                                                 const ek = this.expandedKeys[i]
  834.                                                 if (!keys.includes(ek)) {
  835.                                                         newExpandedKeys.push(ek)
  836.                                                 }
  837.                                         }
  838.                                         this.expandedKeys = [...new Set(newExpandedKeys)]
  839.                                         this.handleExpandState(list, keys, false)
  840.                                 } else {
  841.                                         this.datalist.forEach(k => {
  842.                                                 if (keys.includes(k.key)) {
  843.                                                         if (k.parentKeys?.length) {
  844.                                                                 k.parentKeys.forEach(pk => {
  845.                                                                         const parentItem = this.datamap[pk]
  846.                                                                         parentItem.expand = true
  847.                                                                         parentItem.show = true
  848.                                                                         if (parentItem.children?.length) {
  849.                                                                                 const pkcs = parentItem.children.map(k => k.key)
  850.                                                                                 pkcs.forEach(pkc => {
  851.                                                                                         this.datamap[pkc].show = true
  852.                                                                                 })
  853.                                                                         }
  854.                                                                 })
  855.                                                         }
  856.                                                         k.show = true
  857.                                                         this.handleExpandedChange(k)
  858.                                                 }
  859.                                         })
  860.                                 }
  861.                         },
  862.                         /**
  863.                          * 返回已选的节点
  864.                          */
  865.                         getCheckedNodes() {
  866.                                 return getAllNodes(this.datalist, 'checkedStatus', isCheckedStatus, this.packDisabledkey)
  867.                         },
  868.                         /**
  869.                          * 返回半选的节点
  870.                          */
  871.                         getHalfCheckedNodes() {
  872.                                 return getAllNodes(this.datalist, 'checkedStatus', halfCheckedStatus, this.packDisabledkey)
  873.                         },
  874.                         /**
  875.                          * 返回已展开的节点
  876.                          */
  877.                         getExpandedNodes() {
  878.                                 return getAllNodes(this.datalist, 'expand', true)
  879.                         },
  880.                 },
  881.         }
  882. </script>
  883. <style lang="scss" scoped>
  884.         @font-face {
  885.                 font-family: 'iconfont';
  886.                 /* Project id  */
  887.                 src: url('data:application/octet-stream;base64,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') format('truetype');
  888.         }
  889.         .da-tree {
  890.                 width: 100%;
  891.                 height: 100%;
  892.                 &-scroll {
  893.                         width: 100%;
  894.                         height: 100%;
  895.                 }
  896.                 &-item {
  897.                         display: flex;
  898.                         align-items: center;
  899.                         height: 0;
  900.                         padding: 0;
  901.                         overflow: hidden;
  902.                         font-size: 28rpx;
  903.                         line-height: 1;
  904.                         visibility: hidden;
  905.                         opacity: 0;
  906.                         transition: opacity 0.2s linear;
  907.                         &.is-show {
  908.                                 height: auto;
  909.                                 padding: 12rpx 24rpx;
  910.                                 visibility: visible;
  911.                                 opacity: 1;
  912.                         }
  913.                         &__icon {
  914.                                 display: flex;
  915.                                 align-items: center;
  916.                                 justify-content: center;
  917.                                 width: 40rpx;
  918.                                 height: 40rpx;
  919.                                 overflow: hidden;
  920.                                 &--arr {
  921.                                         position: relative;
  922.                                         display: flex;
  923.                                         align-items: center;
  924.                                         justify-content: center;
  925.                                         width: 32rpx;
  926.                                         height: 32rpx;
  927.                                         &::after {
  928.                                                 position: relative;
  929.                                                 z-index: 1;
  930.                                                 overflow: hidden;
  931.                                                 /* stylelint-disable-next-line font-family-no-missing-generic-family-keyword */
  932.                                                 font-family: 'iconfont' !important;
  933.                                                 font-size: 32rpx;
  934.                                                 font-style: normal;
  935.                                                 color: #999;
  936.                                                 -webkit-font-smoothing: antialiased;
  937.                                                 -moz-osx-font-smoothing: grayscale;
  938.                                         }
  939.                                         &.is-expand {
  940.                                                 &::after {
  941.                                                         content: '\e604';
  942.                                                 }
  943.                                         }
  944.                                         &.is-right {
  945.                                                 transform: rotate(-90deg);
  946.                                         }
  947.                                         &.is-loading {
  948.                                                 animation: IconLoading 1s linear 0s infinite;
  949.                                                 &::after {
  950.                                                         content: '\e7f1';
  951.                                                 }
  952.                                         }
  953.                                 }
  954.                         }
  955.                         &__checkbox {
  956.                                 width: 40rpx;
  957.                                 height: 40rpx;
  958.                                 overflow: hidden;
  959.                                 &--left {
  960.                                         order: 0;
  961.                                 }
  962.                                 &--right {
  963.                                         order: 1;
  964.                                 }
  965.                                 &--icon {
  966.                                         position: relative;
  967.                                         display: flex;
  968.                                         align-items: center;
  969.                                         justify-content: center;
  970.                                         width: 40rpx;
  971.                                         height: 40rpx;
  972.                                         &::after {
  973.                                                 position: relative;
  974.                                                 top: 0;
  975.                                                 left: 0;
  976.                                                 z-index: 1;
  977.                                                 overflow: hidden;
  978.                                                 /* stylelint-disable-next-line font-family-no-missing-generic-family-keyword */
  979.                                                 font-family: 'iconfont' !important;
  980.                                                 font-size: 32rpx;
  981.                                                 font-style: normal;
  982.                                                 -webkit-font-smoothing: antialiased;
  983.                                                 -moz-osx-font-smoothing: grayscale;
  984.                                         }
  985.                                         &.da-tree-checkbox-outline::after {
  986.                                                 color: #bbb;
  987.                                                 content: '\ead5';
  988.                                         }
  989.                                         &.da-tree-checkbox-checked::after {
  990.                                                 color: var(--theme-color, #007aff);
  991.                                                 content: '\ead4';
  992.                                         }
  993.                                         &.da-tree-checkbox-indeterminate::after {
  994.                                                 color: var(--theme-color, #007aff);
  995.                                                 content: '\ebce';
  996.                                         }
  997.                                         &.da-tree-radio-outline::after {
  998.                                                 color: #bbb;
  999.                                                 content: '\ecc5';
  1000.                                         }
  1001.                                         &.da-tree-radio-checked::after {
  1002.                                                 color: var(--theme-color, #007aff);
  1003.                                                 content: '\ecc4';
  1004.                                         }
  1005.                                         &.da-tree-radio-indeterminate::after {
  1006.                                                 color: var(--theme-color, #007aff);
  1007.                                                 content: '\ea4f';
  1008.                                         }
  1009.                                 }
  1010.                                 &.is--disabled {
  1011.                                         cursor: not-allowed;
  1012.                                         opacity: 0.35;
  1013.                                 }
  1014.                         }
  1015.                         &__label {
  1016.                                 flex: 1;
  1017.                                 margin-left: 4rpx;
  1018.                                 color: #555;
  1019.                                 &--2 {
  1020.                                         color: var(--theme-color, #007aff);
  1021.                                 }
  1022.                                 &--append {
  1023.                                         font-size: 60%;
  1024.                                         opacity: 0.6;
  1025.                                 }
  1026.                         }
  1027.                 }
  1028.         }
  1029.         @keyframes IconLoading {
  1030.                 0% {
  1031.                         transform: rotate(0deg);
  1032.                 }
  1033.                 100% {
  1034.                         transform: rotate(360deg);
  1035.                 }
  1036.         }
  1037. </style>
复制代码


  • utils.js文件
  1. // @ts-nocheck
  2. /** 未选 */
  3. export const unCheckedStatus = 0
  4. /** 半选 */
  5. export const halfCheckedStatus = 1
  6. /** 选中 */
  7. export const isCheckedStatus = 2
  8. /**
  9. * 深拷贝内容
  10. * @param originData 拷贝对象
  11. * @author crlang(https://crlang.com)
  12. */
  13. export function deepClone(originData) {
  14.   const type = Object.prototype.toString.call(originData)
  15.   let data
  16.   if (type === '[object Array]') {
  17.     data = []
  18.     for (let i = 0; i < originData.length; i++) {
  19.       data.push(deepClone(originData[i]))
  20.     }
  21.   } else if (type === '[object Object]') {
  22.     data = {}
  23.     for (const prop in originData) {
  24.       // eslint-disable-next-line no-prototype-builtins
  25.       if (originData.hasOwnProperty(prop)) { // 非继承属性
  26.         data[prop] = deepClone(originData[prop])
  27.       }
  28.     }
  29.   } else {
  30.     data = originData
  31.   }
  32.   return data
  33. }
  34. /**
  35. * 获取所有指定的节点
  36. * @param type
  37. * @param value
  38. * @author crlang(https://crlang.com)
  39. */
  40. export function getAllNodes(list, type, value, packDisabledkey = true) {
  41.   if (!list || list.length === 0) {
  42.     return []
  43.   }
  44.   const res = []
  45.   for (let i = 0; i < list.length; i++) {
  46.     const item = list[i]
  47.     if (item[type] === value) {
  48.       if ((packDisabledkey && item.disabled) || !item.disabled) {
  49.         res.push(item)
  50.       }
  51.     }
  52.   }
  53.   return res
  54. }
  55. /**
  56. * 获取所有指定的key值
  57. * @param type
  58. * @param value
  59. * @author crlang(https://crlang.com)
  60. */
  61. export function getAllNodeKeys(list, type, value, packDisabledkey = true) {
  62.   if (!list || list.length === 0) {
  63.     return []
  64.   }
  65.   const res = []
  66.   for (let i = 0; i < list.length; i++) {
  67.     const item = list[i]
  68.     if (item[type] === value) {
  69.       if ((packDisabledkey && item.disabled) || !item.disabled) {
  70.         res.push(item.key)
  71.       }
  72.     }
  73.   }
  74.   return res
  75. }
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

傲渊山岳

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表