vue使用el-select、el-tree封装 下拉树

element-select-tree组件

子组件代码

<template>
  <div>
    <el-select @visible-change="selectClose" v-model="modelValueLabel" :filter-method="selectFilterMethod"
               style="min-width: 180px;" :size="size" :placeholder="placeholderText" :filterable="isFilter" multiple
               :collapse-tags="isTag"
               @change="selectChangeMethod">
      <el-option :value="modelValue" style="height: auto;padding: 0;">
        <el-tree  :data="treeData" :default-expand-all="isDefaultAll" :expand-on-click-node="false"
                 :filter-node-method="filterNode" show-checkbox
                 :check-strictly="true" node-key="id" ref="demoTree" highlight-current
                 :props="defaultProps"
                 @check-change="handleCheckChange"></el-tree>
      </el-option>
    </el-select>
  </div>
</template>

<script>
export default {
  name: "index",
  props:{
    // echoObj 可以用于回显,它的值为需要回显的对象,多个时可以使用数组
    echoObj:{},
    isFilter:{  // 是否开启搜索
      default:true
    },
    size:{ // 尺寸
      default:'mini'
    },
    placeholderText:{  // 提示文字
      default:'请选择...'
    },
    isTag:{  // 是否已tag标签展示
      default:true
    },
    isDefaultAll:{ // 是否默认展开全部
      default:true,
    },
    expandClickNode:{ // 点击节点是否展开
      default:false
    },
    fieldName:'', // 字段key,用于取出数据中的名字
    fieldId:'', // 字段key, 数据中的id
    treeData:'',  // 数据
    defaultProps: {     // 遍历时字段格式化
      default: {
        children: 'children',
        label: 'label'
      }
    },
    isSingleChoice:{ // 是否单选
      default:false
    }

  },
  data() {
    return {
      // 声明数据
      modelValue:[], // 实际选中值
      modelValueLabel:[], // 下拉框绑定值(选中值名字)
    }
  },
  methods: {
    // 方法
    /**
      @description:下拉框打开时,还原搜索数据
      @auth:Sky(孙雨琪)
      @time: 2021-03-29 09:20:48
    **/
    selectClose(bool){
      if(bool){
        this.selectFilterMethod('')
      }
    },
    /**
      @description:自定义筛选方法
      @auth:Sky(孙雨琪)
      @time: 2021-03-26 16:38:39
    **/
    selectFilterMethod(val) {
      // 下拉框调用tree树筛选
      this.$refs.demoTree.filter(val);
    },
    /**
      @description:select框值改变时候触发的事件
      @auth:Sky(孙雨琪)
      @time: 2021-03-26 16:44:24
    **/
    selectChangeMethod(e) {
      let arrNew = [];
      let dataLength = this.modelValue.length;
      let eLength = e.length;
      for (let i = 0; i < dataLength; i++) {
        for (let j = 0; j < eLength; j++) {
          if (e[j] === eval('this.modelValue[i].'+this.fieldName)) {
            arrNew.push(this.modelValue[i])
          }
        }
      }
      this.$refs.demoTree.setCheckedNodes(arrNew);//设置勾选的值
    },
    /**
      @description:树筛选
      @auth:Sky(孙雨琪)
      @time: 2021-03-26 16:46:06
    **/
    filterNode(value, data) {
      if (!value) return true;
      return eval('data.'+this.fieldName).indexOf(value) !== -1;
    },

    /**
      @description:进行绑定选中树后下拉绑定
      @auth:Sky(孙雨琪)
      @time: 2021-03-26 16:52:38
    **/
    handleCheckChange(data,checkd,node) {
      if(this.isSingleChoice){
        if(checkd){
          this.$refs.demoTree.setCheckedNodes([data]);
        }
      }

      let res = this.$refs.demoTree.getCheckedNodes(false, false); //这里两个true,1. 是否只是叶子节点 2. 是否包含半选节点(就是使得选择的时候不包含父节点)
      let arrLabel = [];
      let arr = [];
      res.forEach(element => {
        arrLabel.push(eval('element.'+this.fieldName));
        arr.push(element);
      });
      this.modelValue = arr;
      this.modelValueLabel = arrLabel
      if(this.isSingleChoice) {
        if(arr.length === 1){
          this.$emit('callBackFunc',arr)
        }
      }else{
        this.$emit('callBackFunc',arr)
      }
    },
  },
  mounted() {
    // selectTree下拉树
    // 组件当前版本version:2.0
    // 更新时间:2021-03-31 15:38:17
    // 作者:sky(孙雨琪)
    if(this.echoObj){
      if(this.echoObj.length > 0){
        let ids = []
        let names = []
        for (let i = 0; i< this.echoObj.length;i++){
          ids.push(eval('this.echoObj[i].'+this.fieldId))
          names.push(eval('this.echoObj[i].'+this.fieldName))
          this.modelValue.push(this.echoObj[i])
        }
        this.modelValueLabel = names
        this.$nextTick(() => {
          this.$refs.demoTree.setCheckedKeys(ids);
        })
      }
    }

  },
  created() {
    // 页面未渲染时加载
  }
}
</script>

<style scoped>

</style>

父组件代码

1.使用引入组件

	import treeSelect from '@/components/selectTree'
	
2.使用components注册组件

	components:{
	  treeSelect
	}
	
3.data中声明组件所需数据
	 // 用户回显(当没有回显时,不传该参数即可)
      value:[
        {
          id:1.11,
          name:'一级-1-1',
          children:[],
        },
        {
          id:1.15,
          name:'一级-1-5',
          children:[],
        }
      ],
      colName:'name', // 字段对应name
      colId:'id', // 字段对应id
      // 遍历时格式化
      defaultProps: {
        children: 'children',
        label: 'name'
      },
      // 数据
      tree:[
        {
          id:1,
          name:'一级',
          children:[
            {
              id:1.1,
              name:'一级-1',
              children:[
                {
                  id:1.11,
                  name:'一级-1-1',
                  children:[],
                },
                {
                  id:1.12,
                  name:'一级-1-2',
                  children:[],
                },
                {
                  id:1.13,
                  name:'一级-1-3',
                  children:[],
                },
                {
                  id:1.14,
                  name:'一级-1-4',
                  children:[],
                },
                {
                  id:1.15,
                  name:'一级-1-5',
                  children:[],
                },
              ],
            },
            {
              id:1.2,
              name:'一级-2',
              children:[],
            },
            {
              id:1.3,
              name:'一级-3',
              children:[],
            }
          ]
        }
      ]

4.使用组件

    <tree-select @callBackFunc="demoCallBack" :echoObj="value" :fieldName="colName" :fieldId="colId" :treeData="tree" :defaultProps="defaultProps" :isSingleChoice="false"></tree-select>

5.methods中声明方法接收子组件传来对应选中的值
	// 回调 取出数据
    demoCallBack(data){
      // 此时data中为选中的数据(是一个数组)
      console.log(data)
    }

注:此文章用于记录学习,本人也是前端小白

  当前组件可能会有功能未完善,欢迎反馈	
  邮箱:1312003804@qq.com
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值