vue2如何二次封装表单控件如input, select等

需求

项目需要做一个城市选择器,数据来源公司的后端,要求用级联选择,使用的el-cascader

思路

二次封装要尽可能保留原有的组件prop,用法尽量保持和el-cascader一致,所以采用透传的方式传递prop

javascript 复制代码
<template>
  <div class="container" >
    <el-cascader
      :options="areaOptions"
      style="width: 100%"
      clearable
      ref="cascader"
      :value="value"
      @input="handleChange"
      v-on="$listeners"
      v-bind="$attrs"
    />
  </div>
</template>
<script>
import { findListByParentId } from '@/api/area/area'
export default {
  name: 'regionCascader',
  props: {
    value: {
      type: Array,
      default: () => []
    },
    disabledFunc: {
      // 这里是判断选项是否禁用的方法
      type: Function,
      default: (opts, level) => {
        return false
      }
    }
  },
  data() {
    return {
      options: []
    }
  },
  computed: {
    areaOptions() {
      const setOptions = (opts, level) => {
        return opts.map(opt => {
          if (opt?.children?.length) {
            opt.children = setOptions(opt.children, level + 1)
          }
          const param = {
            ...opt,
            value: opt.id,
            label: opt.areaName,
            disabled: this.disabledFunc(opt, level)
          }
          return param
        })
      }
      return setOptions(this.options, 0)
    }
  },
  mounted() {
    this.getList()
  },
  methods: {
    handleChange(e) {
      this.$emit('input', e)
    },
    getList() {
      // 这里放获取数据的逻辑
    },

    getCheckedNodes() {
      return this.$refs.cascader.getCheckedNodes()
    }
  }
}
</script>
<style scoped>
.container{
   width: 100%;
}
</style>

后话

在VUE2中 2.6版本以后可以改为如下,去掉划线代码

在2.6版本以前,$attrs是不会获取到value字段,所以导致透传不进去,必须显示声明props.value

相关推荐
FungLeo1 小时前
成为全栈·React 管理后台篇·总复盘:从“接口能调通”到“后台值得使用”
前端·react.js·前端框架·项目复盘·成为全栈
Csvn3 小时前
并发模式:让渲染学会排队、插队和让路
前端
可乐鸡翅yeah_3 小时前
新手梳理:M3U8 线上问题,哪些是前端锅,哪些是后端锅
前端·ios·音视频·实时音视频·m3u8·音视频在线播放
Flynt3 小时前
Linear 用 1000 个 PR 换掉 styled-components,我写了 200 个按钮,把这笔账复现了一遍
前端·css·preact
JavaGuide4 小时前
NVIDIA 又开源了!这次给 AI Agent 加上权限管控
前端·后端
excel4 小时前
prisma 如何处理数据库竞态
前端·数据库·后端
莪_幻尘5 小时前
Skill 体检:30 个 Skill 全凭感觉?体检器先自曝了 8 个“假 0 分
前端·人工智能·llm
风骏时光牛马5 小时前
AI模型综合能力评测:性能、指令遵循与多场景实测对比
前端
Frag0ut5 小时前
Chrome与Chromium内核浏览器在Windows 11上的新特性全景解析
前端·chrome·windows·web安全·chromium·gemini ai·playready drm
hiahiahia1236 小时前
实现完整 Tool Dispatcher
开发语言·前端