# 级联选择器

当一个数据集合有清晰的层级结构时,可通过级联选择器逐级查看并选择。

# 基本用法

通过设置 source 属性来指定级联选择器的选项数组,数组元素为一个对象,包含 idname 属性。还可以通过 selected 属性(或者 v-model)来指定默认选中的选项

# 效果展示

<template>
  <p>当前选中选项的 id 为 {{ selected }}</p>
  <woo-cascader v-model="selected" :source="source" @change="handleChange">
  </woo-cascader>
</template>

<script>
export default {
  data() {
    return {
      selected: ["shanghai", "huangpu"],
      source: [
        {
          id: "guangdong",
          name: "广东",
          children: [
            {
              id: "shenzhen",
              name: "深圳",
              children: [
                { id: "nanshan", name: "南山" },
                { id: "futian", name: "福田" },
                { id: "luohu", name: "罗湖" },
                { id: "baoan", name: "宝安" },
              ],
            },
            {
              id: "guangzhou",
              name: "广州",
              children: [
                { id: "tianhe", name: "天河" },
                { id: "liwan", name: "荔湾" },
                { id: "yuexiu", name: "越秀" },
                { id: "haizhu", name: "海珠" },
                { id: "huangpu", name: "黄埔" },
              ],
            },
          ],
        },
        {
          id: "shanghai",
          name: "上海",
          children: [
            { id: "baoshan", name: "宝山" },
            { id: "huangpu", name: "黄浦" },
            { id: "xuhui", name: "徐汇" },
          ],
        },
        {
          id: "zhejiang",
          name: "浙江",
          children: [
            {
              id: "hangzhou",
              name: "杭州",
              children: [
                { id: "shangcheng", name: "上城" },
                { id: "xiacheng", name: "下城" },
                { id: "xihu", name: "西湖" },
              ],
            },
            {
              id: "ningbo",
              name: "宁波",
              children: [
                { id: "haishu", name: "海曙" },
                { id: "jiangbei", name: "江北" },
              ],
            },
          ],
        },
      ],
    };
  },
  methods: {
    handleChange(selected) {
      console.log(selected);
    },
  },
};
</script>

# 动态加载

通过 loadData 来设置加载数据源的方法,loadData 方法有两个参数,第一个参数 node 为当前点击的节点,第二个 callback 为数据加载完成的回调(必须调用)。

采用动态加载方式时,应当为 source 属性添加 .sync 修饰符,以确保数据源是同步变化的,在数据更新后会触发事件 update:source,回调参数为更新后的数据源 source

同时,为了更准确的显示节点的状态,还可以对节点数据添加是否为叶子节点的标志位 isLeaf,否则会简单的以节点有无 children 属性来判断是否为叶子节点。

# 效果展示

<template>
    <p>当前选中选项的 id 为 {{ selected }}</p>
    <woo-cascader
      v-model="selected"
      :source.sync="source"
      :load-data="loadData"
      @update:source="handleUpdate"
      @change="handleChange"
    ></woo-cascader>
  </div>
</template>

<script>
export default {
  methods: {
    handleUpdate(id) {
      console.log(id);
    },
    handleChange(selected) {
      console.log(selected);
    },
    loadData(node, callback) {
      const { id, name } = node;
      // 获取数据的函数
      const updateChildren = (pid, pname) => {
        return new Promise((resolve, reject) => {
          setTimeout(() => {
            const children = [
              { id: `${pid}-1`, name: `${pname}-1`, isLeaf: false },
              { id: `${pid}-2`, name: `${pname}-2`, isLeaf: false },
              { id: `${pid}-3`, name: `${pname}-3`, isLeaf: false },
            ];
            resolve(children);
          }, 1000);
        });
      };

      updateChildren(id, name).then((res) => {
        // 通过调用 callback 将子节点数据返回,通知组件数据加载完成
        callback(res);
      });
    },
  },
  data() {
    return {
      selected: [],
      source: [
        {
          id: "Option 1",
          name: "选项 1",
          isLeaf: false,
        },
        {
          id: "Option 2",
          name: "选项 2",
          isLeaf: false,
        },
      ],
    };
  },
};
</script>

# 🌏 API

# Cascader Attributes

参数 说明 类型 可选值 默认值
selected / v-model 绑定值,默认选中选项的 id Array
source 可选项数据源,必须设置键 idname,分别表示选项的值和选项的文本内容,可选的键 isLeaf Object
loadData 加载动态数据的方法 function(node, callback),node 为当前点击的节点,callback 为数据加载完成的回调(必须调用)

# Events

事件名称 说明 回调参数
update:source 数据源动态加载,更新后触发 更新后的数据源 source
change 被选中的选项发生变化时触发 当前被选中选项的 id 数组
visible-change 弹出层打开 / 隐藏时触发 当前弹出层的显示状态