Vue3组件(七)封装选择类的组件

简介: Vue3组件(七)封装选择类的组件

分类



选择类的组件可以细分为:


  • 勾选 (一个CheckBox)
  • 开关 (Switch)
  • 下拉选择 (Select)
  • 单选组 (radio-group)
  • 多选组 (checkbox-group)
  • 可填可选 (autocomplete)


针对每种分类单独封装几个组件


勾选



就是一个单独的CheckBox,这个一般用在用户注册的时候,选择同意条款的地方。 一个方框,打个勾勾就可以用软件,否则不让你用。 特点就是返回true和false。 我们来简单封装一下:


<!--勾选框-->
<template>
  <el-checkbox
    v-model="value"
    @change="mySubmit"
    :id="'c' + meta.controlId"
    :name="'c' + meta.controlId"
    :disabled="meta.disabled"
    :placeholder="meta.placeholder"
  >
    {{meta.title}}
  </el-checkbox>
</template>
<script>
import controlManage from '../manage/controlManage.js'
import { metaInput } from '../manage/config.js'
export default {
  name: 'nf-el-from-checkbox',
  props: {
    modelValue: Boolean,
    meta: metaInput
  },
  emits: ['change', 'blur', 'focus'],
  setup (props, context) {
    const { value, mySubmit } = controlManage(props, context)
    return {
      value,
      mySubmit
    }
  }
}
</script>
复制代码


共用函数都已经分离出去了,所以这里设置一下模板就好。


开关



可能是UI库觉得框框打对号不好看吧,于是做了这种开关的方式,emmm,确实挺好看的。 还是简单的封装一下:


<!--开关,单选-->
<template>
  <el-switch
    v-model="value"
    active-text="on"
    inactive-text=""
    @change="mySubmit"
    :disabled="meta.disabled"
  >
  </el-switch>
</template>
<script>
import controlManage from '../manage/controlManage.js'
import { metaInput } from '../manage/config.js'
export default {
  name: 'nf-el-from-switch',
  props: {
    modelValue: Boolean,
    meta: metaInput
  },
  emits: ['input', 'change', 'blur', 'focus', 'clear'],
  setup (props, context) {
    return {
      ...controlManage(props, context)
    }
  }
}
</script>
复制代码


同上。


单选组



就是一组圆圈圈。这个只能单选,适合于选项比较少的情况,比如男、女。 有些情况下可以当做tab标签来用,而UI库也很体贴的提供了标签的形式。 继续:


<!--单选组-->
<template>
  <el-radio-group
    v-model="value"
    @change="mySubmit"
    :id="'c' + meta.controlId"
    :name="'c' + meta.controlId"
    :disabled="meta.disabled"
    :placeholder="meta.placeholder"
  >
    <el-radio
      v-for="item in meta.optionList"
      :key="'radio' + meta.controlId + item.value"
      :label="item.value">
        {{item.label}}
    </el-radio>
  </el-radio-group>
</template>
<script>
import controlManage from '../manage/controlManage.js'
import { metaInput } from '../manage/config.js'
export default {
  name: 'nf-el-from-radios',
  props: {
    modelValue: String,
    meta: metaInput
  },
  emits: ['change', 'blur', 'focus'],
  setup (props, context) {
    const { value, mySubmit } = controlManage(props, context)
    return {
      value,
      mySubmit
    }
  }
}
</script>
复制代码


这里要感谢UI库,不仅提供了好看的外观,还提供了取值的功能。所以直接取值就好。


多选组



就是一组方框框,比较传统的多选的方式。


<!--多选组-->
<template>
  <el-checkbox-group
    v-model="value"
    @change="mySubmit"
    :id="'c' + meta.controlId"
    :name="'c' + meta.controlId"
    :disabled="meta.disabled"
    :placeholder="meta.placeholder"
  >
    <el-checkbox
      v-for="item in meta.optionList"
      :key="'check' + meta.controlId + item.value"
      :label="item.value">
        {{item.label}}
    </el-checkbox>
  </el-checkbox-group>
</template>
<script>
import controlManage from '../manage/controlManage.js'
import { metaInput } from '../manage/config.js'
export default {
  name: 'nf-el-from-checkboxs',
  props: {
    modelValue: Object,
    meta: metaInput
  },
  emits: ['change', 'blur', 'focus'],
  setup (props, context) {
    const { value, mySubmit } = controlManage(props, context)
    return {
      value,
      mySubmit
    }
  }
}
</script>
复制代码


同理,不需要我们自己写代码,可以直接得到用户选择的选项值。


下拉列表框 Select



一个很基础很常用的选择组件,可以单选也可以多选,而且UI库还给扩充了查询的功能,在有些条件下还是非常实用的功能。


<!--下拉选择-->
<template>
  <el-select
    v-model="value"
    @change="mySubmit"
    :id="'c' + meta.controlId"
    :name="'c' + meta.controlId"
    :disabled="meta.disabled"
    :placeholder="meta.placeholder"
  >
    <el-option
      v-for="item in meta.optionList"
      :key="'select' + meta.controlId + item.value"
      :label="item.label"
      :value="item.value">
    </el-option>
  </el-select>
