首页 > 其他分享 >二次封装 Vue-Treeselect 组件

二次封装 Vue-Treeselect 组件

时间:2022-11-04 10:46:24浏览次数:85  
标签:node Vue 封装 SelectTree label length 组件 Treeselect children

场景

开发中多个地方都需要用到 vue-treeselect组件,于是想二次封装成 SelectTree 组件便于使用。


需求1:自定义选项样式

插槽 option-label

SelectTree组件预留插槽 `diy-option`
      <label
        slot="option-label"
        slot-scope="{ node, shouldShowCount, labelClassName, countClassName }"
        :class="labelClassName"
      >
        <!-- 可自定义选项内容 -->
        <slot name="diy-option" v-bind="{ node, shouldShowCount, countClassName }">
          {{ node.label }}
          <span v-if="shouldShowCount" :class="countClassName">({{ node.children.length }})</span>
        </slot>
      </label>

样式一:展示选项的附加信息

使用SelectTree组件
                <template v-slot:diy-option="{ node, shouldShowCount, countClassName }" v-if="item.showAttachInfo">
                  <div class="option-left">
                    {{ node.label }}
                    <span v-if="shouldShowCount" :class="countClassName">({{ node.children.length }})</span>
                  </div>
                  <div class="option-right">{{ node.raw[item.attachField] }}</div>
                </template>

注意

这里暴露的 node 指的是 normalizer 中的数据,即包含 id, label, children 属性的对象。

如果要使用 options 中的其他数据 xxx,则要用 node.raw.xxx 来表示。

页面效果:

image

样式二:某些选项置灰

绑定动态类名 `gray`
                <template v-slot:diy-option="{ node, shouldShowCount, countClassName }">
                  <span :class="{ gray: !node.raw.releRankFlag }">{{ node.label }}</span>
                  <span v-if="shouldShowCount" :class="countClassName">({{ node.children.length }})</span>
                </template>

样式三:给选项添加前置图标

使用 `SvgIcon` 组件
                <template v-slot:diy-option="{ node, shouldShowCount, countClassName }">
                  <svg-icon :icon-class="node.raw['icon']" />
                  {{ node.label }}
                  <span v-if="shouldShowCount" :class="countClassName">({{ node.children.length }})</span>
                </template>

页面效果

image


需求2:自定义输入框的值

插槽 value-label

SelectTree组件预留插槽 `diy-value`
      <div slot="value-label" slot-scope="{ node }">
        <!-- 可自定义值标签 -->
        <slot name="diy-value" v-bind="{ node }">
          {{ node.label }}
        </slot>
      </div>

样式:给输入框添加前置图标

使用SelectTree组件
                <!-- 给输入框文本加上前缀图标 -->
                <template v-slot:diy-value="{ node }">
                  <svg-icon :icon-class="node.raw.icon" />
                  {{ node.raw.name  }}
                </template>

页面效果

image

需求3:是否可选择有子项的节点 :disable-branch-nodes="disBranchNodes"

需求4:是否显示子项的数量 :show-count="showCount"

需求5:是否禁用 :disabled="isDisabled"

需求6:是否显示可清空按钮 :clearable="showClearable"

需求7:设置默认文本

noOptionsText="暂无数据"

noResultsText="未搜索到匹配项"

:placeholder="placeText ? placeText : 请选择上级${this.nodeLabel}(可搜索)"

问题:父组件给 SelectTree传递输入框要绑定的值 valSelectTreevalv-model 双向绑定给 treeselect。选择值后 val 会改变。报错:不允许直接更改父组件通过 prop 传递的数据

原因:Vue 单向数据流,父组件传递给子组件的数据,子组件不能直接更改。

解决办法:子组件可以设置计算属性返回传递的 prop 数据。

注意:在这里选择值后需要把新值传递给父组件,因此计算属性要设置 setter

image

image

image

image

标签:node,Vue,封装,SelectTree,label,length,组件,Treeselect,children
From: https://www.cnblogs.com/shayloyuki/p/16856713.html

相关文章

  • Vue脚手架生成一个新项目
    Vue脚手架生成一个新项目 1.输入cmd打开当前目录,并输入指令vuecreate项目名称 2.选择自己配置的历史配置或使用新配置Manuallyselectfeatures(即为新配置......
  • Module Error (from ./node_modules/@dcloudio/vue-cli-plugin-uni/packages/vue-load
    使用uni-app报ModuleError(from./node_modules/@dcloudio/vue-cli-plugin-uni/packages/vue-loader/lib/loaders/templateLoader.js):检查控制台提示的xx.vue检查看......
  • vue组件通信6种方式总结(常问知识点)
    前言在Vue组件库开发过程中,Vue组件之间的通信一直是一个重要的话题,虽然官方推出的Vuex状态管理方案可以很好的解决组件之间的通信问题,但是在组件库内部使用Vuex往往会......
  • 你可能需要的vue相关考点汇总
    组件中写name属性的好处可以标识组件的具体名称方便调试和查找对应属性//源码位置src/core/global-api/extend.js//enablerecursiveself-lookupif(name){......
  • vue3.0新的打包工具vite
    vitevite是基于esbuild预构建的,esbuild是用GO语言编写的,比js编写的打包器预构建快10-100倍,js跟go语言相比太慢了。与webpack相比:vite服务器启动速度比webpack快,由于vite......
  • vue组件通信方式有哪些?
    vue组件通信方式一、props(父向子传值----自定义属性)/$emit(子向父传值-----自定义事件)父组件通过props的方式向子组件传递数据,而通过$emit子组件可以向父组件通信......
  • Vue双向绑定理解与模拟
    title:Vue双向绑定理解与模拟1.Vue的双向绑定理解先从单向绑定进行理解,单向绑定就是将Model(data)绑定到视图层View,当我们使用JS更新Model数据层时,视图层就是进行自动......
  • 4.vue的常见指令
    指令常作用在Html的标签上,实现对应的功能1.文本指令v-html:将变量代指的字符串通过html代码渲染在页面v-text:将变量代指的字符串通过普通文本显示在页面v-text完成......
  • 基于Springboot+Mybatisplus+Vue的在线购物平台管理系统
    基于Springboot+Mybatisplus+Vue的在线购物平台管理系统......
  • Vue实现input宽度随文字长度自适应操作
    <divclass="textcontain"><inputtype="text"v-model.number="item.cardComboMoney"maxlength="5"placeholder="设定数值"onin......