Vue switch开关组件

新建一个Switch组件

  1 <template>
  2     <div>
  3         <span class="weui-switch" :class="{'weui-switch-on' : isChecked}" :value="value" @click="toggle" style="position:relative">
  4             <div v-if="isChecked && direction.length > 0" style="width:100%;height:100%;position:absolute;padding:0 5px;line-height:20px;color:#FFF;user-select:none">
  5                 {{direction[0]}}
  6             </div>
  7             <div v-if="!isChecked && direction.length > 0" style="width:100%;height:100%;position:absolute;padding:0 5px;right:2px;line-height:22px;color:#7A7A7A;text-align:right;user-select:none">
  8                 {{direction[1]}}
  9             </div>
 10         </span>
 11     </div>
 12 </template>
 13 <script>
 14     export default {
 15         name: 'switchComponent',
 16         props: {
 17           value: {
 18             type: Boolean,
 19             default: true
 20           },
 21           text: {
 22               type: String,
 23               default: ''
 24           }
 25         },
 26         data () {
 27             return {
 28                 isChecked: this.value
 29             }
 30         },
 31         computed: {
 32             direction () {
 33                 if (this.text) {
 34                     return this.text.split('|')
 35                 } else {
 36                     return []
 37                 }
 38             }
 39         },
 40         watch: {
 41           value (val) {
 42             this.isChecked = val
 43           },
 44           isChecked(val) {
 45             this.$emit('change', val);
 46           }
 47         },
 48         methods: {
 49           toggle() {
 50             this.isChecked = !this.isChecked;
 51           }
 52         }
 53     }    
 54 </script>
 55 <style>
 56     .weui-switch {
 57         display: block;
 58         position: relative;
 59         width: 52px;
 60         height: 24px;
 61         border: 1px solid #DFDFDF;
 62         outline: 0;
 63         border-radius: 16px;
 64         box-sizing: border-box;
 65         background-color: #DFDFDF;
 66         transition: background-color 0.1s, border 0.1s;
 67         cursor: pointer;
 68       }
 69       .weui-switch:before {
 70         content: " ";
 71         position: absolute;
 72         top: 0;
 73         left: 0;
 74         width: 50px;
 75         height: 22px;
 76         border-radius: 15px;
 77         background-color: #FDFDFD;
 78         transition: transform 0.35s cubic-bezier(0.45, 1, 0.4, 1);
 79       }
 80       .weui-switch:after {
 81         content: " ";
 82         position: absolute;
 83         top: 0;
 84         left: 0;
 85         width: 22px;
 86         height: 22px;
 87         border-radius: 15px;
 88         background-color: #FFFFFF;
 89         box-shadow: 0 1px 3px rgba(0, 0, 0, 0.4);
 90         transition: transform 0.35s cubic-bezier(0.4, 0.4, 0.25, 1.35);
 91       }
 92       .weui-switch-on {
 93         border-color: #6F6F6F;
 94         background-color: #1AAD19;
 95       }
 96       .weui-switch-on:before {
 97         border-color: #1AAD19;
 98         background-color: #409eff;
 99       }
100       .weui-switch-on:after {
101         transform: translateX(28px);
102       }
103 </style>

在父组件中引入

<template>
  <div>
    <switch v-model="value" text="on|off"></switch>
  </div>
  
</template>

<script>
import switch from './components/Switch'
export default {
  name: "App",
  components: {
    switch
  },
  data() {
    return {
        value:''
  },
  methods:{

  }
};
</script>

<style lang="less">

</style>

效果如下

posted @ 2020-05-30 17:49  无你旅行  阅读(9633)  评论(0编辑  收藏  举报