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 相关文章推荐
在Mac OS下使用Node.js的简单教程
Jun 24 Javascript
Angularjs中UI Router全攻略
Jan 29 Javascript
JS获取时间的相关函数及时间戳与时间日期之间的转换
Feb 04 Javascript
AngularJS在IE下取数据总是缓存问题的解决方法
Aug 05 Javascript
微信小程序 富文本转文本实例详解
Oct 24 Javascript
js以分隔符分隔数组中的元素并转换为字符串的方法
Nov 16 Javascript
js利用for in循环获取 一个对象的所有属性以及值的实例
Mar 30 Javascript
vue2.0路由切换后页面滚动位置不变BUG的解决方法
Mar 14 Javascript
浅谈ng-zorro使用心得
Dec 03 Javascript
javascript中的数据类型检测方法详解
Aug 07 Javascript
详解Nuxt.js中使用Element-UI填坑
Sep 06 Javascript
layui自定义工具栏的方法
Sep 19 Javascript
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
全国FM电台频率大全 - 10 江苏省
2020/03/11 无线电
几个php应用技巧
2008/03/27 PHP
php error_log 函数的使用
2009/04/13 PHP
php curl 获取https请求的2种方法
2015/04/27 PHP
PHP实现随机发扑克牌
2020/04/22 PHP
解密效果
2006/06/23 Javascript
javascript克隆对象深度介绍
2012/11/20 Javascript
js+css实现增加表单可用性之提示文字
2013/06/03 Javascript
将list转换为json失败的原因
2013/12/17 Javascript
js 去除字符串第一位逗号的方法
2014/06/07 Javascript
轻松学习jQuery插件EasyUI EasyUI实现树形网络基本操作(2)
2015/11/30 Javascript
JS中动态创建元素的三种方法总结(推荐)
2016/10/20 Javascript
JavaScript实现点击按钮复制指定区域文本(推荐)
2016/11/25 Javascript
微信小程序中setInterval的使用方法
2017/09/29 Javascript
微信小程序之裁剪图片成圆形的实现代码
2018/10/11 Javascript
[05:26]2014DOTA2西雅图国际邀请赛 iG战队巡礼
2014/07/07 DOTA
Python正则表达式匹配HTML页面编码
2015/04/08 Python
关于Python中Inf与Nan的判断问题详解
2017/02/08 Python
selenium python浏览器多窗口处理代码示例
2018/01/15 Python
python正则爬取某段子网站前20页段子(request库)过程解析
2019/08/10 Python
Pycharm连接远程服务器过程图解
2020/04/30 Python
重写django的model下的objects模型管理器方式
2020/05/15 Python
Python解析m3u8拼接下载mp4视频文件的示例代码
2021/03/03 Python
浅谈Html5移动端ios/Android兼容性总结
2018/06/01 HTML / CSS
THE OUTNET美国官网:国际设计师品牌折扣网站
2017/03/07 全球购物
劳资员岗位职责
2013/11/11 职场文书
财务副总经理工作职责
2013/11/25 职场文书
先进集体事迹材料范文
2014/12/25 职场文书
副总经理岗位职责范本
2015/04/08 职场文书
社区法制宣传日活动总结
2015/05/05 职场文书
新郎父母婚礼答谢词
2015/09/29 职场文书
2015年美容师个人工作总结
2015/10/14 职场文书
普希金诗歌赏析(6首)
2019/08/22 职场文书
基于Redis实现分布式锁的方法(lua脚本版)
2021/05/12 Redis
Python 的 sum() Pythonic 的求和方法详细
2021/10/16 Python
实操Python爬取觅知网素材图片示例
2021/11/27 Python