vue.js封装switch开关组件的操作


Posted in Javascript onOctober 26, 2020

我的项目本来用的element,但是switch开关不符合设计要求,于是自己封装了一个switch组件,并且实现了switch开关的双向数据绑定

vue.js封装switch开关组件的操作

<template>
<label role="checkbox" :class="['switch', { toggled }]">
<input type="checkbox" class="switch-input" @change="toggle" />
<div
class="switch-core"
:style="{ backgroundColor: toggled ? colorChecked : colorUnchecked }"
>
<div
class="switch-button"
:style="{
transition: `transform ${speed}ms`,
transform: toggled ? null : `translate3d(32px, 0px, 0px)`
}"
></div>
</div>
<span class="switch-label label-right" v-if="toggled" v-html="labelChecked">
</span>
<span class="switch-label label-left" v-html="labelUnchecked" v-else>
</span>
</label>
</template>
<script>
export default {
 name: "ToggleSwitch",
 data() {
  return {
   toggled: this.value
  };
 },
 props: {
  value: {
   type: Boolean,
   default: true
  },
  speed: {
   type: Number,
   default: 100
  },
  labelChecked: {
   type: String,
   default: "启用"
  },
  labelUnchecked: {
   type: String,
   default: "停用"
  },
  colorChecked: {
   type: String,
   default: "#11CED2"
  },
  colorUnchecked: {
   type: String,
   default: "#E6EAF1"
  }
 },
 watch: {
  value: function(val) {
   this.value = val;
  }
 },
 methods: {
  toggle(event) {
   this.toggled = !this.toggled;
   this.$emit("update:value", this.toggled);
   this.$emit("change", event);
  }
 }
};
</script>
<style lang="scss" scoped>
.switch {
 display: inline-block;
 position: relative;
 overflow: hidden;
 vertical-align: middle;
 user-select: none;
 font-size: 10px;
 cursor: pointer;
 
 .switch-input {
  display: none;
 }
 
 .switch-label {
  position: absolute;
  top: 0;
  font-weight: 600;
  color: white;
 
  z-index: 2;
 
  &.label-left {
   left: 10px;
   line-height: 20px;
   border-top-left-radius: 2px;
   border-bottom-left-radius: 2px;
   color: #b5bdc8;
  }
 
  &.label-right {
   right: 10px;
   line-height: 20px;
   border-top-right-radius: 2px;
   border-bottom-right-radius: 2px;
  }
 }
 
 .switch-core {
  display: block;
  position: relative;
  box-sizing: border-box;
  outline: 0;
  margin: 0;
  transition: border-color 0.3s, background-color 0.3s;
  user-select: none;
  width: 46px;
  height: 20px;
  border-radius: 4px;
  line-height: 20px;
 
  .switch-button {
   width: 8px;
   height: 16px;
   display: block;
   position: absolute;
   overflow: hidden;
   top: 2;
   left: 2;
   z-index: 3;
   transform: translate3d(0, 0, 0);
   background-color: rgba(255, 255, 255, 1);
   border-radius: 4px;
   margin-top: 2px;
   margin-left: 2px;
  }
 }
}
</style>

调用开关组件

<toggle-switch
       v-model="value"
       :value.sync="value"
       @change="switchChange"
      >
      </toggle-switch>

组件实现了switch开关的双向数据绑定,在父组件的methods中写一个@change事件

switchChange() {
   console.log("switch值改变");
  },

补充知识:vue 监控el-switch控件值的变化

我要的效果是根据系统消息的推送范围决定推送人标签的显示,如下图两种情况:

——选择全站推送

vue.js封装switch开关组件的操作

——选择个人推送

vue.js封装switch开关组件的操作

——页面定义的data对象

vue.js封装switch开关组件的操作

el-switch标签控件的代码, v-model="entity.pushRange"绑定的是推送范围字段

<el-form-item label="推送范围:" :label-width="formLabelWidth" prop="pushRange">
    <el-switch
     v-model="entity.pushRange"
     active-color="#13ce66"
     inactive-color="#ff4949"
     active-text="全站"
     inactive-text="个人"
     @change="parens2($event)">
    </el-switch>
 </el-form-item>

下面的推送人id文本框,v-if=“FalgpushId”用来控制该文本框的显示,等于false时隐藏,true时显示(默认值为初始化时定义的FalgpushId = false,所以隐藏掉了)

<!-- 推送人id -->
 <el-form-item label="推送人ID:" :label-width="formLabelWidth" prop="pushId" v-if="FalgpushId">
   <el-input v-model="entity.pushId" :disabled="disabled" clearable></el-input>
 </el-form-item>

methods中的方法,通过$event写法来监控该控件值的变化

