init
This commit is contained in:
184
fuintUniapp/components/xuan-switch/xuan-switch.vue
Normal file
184
fuintUniapp/components/xuan-switch/xuan-switch.vue
Normal file
@@ -0,0 +1,184 @@
|
||||
<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>
|
||||
Reference in New Issue
Block a user