</template>
<script>
import controlManage from '../manage/controlManage.js'
import { metaInput } from '../manage/config.js'
export default {
  name: 'nf-el-from-select',
  props: {
    modelValue: String,
    meta: metaInput
  },
  emits: ['change', 'blur', 'focus'],
  setup (props, context) {
    const { value, mySubmit } = controlManage(props, context)
    return {
      value,
      mySubmit
    }
  }
}
</script>
复制代码


依托强大的UI库,我们就省事了,绑定好属性就好。只是有个奇怪的情况,我加上“multiple”后,整个Select组件居然崩了,还得继续尝试以找到原因。


看看效果



封装之后,使用起来就更简单了,一个组件一行就可以,甚至我们可以使用v-for来循环,这样我们可以方便的做多行多列的表单。 这样表单再大也不怕了,也不用担心客户总是改需求。


源码



github.com/naturefwvue…


相关文章
|
22天前
|
缓存 JavaScript UED
Vue3中v-model在处理自定义组件双向数据绑定时有哪些注意事项?
在使用`v-model`处理自定义组件双向数据绑定时,要仔细考虑各种因素,确保数据的准确传递和更新,同时提供良好的用户体验和代码可维护性。通过合理的设计和注意事项的遵循,能够更好地发挥`v-model`的优势,实现高效的双向数据绑定效果。
126 64
|
22天前
|
JavaScript 前端开发 API
Vue 3 中 v-model 与 Vue 2 中 v-model 的区别是什么?
总的来说,Vue 3 中的 `v-model` 在灵活性、与组合式 API 的结合、对自定义组件的支持等方面都有了明显的提升和改进,使其更适应现代前端开发的需求和趋势。但需要注意的是,在迁移过程中可能需要对一些代码进行调整和适配。
101 60
|
22天前
|
前端开发 JavaScript 测试技术
Vue3中v-model在处理自定义组件双向数据绑定时,如何避免循环引用?
Web 组件化是一种有效的开发方法,可以提高项目的质量、效率和可维护性。在实际项目中,要结合项目的具体情况,合理应用 Web 组件化的理念和技术,实现项目的成功实施和交付。通过不断地探索和实践,将 Web 组件化的优势充分发挥出来,为前端开发领域的发展做出贡献。
28 8
|
21天前
|
存储 JavaScript 数据管理
除了provide/inject,Vue3中还有哪些方式可以避免v-model的循环引用?
需要注意的是,在实际开发中,应根据具体的项目需求和组件结构来选择合适的方式来避免`v-model`的循环引用。同时,要综合考虑代码的可读性、可维护性和性能等因素,以确保系统的稳定和高效运行。
21 1
|
21天前
|
JavaScript
Vue3中使用provide/inject来避免v-model的循环引用
`provide`和`inject`是 Vue 3 中非常有用的特性,在处理一些复杂的组件间通信问题时,可以提供一种灵活的解决方案。通过合理使用它们,可以帮助我们更好地避免`v-model`的循环引用问题,提高代码的质量和可维护性。
32 1
|
22天前
|
JavaScript
在 Vue 3 中,如何使用 v-model 来处理自定义组件的双向数据绑定?
需要注意的是,在实际开发中,根据具体的业务需求和组件设计,可能需要对上述步骤进行适当的调整和优化,以确保双向数据绑定的正确性和稳定性。同时,深入理解 Vue 3 的响应式机制和组件通信原理,将有助于更好地运用 `v-model` 实现自定义组件的双向数据绑定。
|
25天前
|
JavaScript API 开发者
Vue是如何进行组件化的
Vue是如何进行组件化的
|
27天前
|
JavaScript 前端开发 开发者
vue 数据驱动视图
总之,Vue 数据驱动视图是一种先进的理念和技术,它为前端开发带来了巨大的便利和优势。通过理解和应用这一特性,开发者能够构建出更加动态、高效、用户体验良好的前端应用。在不断发展的前端领域中,数据驱动视图将继续发挥重要作用,推动着应用界面的不断创新和进化。
|
1天前
|
JavaScript 关系型数据库 MySQL
基于VUE的校园二手交易平台系统设计与实现毕业设计论文模板
基于Vue的校园二手交易平台是一款专为校园用户设计的在线交易系统,提供简洁高效、安全可靠的二手商品买卖环境。平台利用Vue框架的响应式数据绑定和组件化特性,实现用户友好的界面,方便商品浏览、发布与管理。该系统采用Node.js、MySQL及B/S架构,确保稳定性和多功能模块设计,涵盖管理员和用户功能模块,促进物品循环使用,降低开销,提升环保意识,助力绿色校园文化建设。
|
29天前
|
JavaScript 前端开发 开发者
vue学习第一章
欢迎来到我的博客!我是瑞雨溪,一名热爱前端的大一学生,专注于JavaScript与Vue,正向全栈进发。博客分享Vue学习心得、命令式与声明式编程对比、列表展示及计数器案例等。关注我,持续更新中!🎉🎉🎉
32 1
vue学习第一章
下一篇
DataWorks