methods:{
 
  //该方法传入推送范围值,根据判断,决定是否展示其下面的推送人ID文本框
     parens2(value){
      let self = this ;
      if(value == false){
       //el-switch控件为 个人推送时,value为false
       self.FalgpushId = true;   //推送人id文本框显示  
       self.entity.pushRange = false; 
      }else if(value == true){
       //el-switch控件为 true 全站推送,value为true
       self.FalgpushId = false;   //推送人id文本框隐藏
       self.entity.pushRange = true;
      }
     },
 }

以上这篇vue.js封装switch开关组件的操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JS实现图片翻书效果示例代码
Sep 09 Javascript
三种方式获取XMLHttpRequest对象
Apr 21 Javascript
JavaScript中的Repaint和Reflow用法详解
Jul 27 Javascript
详解JavaScript 中的 replace 方法
Jan 01 Javascript
Angular ng-class详解及实例代码
Sep 19 Javascript
关于Jquery中的事件绑定总结
Oct 26 Javascript
promise处理多个相互依赖的异步请求(实例讲解)
Aug 03 Javascript
快速解决vue在ios端下点击响应延时的问题
Aug 27 Javascript
JavaScript 点击触发复制功能实例详解
Nov 02 Javascript
vscode配置vue下的es6规范自动格式化详解
Mar 20 Javascript
基于javascript实现移动端轮播图效果
Dec 21 Javascript
Vue通过阿里云oss的url连接直接下载文件并修改文件名的方法
Dec 25 Vue.js
Node.js利用Express实现用户注册登陆功能(推荐)
Oct 26 #Javascript
vue render函数动态加载img的src路径操作
Oct 26 #Javascript
vue实现简单的登录弹出框
Oct 26 #Javascript
让你30分钟快速掌握vue3教程
Oct 26 #Javascript
在vue项目中 实现定义全局变量 全局函数操作
Oct 26 #Javascript
vue3+typescript实现图片懒加载插件
Oct 26 #Javascript
原生js实现简单轮播图
Oct 26 #Javascript
You might like
php jquery 实现新闻标签分类与无刷新分页
2009/12/18 PHP
PHP中PDO基础教程 入门级
2011/09/04 PHP
apache中为php 设置虚拟目录
2014/12/17 PHP
yii2 modal弹窗之ActiveForm ajax表单异步验证
2016/06/13 PHP
javascript针对DOM的应用实例(一)
2012/04/15 Javascript
MyEclipse取消验证Js的两种方法
2013/11/14 Javascript
JavaScript使用二分查找算法在数组中查找数据的方法
2015/04/07 Javascript
使用requestAnimationFrame实现js动画性能好
2015/08/06 Javascript
JS实现表单中checkbox对勾选中增加边框显示效果
2015/08/21 Javascript
javascript中eval和with用法实例总结
2015/11/30 Javascript
javascript运算符语法全面概述
2016/07/14 Javascript
VueJS如何引入css或者less文件的一些坑
2017/04/25 Javascript
Node.js实现连接mysql数据库功能示例
2017/09/15 Javascript
在Swiper内如何制作CSS3动画效果示例代码
2017/12/07 Javascript
每天学点Vue源码之vm.$mount挂载函数
2019/03/11 Javascript
JavaScript中的 new 命令
2019/05/22 Javascript
Vue.js中的extend绑定节点并显示的方法
2019/06/20 Javascript
[53:18]Spirit vs Liquid Supermajor小组赛A组 BO3 第三场 6.2
2018/06/03 DOTA
[01:32:50]DOTA2-DPC中国联赛 正赛 DLG vs XG BO3 第一场 1月25日
2021/03/11 DOTA
详解Python多线程Selenium跨浏览器测试
2017/04/01 Python
python生成tensorflow输入输出的图像格式的方法
2018/02/12 Python
将python代码和注释分离的方法
2018/04/21 Python
python将秒数转化为时间格式的实例
2018/09/16 Python
解决python "No module named pip" 的问题
2018/10/13 Python
python 获取图片分辨率的方法
2019/01/08 Python
Python面向对象思想与应用入门教程【类与对象】
2019/04/12 Python
python 二维矩阵转三维矩阵示例
2019/11/30 Python
python实现按键精灵找色点击功能教程,使用pywin32和Pillow库
2020/06/04 Python
python如何导入依赖包
2020/07/13 Python
HTML5拖放效果的实现代码
2016/11/17 HTML / CSS
简历中自我评价怎么写
2014/02/12 职场文书
企业党员公开承诺书
2014/03/26 职场文书
计算机网络及管理学专业求职信
2014/06/05 职场文书
酒店端午节活动方案
2014/08/26 职场文书
出纳2015年度工作总结范文
2015/10/14 职场文书
python实现自动清理文件夹旧文件
2021/05/10 Python