当前位置:首页 > VUE

vue实现switch组件

2026-01-19 03:12:07VUE

Vue 实现 Switch 组件

基本结构

使用 Vue 的单文件组件(SFC)实现一个基础的 Switch 组件。模板部分包含一个 div 包裹的 inputspan,通过 CSS 实现开关样式。

<template>
  <div class="switch" @click="toggle">
    <input type="checkbox" v-model="isChecked" class="switch-input" />
    <span class="slider"></span>
  </div>
</template>

数据与事件

通过 v-model 实现双向绑定,监听点击事件切换状态。

vue实现switch组件

<script>
export default {
  props: {
    value: {
      type: Boolean,
      default: false
    }
  },
  data() {
    return {
      isChecked: this.value
    };
  },
  methods: {
    toggle() {
      this.isChecked = !this.isChecked;
      this.$emit('input', this.isChecked);
      this.$emit('change', this.isChecked);
    }
  },
  watch: {
    value(newVal) {
      this.isChecked = newVal;
    }
  }
};
</script>

样式设计

使用 CSS 实现滑动效果,通过伪类和过渡动画增强交互体验。

<style>
.switch {
  position: relative;
  display: inline-block;
  width: 60px;
  height: 34px;
}

.switch-input {
  opacity: 0;
  width: 0;
  height: 0;
}

.slider {
  position: absolute;
  cursor: pointer;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  background-color: #ccc;
  transition: 0.4s;
  border-radius: 34px;
}

.slider:before {
  position: absolute;
  content: "";
  height: 26px;
  width: 26px;
  left: 4px;
  bottom: 4px;
  background-color: white;
  transition: 0.4s;
  border-radius: 50%;
}

.switch-input:checked + .slider {
  background-color: #4CAF50;
}

.switch-input:checked + .slider:before {
  transform: translateX(26px);
}
</style>

使用示例

在父组件中通过 v-model 绑定数据,监听状态变化。

vue实现switch组件

<template>
  <div>
    <Switch v-model="isActive" @change="handleChange" />
  </div>
</template>

<script>
import Switch from './Switch.vue';

export default {
  components: { Switch },
  data() {
    return {
      isActive: false
    };
  },
  methods: {
    handleChange(val) {
      console.log('Switch state:', val);
    }
  }
};
</script>

自定义样式

通过 props 支持自定义颜色和尺寸,增强组件灵活性。

props: {
  activeColor: {
    type: String,
    default: '#4CAF50'
  },
  inactiveColor: {
    type: String,
    default: '#ccc'
  },
  size: {
    type: String,
    default: 'medium',
    validator: (val) => ['small', 'medium', 'large'].includes(val)
  }
}

通过计算属性动态生成样式类:

computed: {
  sliderStyle() {
    return {
      backgroundColor: this.isChecked ? this.activeColor : this.inactiveColor,
      width: this.size === 'small' ? '40px' : this.size === 'large' ? '80px' : '60px',
      height: this.size === 'small' ? '20px' : this.size === 'large' ? '40px' : '34px'
    };
  }
}

标签: 组件vue
分享给朋友:

相关文章

vue实现图片搜索

vue实现图片搜索

Vue实现图片搜索功能 使用HTML5的File API获取图片 通过<input type="file">元素让用户选择图片文件,使用FileReader对象读取图片数据。 <…

vue实现继承语法糖

vue实现继承语法糖

在Vue中实现继承可以通过多种方式模拟类继承的效果,以下是常见的几种方法: 使用mixins实现逻辑复用 通过Vue的mixins机制共享组件选项,达到类似继承的效果: const BaseC…

vue里实现增删改查

vue里实现增删改查

在Vue中实现增删改查 数据初始化 在Vue组件的data中定义初始数据和表单绑定的变量: data() { return { items: [ { id: 1, name:…

vue实现下拉框组件

vue实现下拉框组件

基础下拉框实现 使用Vue的v-model和v-for指令实现基础下拉框: <template> <select v-model="selectedOption">…

vue实现计时

vue实现计时

Vue 实现计时功能 在 Vue 中实现计时功能可以通过多种方式完成,以下是几种常见的方法: 使用 setInterval 实现基础计时器 通过 setInterval 和 clearInterva…

vue实现轮询

vue实现轮询

实现轮询的基本方法 在Vue中实现轮询可以通过setInterval或setTimeout配合递归调用完成。轮询通常用于定期向服务器请求数据更新。 使用setInterval的简单示例: data…