vue-自定义组件-自定义checkbox效果

一个学生的问题

需求

完成如下的checkbox效果
在这里插入图片描述

写了个简单的demo

子组件

<template lang="">
  <div>
    <div
      class="ck"
      v-for="(item, index) in items"
      :key="index"
      :checked="item.checked"
      @click.prevent="item.checked=!item.checked"
    >
      <span>{{ item.text }}</span>
    </div>
  </div>
</template>
<script>
export default {
  name: "MyCheckBox",
  props: {
    items: {
      type: Array,
      required: true
    }
  },
  data() {
    return {};
  },
  methods: {
      switchCk(checked){
          console.log('switchCk');
          checked!=checked
      },
  }
};
</script>
<style scoped>
.ck {
  margin: 0px 5px;
  display: inline-block;
  border-radius: 30px;
  background-color: #ebeef7;
  padding: 5px;
  background-image: url("./icon-ck-normal.png");
  background-repeat: no-repeat;
  background-position: 96% center;
  padding-right: 40px;
}
.ck[checked] {
  background-color: #00bf77;
  background-image: url("./icon-ck-checked.png");
}
</style>

父组件

导入

import MyCheckBox from "./MyCheckBox.vue";

注册

 components: {
    MyCheckBox
  },

使用

<my-check-box @change="onChange" :items="ckItems"> </my-check-box>

数据

ckItems: [
        { text: "人员死亡", checked: false },
        { text: "伤害妇女", checked: true },
        { text: "SSP人员涉离(即公安人员)", checked: false },
        { text: "SSP人员涉离(即公安人员)受害 ", checked: true },
        { text: "高于四层建筑", checked: false }
      ],

数据获取

printCkItems() {
      var checkedStr = this.ckItems
        .map(function(obj) {
          return obj.checked;
        })
        .join(",");
      alert(checkedStr);
    },
### Vue 3 自定义组件实现 `v-model` 双向绑定 在 Vue 3 中,为了使自定义组件能够支持 `v-model` 进行双向数据绑定,需要遵循特定的设计模式。下面是一个详细的例子来展示如何创建这样的组件。 #### 组件模板设计 首先构建一个简单的输入框作为演示用途的组件: ```html <template> <div class="custom-input"> <label>{{ label }}</label> <input :value="modelValue" @input="$emit('update:modelValue', $event.target.value)" /> </div> </template> <script> export default { props: { modelValue: String, label: { type: String, required: true } } }; </script> <style scoped> .custom-input { margin-bottom: 1rem; } .custom-input input { border: 1px solid #ccc; padding: 0.5rem; width: calc(100% - 1rem); box-sizing: border-box; } </style> ``` 此代码片段展示了如何通过监听 `@input` 事件并发射更新后的值给父级组件来完成双向绑定[^1]。 #### 使用该组件 当要在其他地方使用这个带有 `v-model` 支持的新组件时,只需像这样写入即可: ```html <CustomInput v-model="parentData" label="请输入文字:" /> <script setup> import { ref } from 'vue'; const parentData = ref(''); </script> ``` 这里的关键在于理解 `v-model` 默认会寻找名为 `modelValue` 的属性以及相应的 `update:modelValue` 事件来进行同步操作[^2]。 #### 处理多个 `v-model` 如果希望同一个组件能响应多于一次的 `v-model` 调用,则可以通过指定不同的修饰符或者参数名称来区分各个模型字段。例如,在上述基础上扩展以接受第二个可选的 `v-model:checked` 参数用于布尔类型的开关状态控制。 ```html <!--组件 --> <MyComponent v-model:title="titleText" v-model:checked="isChecked" /> <!--组件 --> <template> ... <checkbox :checked="checked" @change="$emit('update:checked', $event.target.checked)"> ... </template> <script> export default { // ... emits: ['update:title', 'update:checked'], props: { title: String, checked: Boolean }, methods: { handleChange(event) { this.$emit(`update:${event.currentTarget.name}`, event.target.value || event.target.checked); } } }; </script> ``` 这种做法允许更灵活的数据流管理而不会引起冲突或混乱的情况发生。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值