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 相关文章推荐
escape、encodeURI 和 encodeURIComponent 的区别
Mar 02 Javascript
javascript 系统文件夹文件操作及参数介绍
Jan 08 Javascript
js实现杯子倒水问题自动求解程序
Mar 25 Javascript
javascripit实现密码强度检测代码分享
Dec 12 Javascript
JQuery复制DOM节点的方法
Jun 11 Javascript
JavaScript合并两个数组并去除重复项的方法
Jun 13 Javascript
jQuery.trim() 函数及trim()用法详解
Oct 26 Javascript
jQuery html表格排序插件tablesorter使用方法详解
Feb 10 Javascript
js以及jquery实现手风琴效果
Apr 17 Javascript
Vuex和前端缓存的整合策略详解
May 09 Javascript
jQuery实现获取动态添加的标签对象示例
Jun 28 jQuery
解决vue项目使用font-awesome,build后路径的问题
Sep 01 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服务器实现多session并发运行
2006/10/09 PHP
有关 PHP 和 MySQL 时区的一点总结
2008/03/26 PHP
中英文字符串翻转函数
2008/12/09 PHP
PHP中使用cURL实现Get和Post请求的方法
2013/03/13 PHP
PHP的变量类型和作用域详解
2014/03/12 PHP
PHP中的数组处理函数实例总结
2016/01/09 PHP
php 中htmlentities导致中文无法查询问题
2018/09/10 PHP
Alliance vs Liquid BO3 第二场2.13
2021/03/10 DOTA
一个JS小玩意 几个属性相加不能超过一个特定值.
2009/09/29 Javascript
高亮显示web页表格行的javascript代码
2010/11/19 Javascript
jquery iframe操作详细解析
2013/11/20 Javascript
Extjs 4.x 得到form CheckBox 复选框的值
2014/05/04 Javascript
jQuery操作cookie方法实例教程
2014/11/25 Javascript
jQuery实现下拉框选择图片功能实例
2015/08/08 Javascript
详解NodeJs支付宝移动支付签名及验签
2017/01/06 NodeJs
详解EasyUi控件中的Datagrid
2017/08/23 Javascript
NodeJs通过async/await处理异步的方法
2017/10/09 NodeJs
JavaScript剩余操作符Rest Operator详解
2019/07/20 Javascript
[02:27]《DAC最前线》之附加赛征程
2015/01/29 DOTA
获取Django项目的全部url方法详解
2017/10/26 Python
Python通过matplotlib绘制动画简单实例
2017/12/13 Python
基于Python开发chrome插件的方法分析
2018/07/07 Python
softmax及python实现过程解析
2019/09/30 Python
使用Python第三方库pygame写个贪吃蛇小游戏
2020/03/06 Python
Tensorflow tensor 数学运算和逻辑运算方式
2020/06/30 Python
如何基于Python和Flask编写Prometheus监控
2020/11/25 Python
python 实现的车牌识别项目
2021/01/25 Python
CSS3属性 line-clamp控制文本行数的使用
2020/03/19 HTML / CSS
初中生自我评价
2014/02/01 职场文书
2014年公司迎新年活动方案
2014/02/24 职场文书
函授毕业生自我鉴定范文
2014/03/25 职场文书
征兵宣传标语
2014/06/20 职场文书
社会主义核心价值观主题教育活动总结
2015/05/07 职场文书
社会实践单位意见
2015/06/05 职场文书
基于Redis位图实现用户签到功能
2021/05/08 Redis
nginx反向代理配置去除前缀案例教程
2021/07/26 Servers