用vue简单封装单选组件

简介: 用vue简单封装单选组件

用vue简单封装单选组件


表单类的组件,当labelfor属性等同于表单元素的ID的时候,点击label就会触发相应的表单元素的点击事件,为一些场景提供方便。

这边根据业务场景,简单封装一个单选组件。

单选的基本使用

先看下官方单选的基本使用案例

<div id="example-4">
  <input type="radio" id="one" value="One" v-model="picked">
  <label for="one">One</label>
  <br>
  <input type="radio" id="two" value="Two" v-model="picked">
  <label for="two">Two</label>
  <br>
  <span>Picked: {{ picked }}</span>
</div>
<script>
new Vue({
  el: '#example-4',
  data: {
    picked: ''
  }
})
</script>

网络异常,图片无法展示
|

封装单选组件

显然,实际业务使用中,这么一个个写radio元素的话,非常繁琐,希望封装之后可以这么使用:

<radio-component :value.sync="xxx" :options="[{text:'北京',value:'bj'}]"></radio-component>

简单传入optionsvalue就可以使用了!

  • 简单写个id的生成方法
  • 考虑到父组件更好的调用,直接使用了sync语法糖,当然也可以使用v-model语法糖,个人觉得前者更好理解
  • 这里的label内部的内容,在实际项目中,可以换成任意的标签和组件,增加灵活性
<template>
  <div class="radio-button-box" style="display: flex">
    <div v-for="(item, index) in optionsWithId" :key="index">
      <input type="radio" hidden :value="item.value" :id="item.id" />
      <label :for="item.id" @click="clickRadio(item)">
        <!-- 此处可以任意更换别的组件或者标签 -->
        <button :class="{ btn: true, selected: value === item.value }">
          {{ item.text }}
        </button>
      </label>
    </div>
  </div>
</template>
<script>
/**
 * 本组件本质是单选,options可以自定义,但必须有text和value,默认两个选项
 * value是必传项,这里值发生变化的话,通过sync语法糖修改父组件的value,从而改变这里的value
 *
 * 使用方式:<radio-component :value.sync="xxx"></radio-component>
 */
export default {
  name: 'RadioComponent',
  props: {
    options: { required: true, type: Array },
    value: { required: true }
  },
  computed: {
    optionsWithId() {
      // 给每项手动加个id
      this.options.forEach(item => {
        item.id = `radio${Math.random()
          .toString()
          .slice(3, 13)}`;
      });
      return this.options;
    }
  },
  methods: {
    clickRadio(item) {
      this.$emit("update:value", item.value);
    }
  }
};
</script>
<style scoped>
.radio-button-box {
  display: flex;
}
.btn {
  margin-right: 20px;
  padding: 5px 10px;
  border: 1px solid;
  font-size: 12px;
}
.btn.selected {
  background-color: #69f;
  color: #fff;
}
</style>

使用单选组件

使用的话,其实没啥,存入两个属性就行

<template>
  <div>
    <h1>单选组件的使用!</h1>
    <radio-component :value.sync="city" :options="options"></radio-component>
  </div>
</template>
<script>
import RadioComponent from "./components/RadioComponent.vue";
export default {
  name: "App",
  components: { RadioComponent },
  data() {
    return {
      city: null,
      options: [
        { text: "北京", value: "bj" },
        { text: "上海", value: "sh" }
      ]
    };
  }
};
</script>

网络异常,图片无法展示
|

目录
相关文章
|
19天前
|
JavaScript 前端开发 开发者
Vue 自定义进度条组件封装及使用方法详解
这是一篇关于自定义进度条组件的使用指南和开发文档。文章详细介绍了如何在Vue项目中引入、注册并使用该组件,包括基础与高级示例。组件支持分段配置(如颜色、文本)、动画效果及超出进度提示等功能。同时提供了完整的代码实现,支持全局注册,并提出了优化建议,如主题支持、响应式设计等,帮助开发者更灵活地集成和定制进度条组件。资源链接已提供,适合前端开发者参考学习。
111 17
|
17天前
|
JavaScript 前端开发 UED
Vue 表情包输入组件实现代码及详细开发流程解析
这是一篇关于 Vue 表情包输入组件的使用方法与封装指南的文章。通过安装依赖、全局注册和局部使用,可以快速集成表情包功能到 Vue 项目中。文章还详细介绍了组件的封装实现、高级配置(如自定义表情列表、主题定制、动画效果和懒加载)以及完整集成示例。开发者可根据需求扩展功能,例如 GIF 搜索或自定义表情上传,提升用户体验。资源链接提供进一步学习材料。
57 1
|
19天前
|
存储 JavaScript 前端开发
如何高效实现 vue 文件批量下载及相关操作技巧
在Vue项目中,实现文件批量下载是常见需求。例如文档管理系统或图片库应用中,用户可能需要一次性下载多个文件。本文介绍了三种技术方案:1) 使用`file-saver`和`jszip`插件在前端打包文件为ZIP并下载;2) 借助后端接口完成文件压缩与传输;3) 使用`StreamSaver`解决大文件下载问题。同时,通过在线教育平台的实例详细说明了前后端的具体实现步骤,帮助开发者根据项目需求选择合适方案。
55 0
|
19天前
|
JavaScript 前端开发 UED
Vue 项目中如何自定义实用的进度条组件
本文介绍了如何使用Vue.js创建一个灵活多样的自定义进度条组件。该组件可接受进度段数据数组作为输入,动态渲染进度段,支持动画效果和内容展示。当进度超出总长时,超出部分将以红色填充。文章详细描述了组件的设计目标、实现步骤(包括props定义、宽度计算、模板渲染、动画处理及超出部分的显示),并提供了使用示例。通过此组件,开发者可根据项目需求灵活展示进度情况,优化用户体验。资源地址:[https://pan.quark.cn/s/35324205c62b](https://pan.quark.cn/s/35324205c62b)。
34 0
|
JavaScript
Vue的非父子组件之间传值
全局事件总线 一种组件间通信的方式,适用于任意组件间通信
162 0
|
缓存 JavaScript 前端开发
Vue Props、Slot、v-once、非父子组件间的传值....
Vue Props、Slot、v-once、非父子组件间的传值....
133 0
|
JavaScript
Vue中父子组件传值
先在⽗组件中给⼦组件的⾃定义属性绑定⼀个⽗组件的变量
127 0
|
JavaScript
vue 组件传值
vue 组件传值
119 0
|
JavaScript
vue父子组件传值
vue父子组件传值
|
JavaScript
vue兄弟组件传值 方便快捷
vue兄弟组件传值 方便快捷