<template> <view class="switch-container" :style="[{ background: bj_color}]"> <view class="switch_view"> <view class="switch-item" :class="{'checked_switch':isSwitch}" :style="isSwitch?`color:${checked_color}`:''" @click.prevent.stop="changeSwitch(true)" :animation="animationData2" > {{switchList[0]}} </view> <view class="switch-item" :class="{'checked_switch':!isSwitch}" :style="!isSwitch?`color:${checked_color}`:''" @click.prevent.stop="changeSwitch(false)" :animation="animationData3" > {{switchList[1]}} </view> </view> <view class="disabled" v-if="disabled"></view> <view class="position_view" :animation="animationData1" :style="[{ background: checked_bj_color}]" ></view> </view> </template> <script> export default { props: { switchList: { type: Array, default: ()=>{ return ['开','关']; } }, defaultSwitch:{ type:Boolean, default:true }, isShowModal:{//改变开关时,是否弹框提醒 type:Boolean, default:false }, disabled:{ type:Boolean, default:false }, bj_color:{ type:String, default:'#fff' }, checked_bj_color:{ type:String, default:'#1989fa' }, checked_color:{ type:String, default:'#fff' }, id:{ type:null, default:null } }, data () { return { isSwitch:true, initAnimation:{}, animationData1: {}, animationData2: {}, animationData3: {} }; }, created () { this.initAnimation = uni.createAnimation({ duration: 500, timingFunction: 'ease' }); this.isSwitch = this.defaultSwitch; this.changeAnimation(); }, methods: { changeSwitch(isSwitch) { if(isSwitch == this.isSwitch || this.disabled){ return; } if(this.isShowModal){ let index = isSwitch?0:1; let text = this.switchList[index]; uni.showModal({ title: '提示', content: `您确定要将其调整为${text}吗?`, success: (res) => { if(res.confirm){ this.isSwitch = isSwitch; this.changeAnimation(); this.callParentEvent(isSwitch); } } }); }else{ this.isSwitch = isSwitch; this.changeAnimation(); this.callParentEvent(isSwitch); } }, changeAnimation(){ if(this.isSwitch){ this.animationData1 = this.initAnimation.left(0).width('60%').step().export(); this.animationData2 = this.initAnimation.width('60%').step().export(); this.animationData3 = this.initAnimation.width('40%').step().export(); }else{ this.animationData1 = this.initAnimation.left('40%').width('60%').step().export(); this.animationData2 = this.initAnimation.width('40%').step().export(); this.animationData3 = this.initAnimation.width('60%').step().export(); } }, callParentEvent(){ this.$emit('change',this.isSwitch,this.id,()=>{ // 回调方法应用场景:父级组件请求api接口失败调用 this.isSwitch = !this.isSwitch; this.changeAnimation(); }); } } }; </script> <style lang="scss" scoped> .switch-container { display: flex; flex-direction: row; width: 398upx; height: 76upx; border-radius: 80upx; border: 3upx solid $fuint-theme; font-weight: bold; position: relative; .switch_view{ position: absolute; top: 0; left: 0; width: 100%; height: 100%; z-index: 1; display: flex; border-radius: 100upx; .switch-item { color: #666; font-size: 24upx; height: 100%; width: 40%; border-radius: 100upx; display: flex; justify-content: center; align-items: center; } } .position_view{ position: absolute; top: 0; left: 0; width: 60%; height: 100%; border-radius: 100upx; background: $uni-color-primary; } .disabled{ position: absolute; top: 0; left: 0; width: 100%; height: 100%; z-index: 99; background: #fff; opacity: 0.6; border-radius: 100upx; } } </style>