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和html5实现手机端刮刮卡抽奖效果完美兼容android/IOS
Nov 18 Javascript
JQuery节点元素属性操作方法
Jun 11 Javascript
浅谈JavaScript中的this指针和引用知识
Aug 05 Javascript
Canvas + JavaScript 制作图片粒子效果
Feb 08 Javascript
关于JavaScript语句后面的分号问题
Dec 07 Javascript
js时间戳与日期格式之间相互转换
Dec 11 Javascript
基于datepicker定义自己的angular时间组件的示例
Mar 14 Javascript
js正则表达式校验指定字符串的方法
Jul 23 Javascript
JavaScript中为事件指定处理程序的五种方式分析
Jul 27 Javascript
使用iView Upload 组件实现手动上传图片的示例代码
Oct 01 Javascript
js实现倒计时器自定义时间和暂停
Feb 25 Javascript
Vue移动端用淘宝弹性布局lib-flexible插件做适配的方法
May 26 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
PHP中文分词 自动获取关键词介绍
2012/11/13 PHP
thinkphp路由规则使用示例详解和伪静态功能实现(apache重写)
2014/02/24 PHP
php使用PDO操作MySQL数据库实例
2014/12/30 PHP
Yii2简单实现给表单添加验证码的方法
2016/07/18 PHP
浅谈php常用的7大框架的优缺点
2020/07/20 PHP
完美兼容各大浏览器的jQuery插件实现图片切换特效
2014/12/12 Javascript
深入学习jQuery Validate表单验证
2016/01/18 Javascript
JS DOM实现鼠标滑动图片效果
2020/09/17 Javascript
前端性能优化及技巧
2016/05/06 Javascript
iframe中使用jquery进行查找的方法【案例分析】
2016/06/17 Javascript
javascript汉字拼音互转的简单实例
2016/10/09 Javascript
使用vue.js实现联动效果的示例代码
2017/01/10 Javascript
Vue computed计算属性的使用方法
2017/07/14 Javascript
jQuery简单实现的HTML页面文本框模糊匹配查询功能完整示例
2018/05/09 jQuery
微信小程序使用form表单获取输入框数据的实例代码
2018/05/17 Javascript
详解基于Vue-cli搭建的项目如何和后台交互
2018/06/29 Javascript
vue.js input框之间赋值方法
2018/08/24 Javascript
Vue-component全局注册实例
2018/09/06 Javascript
Jquery和CSS实现选择框重置按钮功能
2018/11/08 jQuery
vue实现公告栏文字上下滚动效果的示例代码
2020/06/16 Javascript
[51:53]完美世界DOTA2联赛循环赛 LBZS vs DM BO2第二场 11.01
2020/11/02 DOTA
Python使用装饰器进行django开发实例代码
2018/02/06 Python
Python脚本修改阿里云的访问控制列表的方法
2019/03/08 Python
Python多进程入门、分布式进程数据共享实例详解
2019/06/03 Python
Python中利用LSTM模型进行时间序列预测分析的实现
2019/07/26 Python
Python 之 Json序列化嵌套类方式
2020/02/27 Python
Spartoo比利时:欧洲时尚购物网站
2017/12/06 全球购物
瑞典灯具和照明网上商店:Lamp24.se
2018/03/17 全球购物
Senreve官网:美国旧金山的奢侈手袋品牌
2019/03/21 全球购物
红旗方阵解说词
2014/02/12 职场文书
计算机专业职业规划
2014/02/28 职场文书
紧急通知
2015/04/17 职场文书
2015年污水处理厂工作总结
2015/05/26 职场文书
2016年教师反腐倡廉心得体会
2016/01/13 职场文书
《开国大典》教学反思
2016/02/16 职场文书
高三英语教学反思
2016/03/03 职场文书