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 相关文章推荐
jQuery基础知识小结
Dec 22 Javascript
jquery仿QQ登录账号选择下拉框效果
Mar 22 Javascript
javascript 数组的定义和数组的长度
Jun 07 Javascript
原生JS实现风箱式demo,并封装了一个运动框架(实例代码)
Jul 22 Javascript
利用JavaScript阻止表单提交的两种方法
Aug 11 Javascript
AngularJS入门教程之AngularJS 模板
Aug 18 Javascript
最常见和最有用的字符串相关的方法详解
Feb 06 Javascript
jQuery实现火车票买票城市选择切换功能
Sep 15 jQuery
JavaScript实现换肤功能
Sep 15 Javascript
基于Vue的移动端图片裁剪组件功能
Nov 28 Javascript
Vue下滚动到页面底部无限加载数据的示例代码
Apr 22 Javascript
javascript之Object.assign()的痛点分析
Mar 03 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中使用PDF文档功能
2006/10/09 PHP
php jquery 多文件上传简单实例
2013/12/23 PHP
自适应高度框架 ----属个人收藏内容
2007/01/22 Javascript
使用EXT实现无刷新动态调用股票信息
2008/11/01 Javascript
查询绑定数据岛的表格中的文本并修改显示方式的js代码
2009/12/15 Javascript
JS拖动技术 关于setCapture使用
2010/12/09 Javascript
jquery中的事件处理详细介绍
2013/06/24 Javascript
实测jquery data()如何存值
2013/08/18 Javascript
jquery操作select大全
2014/04/25 Javascript
Javascript中封装window.open解决不兼容问题
2014/09/28 Javascript
javascript实现倒计时N秒后网页自动跳转代码
2014/12/11 Javascript
JS+CSS实现TreeMenu二级树形菜单完整实例
2015/09/18 Javascript
实例讲解避免javascript冲突的方法
2016/01/03 Javascript
JavaScript基础语法之js表达式
2016/06/07 Javascript
Node.js实现兼容IE789的文件上传进度条
2016/09/02 Javascript
详解Node.js中的事件机制
2016/09/22 Javascript
BootstrapTable请求数据时设置超时(timeout)的方法
2017/01/22 Javascript
Angular2 之 路由与导航详细介绍
2017/05/26 Javascript
微信小程序页面渲染实现方法
2019/11/06 Javascript
[08:08]DOTA2-DPC中国联赛2月28日Recap集锦
2021/03/11 DOTA
itchat和matplotlib的结合使用爬取微信信息的实例
2017/08/25 Python
解决Ubuntu pip 安装 mysql-python包出错的问题
2018/06/11 Python
使用python 3实现发送邮件功能
2018/06/15 Python
Python使用修饰器进行异常日志记录操作示例
2019/03/19 Python
python之pyqt5通过按钮改变Label的背景颜色方法
2019/06/13 Python
Python计算不规则图形面积算法实现解析
2019/11/22 Python
css3背景图片透明叠加属性cross-fade简介及用法实例
2013/01/08 HTML / CSS
New Balance加拿大官方网站:运动鞋和健身服装
2018/11/19 全球购物
优秀班集体获奖感言
2014/02/03 职场文书
幼儿园教师教学反思
2014/02/06 职场文书
文明礼仪演讲稿
2014/05/12 职场文书
英语求职信范文
2014/05/23 职场文书
美术课外活动总结
2014/07/08 职场文书
公司领导班子召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
mysql查询的控制语句图文详解
2021/04/11 MySQL
QT连接MYSQL数据库的详细步骤
2021/07/07 MySQL