185 lines
4.5 KiB
Vue
185 lines
4.5 KiB
Vue
<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 #00acac;
|
||
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>
|