7021f2fd创建于 2025年5月14日历史提交
<route lang="json5" type="page">
{
  layout: 'default',
  style: {
    navigationBarTitleText: '树示例',
    navigationStyle: 'custom',
    disableScroll: true, // 微信禁止页面滚动
    'app-plus': {
      bounce: 'none', // 禁用 iOS 弹性效果
    },
  },
}
</route>

<template>
  <PageLayout navTitle="树示例" backRouteName="demo">
    <view class="btnArea bg-white">
      <view class="group">
        <wd-button @click="doCheckedTree(['2'], true)">全选</wd-button>
        <wd-button @click="doCheckedTree(['2'], false)">取消全选</wd-button>
      </view>
      <view class="group">
        <wd-button @click="doExpandTree('all', true)">展开全部节点</wd-button>
        <wd-button @click="doExpandTree('all', false)">收起全部节点</wd-button>
      </view>
      <view class="group">
        <wd-button @click="doExpandTree(['22', '23'], true)">展开节点</wd-button>
        <wd-button @click="doExpandTree(['22', '23'], false)">收起节点</wd-button>
      </view>
      <view class="group">
        <wd-button @click="doCheckedTree(['211', '222'], true)">选中指定节点</wd-button>
        <wd-button @click="doCheckedTree(['211', '222'], false)">取消选中指定节点</wd-button>
      </view>
    </view>
    <scroll-view class="bg-gray-1" scroll-y>
      <view class="content p-2 mt-14px">
        <view class="title mt-5">多选</view>
        <DaTree
          ref="DaTreeRef"
          :data="roomTreeData"
          labelField="name"
          valueField="id"
          defaultExpandAll
          showCheckbox
          :defaultCheckedKeys="defaultCheckedKeysValue"
          @change="handleTreeChange"
          @expand="handleExpandChange"
        ></DaTree>
      </view>
      <view class="content p-2 mt-14px">
        <view class="title mt-5">单选</view>
        <DaTree
          :data="roomTreeData"
          labelField="name"
          valueField="id"
          defaultExpandAll
          :defaultCheckedKeys="defaultCheckedKeysValue2"
          @change="handleTreeChange"
          @expand="handleExpandChange"
        ></DaTree>
      </view>
      <view class="content p-2 mt-14px">
        <view class="title mt-5">默认展开指定节点</view>
        <DaTree
          :data="roomTreeData"
          labelField="name"
          valueField="id"
          showCheckbox
          :defaultExpandedKeys="defaultExpandKeysValue3"
          @change="handleTreeChange"
          @expand="handleExpandChange"
        ></DaTree>
      </view>
      <view class="content p-2 mt-14px mb-14px">
        <view class="title mt-5">异步加载数据</view>
        <DaTree
          :data="roomTreeData"
          labelField="name"
          valueField="id"
          showCheckbox
          loadMode
          :loadApi="GetApiData"
          defaultExpandAll
          @change="handleTreeChange"
          @expand="handleExpandChange"
        ></DaTree>
      </view>
    </scroll-view>
  </PageLayout>
</template>

<script lang="ts" setup>
//
import { defineComponent, ref } from 'vue'

/**
 * 模拟创建一个接口数据
 */
function GetApiData(currentNode) {
  const { key } = currentNode

  return new Promise((resolve) => {
    setTimeout(() => {
      // 模拟返回空数据
      if (key.indexOf('-') > -1) {
        return resolve(null)
        // return resolve([])
      }

      return resolve([
        {
          id: `${key}-1`,
          name: `行政部X${key}-1`,
        },
        {
          id: `${key}-2`,
          name: `财务部X${key}-2`,
          append: '定义了末项数据',
          leaf: true,
        },
        {
          id: `${key}-3`,
          name: `资源部X${key}-3`,
        },
        {
          id: `${key}-4`,
          name: `资源部X${key}-3`,
          append: '被禁用,无展开图标',
          disabled: true,
        },
      ])
    }, 2000)
  })
}

import DaTree from '@/uni_modules/da-tree/index.vue'
const DaTreeRef = ref()
// key的类型必须对应树数据key的类型
const defaultCheckedKeysValue = ref(['211', '222'])
const defaultCheckedKeysValue2 = ref('222')
const defaultExpandKeysValue3 = ref(['212', '231'])
const roomTreeData = ref([
  {
    id: '2',
    name: '行政中心',
    children: [
      {
        id: '21',
        name: '行政部',
        children: [
          {
            id: '211',
            name: '行政一部',
            children: null,
          },
          {
            id: '212',
            name: '行政二部',
            children: [],
            disabled: true,
          },
        ],
      },
      {
        id: '22',
        name: '财务部',
        children: [
          {
            id: '221',
            name: '财务一部',
            children: [],
            disabled: true,
          },
          {
            id: '222',
            name: '财务二部',
            children: [],
          },
        ],
      },
      {
        id: '23',
        name: '人力资源部',
        children: [
          {
            id: '231',
            name: '人力一部',
            children: [],
          },
          {
            id: '232',
            name: '人力二部',
            // append: '更多示例,请下载示例项目查看',
          },
        ],
      },
    ],
  },
])
function doExpandTree(keys, expand) {
  DaTreeRef.value?.setExpandedKeys(keys, expand)

  const gek = DaTreeRef.value?.getExpandedKeys()
  console.log('当前已展开的KEY ==>', gek)
}
function doCheckedTree(keys, checked) {
  DaTreeRef.value?.setCheckedKeys(keys, checked)

  const gek = DaTreeRef.value?.getCheckedKeys()
  console.log('当前已选中的KEY ==>', gek)
}
function handleTreeChange(allSelectedKeys, currentItem) {
  console.log('handleTreeChange ==>', allSelectedKeys, currentItem)
}
function handleExpandChange(expand, currentItem) {
  console.log('handleExpandChange ==>', expand, currentItem)
}
</script>

<style lang="scss" scoped>
//
.btnArea {
  display: flex;
  flex-direction: column;
  align-items: center;
  padding-top: 10px;
  .group {
    margin-bottom: 10px;
  }
  :deep(.wd-button) {
    margin: 0 5px;
  }
}
.content {
  background-color: #fff;
  .title {
    font-size: 15px;
  }
}
</style>