封装 element-ui下拉选择树组件

父组件调用 下拉选择树组件<select-tree>:

html:

<select-tree :data="deepClone(selectTreeData)" :selectId="formData.parentId" @getParent="getParent" />

js:

filterDisable(data,id){// 过滤掉不能选择的树节点
      let copyData = deepClone(data)
      const len = data.length
      for(let i=0;i<len;i++){
        if(data[i].id === id || data[i].permissionType === 1){
          copyData.splice(i,1)
          copyData = this.filterDisable(copyData,id)
        }else if(data[i].children){
          copyData[i].children = this.filterDisable(data[i].children,id)
        }
      }
      return copyData
    },

下拉选择树组件select-tree:

<style lang="scss" scoped>
.select_layout{
  width:100%;
}
.select_tree{
    max-height:200px;
    width:100%;
    overflow: auto;
}
.select_tree::-webkit-scrollbar {/*滚动条整体样式*/
    width: 4px;     /*高宽分别对应横竖滚动条的尺寸*/
    height: 1px;
}
.select_tree::-webkit-scrollbar-thumb {/*滚动条里面小方块*/
    border-radius: 10px;
    -webkit-box-shadow: inset 0 0 2px rgba(0,0,0,0.2);
    background: #b1b2b4;
}
.select_tree::-webkit-scrollbar-track {/*滚动条里面轨道*/
    -webkit-box-shadow: inset 0 0 2px rgba(0,0,0,0.2);
    border-radius: 10px;
    background: #EDEDED;
}

.select_input{
  display: block;
  line-height: 32px;
  min-height: 32px;
  border-radius: 4px;
  border: 1px solid #dcdfe6;
  font-size: 14px;
  color: #606266;
  padding: 0 10px;
  cursor: pointer;
  .input_value{
    float: left;
    width: calc(100% - 40px)
  }
  .input_icon{
    float: right;
    width:15px;
    color:#dcdfe6;
  }
}
</style>
<template>
  <div class="select_layout">
    <el-popover
      ref="pop"
      placement="bottom-start"
      :width="width"
      trigger="click">
      <div class="select_input" slot="reference">
        <div class="input_value">{{selectItem.permissionName}}</div>
        <div class="input_icon">
          <i class="el-icon-arrow-down"></i>
        </div>
      </div>
      </el-select>
      <el-tree
        :data="data"
        :props="defaultProps"
        @node-click="handleNodeClick"
        class="select_tree"
      ></el-tree>
    </el-popover>
  </div>

</template>
<script>
export default {
  name:'selectTree',
  props:{
    data:{
      type:Array,
      default:[]
    },
    selectId:{
      type:Number,
      default:null
    }
  },
  data() {
      return {
        selectItem:{},
        defaultProps: {
          children: 'children',
          label: 'permissionName'
        },
        width:200
      };
    },
  watch:{
    selectId(val){
      this.selectItem = this.queryTree(this.data,val)
    }
  },
  mounted(){
    this.width = document.getElementsByClassName('select_layout')[0].clientWidth
    if(this.selectId){
      this.selectItem = this.queryTree(this.data,this.selectId)
    }
  },
    methods: {
      handleNodeClick(data) {
        this.selectItem = data
        this.$emit('getParentId',data.id)
        this.$refs.pop.doClose()
      },
      queryTree(treeData,id){
        const len = treeData.length
        for(let i = 0;i<len;i++){
          if(treeData[i].id === id){
            return treeData[i]
          }
          if(treeData[i].children){
            this.queryTree(treeData[i].children,id)
          }
        }
        return '无'
      }
    }
}
</script>


参考:https://www.cnblogs.com/yuwenjing0727/p/10214490.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个简单的封装示例: 1. 在 `components` 目录下新建一个 `select` 目录,然后在 `select` 目录下新建两个文件 `select.wxml` 和 `select.js`。 2. 在 `select.wxml` 文件中编写下拉选择器的模板代码,示例如下: ``` <view class="el-select" bindtap="onSelectTap"> <view class="el-select__input"> <input type="text" class="el-select__inner" placeholder="{{placeholder}}" disabled="{{disabled}}" value="{{selectedText}}"> <i class="el-select__caret el-icon-arrow-down"></i> </view> <view class="el-select-dropdown" hidden="{{!showDropdown}}" catchtouchmove="catchTouchMove"> <scroll-view scroll-y="{{true}}" class="el-select-dropdown__list"> <view class="el-select-dropdown__item" wx:for="{{options}}" wx:key="{{item.value}}" bindtap="onOptionTap" data-value="{{item.value}}"> {{item.label}} </view> </scroll-view> </view> </view> ``` 其中,`placeholder` 表示选择器的占位符,`disabled` 表示选择器是否禁用,`selectedText` 表示当前选中的文本,`showDropdown` 表示下拉框是否显示,`options` 表示下拉框的选项列表。 3. 在 `select.js` 文件中编写组件的逻辑代码,示例如下: ``` Component({ properties: { options: { type: Array, value: [] }, placeholder: { type: String, value: '' }, disabled: { type: Boolean, value: false }, value: { type: [String, Number], value: '', observer: 'onValueChange' } }, data: { selectedValue: '', selectedText: '', showDropdown: false }, methods: { onValueChange: function(newVal) { var options = this.data.options; var selectedItem = options.find(function(item) { return item.value == newVal; }); if (selectedItem) { this.setData({ selectedValue: selectedItem.value, selectedText: selectedItem.label }); } }, onSelectTap: function() { if (this.data.disabled) { return; } this.setData({ showDropdown: !this.data.showDropdown }); }, onOptionTap: function(event) { var value = event.currentTarget.dataset.value; this.setData({ selectedValue: value, selectedText: this.data.options.find(function(item) { return item.value == value; }).label, showDropdown: false }); this.triggerEvent('change', { value: value }); }, catchTouchMove: function() { // 阻止滚动穿透 } } }); ``` 其中,`options` 表示下拉框的选项列表,`placeholder` 表示选择器的占位符,`disabled` 表示选择器是否禁用,`value` 表示当前选中的值,`selectedValue` 表示当前选中的值,`selectedText` 表示当前选中的文本,`showDropdown` 表示下拉框是否显示。 4. 在需要使用下拉选择器的页面中,引入 `select` 组件并传入相关参数,示例如下: ``` <import src="../../components/select/select.wxml" /> <template is="select" data="{{ options: options, placeholder: '请选择', value: value }}" /> ``` 其中,`options` 表示下拉框的选项列表,`placeholder` 表示选择器的占位符,`value` 表示当前选中的值。 5. 在需要监听选择器值改变的页面中,使用 `bind:change` 绑定事件即可,示例如下: ``` <import src="../../components/select/select.wxml" /> <view class="page"> <template is="select" data="{{ options: options, placeholder: '请选择', value: value }}" bind:change="onSelectChange" /> </view> ``` 其中,`onSelectChange` 表示选择器值改变时触发的事件处理函数。 这只是一个简单的示例,如果需要更多功能可以根据实际需求进行扩展。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值