登录授权订单测试

main
xuechunyuan 2 years ago
commit c030abbe9a
  1. 6
      manifest.json
  2. 13
      package-lock.json
  3. 25
      package.json
  4. 20
      pages.json
  5. 306
      pages/pages_zhentou/myPage/address.vue
  6. 9
      pages/pages_zhentou/order/checkOrder.vue
  7. 260
      pages/pages_zhentou/order/express.vue
  8. 6
      pages/pages_zhentou/order/order.vue
  9. BIN
      static/image/cancel.png
  10. BIN
      static/image/position.png
  11. 20
      uni_modules/uni-transition/changelog.md
  12. 128
      uni_modules/uni-transition/components/uni-transition/createAnimation.js
  13. 277
      uni_modules/uni-transition/components/uni-transition/uni-transition.vue
  14. 87
      uni_modules/uni-transition/package.json
  15. 11
      uni_modules/uni-transition/readme.md

@ -88,6 +88,11 @@
"appid" : "wx432c2efe6df3b97a",
"UniversalLinks" : ""
}
},
"geolocation" : {
"system" : {
"__platform__" : [ "ios", "android" ]
}
}
},
"orientation" : [ "portrait-primary" ]
@ -127,6 +132,7 @@
"desc" : "演示定位能力"
}
},
"requiredPrivateInfos" : [ "getLocation" ],
"uniStatistics" : {
"enable" : true
}

13
package-lock.json generated

@ -0,0 +1,13 @@
{
"name": "hello-uniapp",
"version": "3.4.4",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"uview-ui": {
"version": "2.0.36",
"resolved": "https://registry.npmmirror.com/uview-ui/-/uview-ui-2.0.36.tgz",
"integrity": "sha512-ASSZT6M8w3GTO1eFPbsgEFV0U5UujK+8pTNr+MSUbRNcRMC1u63DDTLJVeArV91kWM0bfAexK3SK9pnTqF9TtA=="
}
}
}

@ -9,18 +9,20 @@
},
"repository": "https://github.com/dcloudio/hello-uniapp.git",
"keywords": [
"hello-uniapp",
"uni-app",
"uni-ui",
"示例工程"
],
"hello-uniapp",
"uni-app",
"uni-ui",
"示例工程"
],
"author": "",
"license": "MIT",
"bugs": {
"url": "https://github.com/dcloudio/hello-uniapp/issues"
},
"homepage": "https://github.com/dcloudio/hello-uniapp#readme",
"dependencies": {},
"dependencies": {
"uview-ui": "^2.0.36"
},
"dcloudext": {
"category": [
"前端页面模板",
@ -84,15 +86,14 @@
"快应用": {
"华为": "y",
"联盟": "y"
},
"Vue": {
"vue2": "y",
"vue3": "y"
}
},
"Vue": {
"vue2": "y",
"vue3": "y"
}
}
}
},
"uni-app": {
"scripts": {
"mp-dingtalk": {

@ -127,6 +127,22 @@
}
}
},
{
"path": "pages/pages_zhentou/order/express",
"style": {
"navigationBarTitleText": "物流信息",
"app-plus": {
"titleNView": {
// "buttons": [{
// "text": "\ue534",
// "fontSrc": "/static/uni.ttf",
// "fontSize": "22px",
// "color": "#FFFFFF"
// }]
}
}
}
},
{
"path": "pages/pages_zhentou/contact/contact",
"style": {
@ -143,7 +159,7 @@
}
}
}
],
],
// "subPackages": [{
// "root": "pages/API",
// "pages": [{
@ -257,4 +273,4 @@
// }
// ]
// }
}
}

@ -29,7 +29,74 @@
</view>
</view>
<view class="btn_box">
<p class="btn">添加新地址</p>
<p class="btn" @click="handleAdd">添加新地址</p>
</view>
<view class="pop_box">
<uni-popup ref="popup" style="width: 100%;" background-color="#fff" >
<view class="popup-content" >
<view class="title_box">
<view class="tit_txt">
新增地址
</view>
<view class="image_box">
<image class="img" src="../../../static/image/cancel.png" mode=""></image>
</view>
</view>
<view class="content_box">
<view class="content_item">
<view class="left_item">
收货人
</view>
<view class="right_item">
张三
</view>
</view>
<view class="content_item">
<view class="left_item">
联系电话
</view>
<view class="right_item">
15612345678
</view>
</view>
<view class="content_item">
<view class="left_item">
位置
</view>
<!-- <view class="right_item">
山东省青岛市市北区
</view> -->
<!-- <view class="right_icon" @click="changeAddress">
<image src="../../../static/image/icon-arrow-right.png"></image>
</view> -->
<picker class="picker_box" :range="locationArr" @change="cityChange" mode="multiSelector"
@columnchange="columnchange" :value="multiIndex">
<view class="city_box" v-if="province !== '' && city !== ''">
{{province}} / {{city}} {{district ? '/' : ''}} {{district}}
</view>
<view class="city_box" v-if="province == '' && city == '' && district == ''">
<span style="color: #999;">请选择地区</span>
</view>
</picker>
</view>
<view class="content_item">
<view class="left_item">
详细地址
</view>
<view class="right_item">
大港街道大港三路8号铁路住宅小区6号楼大港街道大港三路8号铁路住宅小区6号楼
</view>
<view class="right_icon" @click="handlePosition">
<image src="../../../static/image/position.png"></image>
</view>
</view>
</view>
<view class="button_box">
<p class="btn">删除</p>
<p class="btn">保存</p>
</view>
</view>
</uni-popup>
</view>
<!-- <uni-load-more iconType="circle" :status="status" @clickLoadMore="loadMore"
:content-text="contentText"></uni-load-more> -->
@ -37,14 +104,25 @@
</template>
<script>
import allCityData from "../../../util/all_city.json"
export default {
data() {
return {
imgPrefix: getApp().globalData.imgPrefix,
locationArr: [
[],
[],
[]
],
multiIndex: [0, 0, 0],
province:'',
city:'',
district:'',
addressData: [
{name:'张三',phone:'15612345678',address:'山东省青岛市市北区大港街道大港三路8号铁路住宅小区6号楼6单元666室',status:1},
{name:'张三',phone:'15612345678',address:'山东省青岛市市北区大港街道大港三路8号铁路住宅小区6号楼6单元666室',status:0},
],
allCityData,
current: 0,
size: 10,
hasMore: true,
@ -57,6 +135,7 @@
}
},
onLoad() {
this.getData()
let userInfo = uni.getStorageSync('userInfo');
if (userInfo) {
this.userInfo = JSON.parse(userInfo);
@ -66,6 +145,120 @@
}
},
methods: {
//
getData() {
console.log(this.allCityData)
this.allCityData.map(item => {
this.locationArr[0].push(item.province);
})
this.allCityData[0].citys[0].areas.map(item => {
this.locationArr[1].push(item.area)
})
console.log(this.locationArr)
},
cityChange(e) {
console.log(e)
this.multiIndex = e.detail.value;
console.log(this.locationArr)
this.province = this.locationArr[0][this.multiIndex[0]]
this.city = this.locationArr[1][this.multiIndex[1]]
this.district = this.locationArr[2][this.multiIndex[2]]
},
columnchange(e) {
let value = e.detail.value;
console.log(e.detail)
if (e.detail.column == 0) {
this.locationArr[1] = [];
this.locationArr[2] = []
let tmp = this.allCityData.find(item => item.province == this.locationArr[0][value])
console.log(tmp)
if (tmp.citys.length == 1) {
tmp.citys[0].areas.map(item => {
this.locationArr[1].push(item.area)
})
} else {
tmp.citys.map(item => {
this.locationArr[1].push(item.city)
})
tmp.citys[0].areas.map(item => {
this.locationArr[2].push(item.area);
})
}
//
this.multiIndex = [value, 0, 0]
}
if (e.detail.column == 1) {
this.locationArr[2] = [];
this.multiIndex[1] = value;
if (this.allCityData[this.multiIndex[0]].citys.length !== 1) {
this.allCityData[this.multiIndex[0]].citys[value].areas.map(item => {
this.locationArr[2].push(item.area)
})
}
this.multiIndex.splice(2, 1, 0)
console.log(this.multiIndex)
}
//
if (e.detail.column === 2) {
this.multiIndex[2] = e.detail.value
}
},
//
handleAdd(){
this.$refs.popup.open('bottom')
},
//
handlePosition(){
uni.getLocation({
type:" wgs84",
isHighAccuracy:true,
success: (res) => {
console.log('当前位置的经度:' + res.longitude);
console.log('当前位置的纬度:' + res.latitude);
uni.request({
url:`https://restapi.amap.com/v3/geocode/regeo?location=${res.longitude},${res.latitude}&key=b8e2796701c731e4a97f4d0bc4e51385&radius=1000&extensions=all`,
method:"get",
success: res => {
console.log(res.data)
this.province = res.data.regeocode.addressComponent.province;
this.city = res.data.regeocode.addressComponent.city;
this.district = res.data.regeocode.addressComponent.district;
console.log(this.province)
this.allCityData.map(item1 =>{
if(item1.province == this.province){
item1.citys.map(item2 =>{
this.locationArr[1].push(item2.city)
if(item2.city == this.city){
item2.areas.map(item3 =>{
this.locationArr[2].push(item3.area)
})
}
})
}
})
console.log(this.locationArr)
this.locationArr[0].map((item,index) =>{
if(item == this.province){
this.multiIndex[0] = index
}
});
this.locationArr[1].map((item,index) =>{
if(item == this.city){
this.multiIndex[1] = index
}
});
this.locationArr[2].map((item,index) =>{
if(item == this.district){
this.multiIndex[2] = index
}
})
}
})
}
})
},
//
loadMore() {
console.log('loadmore')
@ -239,5 +432,116 @@
margin-top: 30rpx;
}
}
.pop_box{
width: 100%;
/deep/ .uni-popup{
width: 100%;
}
.popup-content{
width: 100%;
background: #fff;
padding-top: 40rpx;
border-radius: 30rpx 30rpx 0rpx 0rpx;
.title_box{
width:100%;
height: 50rpx;
display: flex;
align-items: center;
// justify-content: space-between;
.tit_txt{
width: 90%;
text-align: center;
font-weight: bold;
font-size: 36rpx;
color: #000;
}
.image_box{
width: 44rpx;
height: 44rpx;
.img{
width: 100%;
height: 100%;
}
}
}
.content_box{
width: 100%;
margin-top: 20rpx;
.content_item{
width: 100%;
padding: 30rpx 0;
display: flex;
align-items: center;
border: 1rpx solid #F2F2F2;
.left_item{
width:140rpx;
height: 100%;
display: flex;
align-items: center;
margin-left: 30rpx;
font-size: 26rpx;
color: #333;
}
.right_item{
width: 406rpx;
height: 100%;
display: flex;
align-items: center;
margin-left: 30rpx;
font-size: 26rpx;
color: #333;
}
.right_icon{
width: 44rpx;
height: 44rpx;
margin-left: 66rpx;
image{
width: 100%;
height: 100%;
}
}
}
}
.button_box{
width: 100%;
height: 120rpx;
display: flex;
margin-top: 20px;
align-items: center;
justify-content: center;
.btn{
width: 320rpx;
height: 78rpx;
background: #FFFFFF;
border-radius: 20rpx 20rpx 20rpx 20rpx;
border: 1rpx solid #D73232;
display: flex;
align-items: center;
justify-content: center;
font-size: 26rpx;
color: #D73232;
&:last-child{
background: #D73232;
margin-left: 50rpx;
color: #FFFFFF;
}
}
}
}
}
}
</style>

@ -71,7 +71,7 @@
</view>
</view>
<view class="btn_box">
<p class="btn" v-if="orderData.status == 3 || orderData.status == 4 || orderData.status == 5">查看物流</p>
<p class="btn" @click="handleWuliu" v-if="orderData.status == 3 || orderData.status == 4 || orderData.status == 5">查看物流</p>
<p class="btn confirm" v-if="orderData.status == 4">确认收货</p>
<p class="btn" v-if="orderData.status == 2">取消订单</p>
<p class="btn confirm" v-if="orderData.status == 2">立即支付</p>
@ -95,7 +95,12 @@
console.log(item)
},
methods: {
//
handleWuliu(){
uni.navigateTo({
url:"/pages/pages_zhentou/order/express"
})
},
}
}
</script>

@ -0,0 +1,260 @@
<template>
<view class="process_more">
<view class="com_box">
<view class="com_txt">
顺丰快递
</view>
<view class="com_num">
SH189165496411
</view>
</view>
<!-- 步骤条 -->
<view class="pro_box">
<view class="set-2" :key="index" v-for="(item,index) in options">
<view class="img-border">
<view class="left_img"></view>
</view>
<view v-if='index!=0' class="left_line_up"></view>
<view v-if='index!=options.length-1' class="left_line_down"></view>
<view class="set-view">
<view :class="index == 0 ? 'active' : ''" class="set-view-test3">{{item.status}}</view>
<view :class="index == 0 ? 'active' : ''" class="set-view-test4">{{item.context}}</view>
<view class="set-view-test">
<view class="set-view-test2">{{item.time}}</view>
</view>
</view>
</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
options: [{
status: '投柜或驿站',
context: '【青岛市】 快件已被 菜鸟的【青岛康泰源惠客友超市店】代收,【取件地址:青岛康泰源惠客友超市店】,请及时取件。如有疑问请联系:15805321109,投诉电话:0532-88985563',
time: '2023-08-18 10:33:33'
},
{
status: '派件',
context: '【青岛市】青岛市中五二部(0532-88985563)业务员【杨金梅,19106394524】正在为您派件(95720为中通快递员外呼专属号码,请放心接听,如有问题可联系投诉电话:0532-88985563)',
time: '2023-08-18 08:08:38'
},
{
status: '在途',
context: '【青岛市】 快件已到达 青岛市中五二部',
time: '2023-08-18 08:08:33'
},
{
status: '在途',
context: '【青岛市】 快件已发往 青岛市中五二部',
time: '2023-08-18 04:36:56'
},
{
status: '在途',
context: '【青岛市】 快件已到达 青岛中转部',
time: '2023-08-18 01:04:40'
},
{
status: '在途',
context: '【昆明市】 快件已发往 青岛中转部',
time: '2023-08-16 00:51:30'
},
{
status: '在途',
context: '【昆明市】 快件已到达 昆明中转',
time: '2023-08-15 15:30:16'
}, {
status: '在途',
context: '【丽江市】 快件已发往 昆明中转',
time: '2023-08-14 19:02:02'
}, {
status: '揽收',
context: '【丽江市】 【丽江华坪县】(0888-8834031) 的 P1陈平(15108866686) 已揽收',
time: '2023-08-14 19:01:18'
}
]
}
},
methods: {
}
}
</script>
<style lang="scss">
.process_more {
height: 100%;
overflow-y: hidden;
.com_box {
width: 690rpx;
height: 90rpx;
margin: 0 auto;
margin-top: 30rpx;
background: #FFFFFF;
border-radius: 30rpx 30rpx 30rpx 30rpx;
display: flex;
align-items: center;
.com_txt {
margin-left: 38rpx;
margin-right: 20rpx;
font-size: 26rpx;
color: #333;
}
.com_num {
font-size: 26rpx;
color: #333;
}
}
.pro_box {
width: 690rpx;
height: 75%;
overflow-y: auto;
overflow-x: hidden;
background: #FFFFFF;
border-radius: 30rpx 30rpx 30rpx 30rpx;
margin: 0 auto;
margin-top: 30rpx;
padding: 30rpx 0;
.process_text {
position: relative;
.process_left {
position: absolute;
top: 200rpx;
left: 40rpx;
image {
width: 44rpx;
height: 44rpx;
}
}
}
.set-2:last-child::after {
display: none;
}
.set-2 {
border-radius: 10rpx;
width: 600rpx;
margin-left: 100rpx;
margin-top: 60rpx;
position: relative;
.set-view {
width: 493rpx;
.set-view-test {
margin: 0 auto;
// padding-top: 20rpx;
padding-bottom: 20rpx;
.set-view-test2 {
width: 100%;
height: 26rpx;
font-family: Gibson;
font-size: 20rpx;
color: #999;
}
}
.set-view-test3 {
margin: 0 auto;
font-size: 26rpx;
color: #666;
&.active {
color: #333;
}
}
.set-view-test4 {
margin: 20rpx auto;
font-size: 22rpx;
color: #999;
&.active {
color: #333;
}
}
}
}
/* 普通 */
.set-2 .img-border {
width: 18rpx;
height: 17rpx;
background: gray;
border-radius: 50%;
position: absolute;
top: 6%;
margin-top: -1rpx;
left: -58rpx;
z-index: 100;
}
/* 特殊 */
.set-2:nth-of-type(1)>.img-border {
width: 38rpx;
height: 38rpx;
background: #FFCCD8;
border-radius: 50%;
position: absolute;
top: 0%;
margin-top: -3rpx;
left: -68rpx;
z-index: 100;
}
.set-2:nth-of-type(1) .left_img {
border-radius: 50%;
width: 16rpx;
height: 16rpx;
background: #FE3666;
top: 50%;
margin-top: 13rpx;
margin-left: 10rpx;
}
.left_line_up {
position: absolute;
top: 0;
left: -52upx;
height: 70%;
margin-top: -22rpx;
border-style: solid;
border-left: 1rpx;
border-color: #ccc;
}
.left_line_down {
position: absolute;
top: 50%;
left: -52upx;
height: 60%;
margin-top: 22rpx;
border-style: solid;
border-left: 1rpx;
border-color: #ccc;
}
.set-2:nth-of-type(1) .left_line_down {
top: 0;
height: 105%;
}
.set-2:last-of-type .left_line_up {
height: 10%;
}
}
}
</style>

@ -85,6 +85,12 @@
this.loadMore();
},
methods: {
//
handleWuliu() {
uni.navigateTo({
url: "/pages/pages_zhentou/order/express"
})
},
loadMore() {
if (this.hasMore) {
this.current = this.current + 1;

Binary file not shown.

After

Width:  |  Height:  |  Size: 569 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

@ -0,0 +1,20 @@
## 1.3.1(2021-11-23)
- 修复 init 方法初始化问题
## 1.3.0(2021-11-19)
- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource)
- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-transition](https://uniapp.dcloud.io/component/uniui/uni-transition)
## 1.2.1(2021-09-27)
- 修复 init 方法不生效的 Bug
## 1.2.0(2021-07-30)
- 组件兼容 vue3,如何创建 vue3 项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834)
## 1.1.1(2021-05-12)
- 新增 示例地址
- 修复 示例项目缺少组件的 Bug
## 1.1.0(2021-04-22)
- 新增 通过方法自定义动画
- 新增 custom-class 非 NVUE 平台支持自定义 class 定制样式
- 优化 动画触发逻辑,使动画更流畅
- 优化 支持单独的动画类型
- 优化 文档示例
## 1.0.2(2021-02-05)
- 调整为 uni_modules 目录规范

@ -0,0 +1,128 @@
// const defaultOption = {
// duration: 300,
// timingFunction: 'linear',
// delay: 0,
// transformOrigin: '50% 50% 0'
// }
// #ifdef APP-NVUE
const nvueAnimation = uni.requireNativePlugin('animation')
// #endif
class MPAnimation {
constructor(options, _this) {
this.options = options
this.animation = uni.createAnimation(options)
this.currentStepAnimates = {}
this.next = 0
this.$ = _this
}
_nvuePushAnimates(type, args) {
let aniObj = this.currentStepAnimates[this.next]
let styles = {}
if (!aniObj) {
styles = {
styles: {},
config: {}
}
} else {
styles = aniObj
}
if (animateTypes1.includes(type)) {
if (!styles.styles.transform) {
styles.styles.transform = ''
}
let unit = ''
if(type === 'rotate'){
unit = 'deg'
}
styles.styles.transform += `${type}(${args+unit}) `
} else {
styles.styles[type] = `${args}`
}
this.currentStepAnimates[this.next] = styles
}
_animateRun(styles = {}, config = {}) {
let ref = this.$.$refs['ani'].ref
if (!ref) return
return new Promise((resolve, reject) => {
nvueAnimation.transition(ref, {
styles,
...config
}, res => {
resolve()
})
})
}
_nvueNextAnimate(animates, step = 0, fn) {
let obj = animates[step]
if (obj) {
let {
styles,
config
} = obj
this._animateRun(styles, config).then(() => {
step += 1
this._nvueNextAnimate(animates, step, fn)
})
} else {
this.currentStepAnimates = {}
typeof fn === 'function' && fn()
this.isEnd = true
}
}
step(config = {}) {
// #ifndef APP-NVUE
this.animation.step(config)
// #endif
// #ifdef APP-NVUE
this.currentStepAnimates[this.next].config = Object.assign({}, this.options, config)
this.currentStepAnimates[this.next].styles.transformOrigin = this.currentStepAnimates[this.next].config.transformOrigin
this.next++
// #endif
return this
}
run(fn) {
// #ifndef APP-NVUE
this.$.animationData = this.animation.export()
this.$.timer = setTimeout(() => {
typeof fn === 'function' && fn()
}, this.$.durationTime)
// #endif
// #ifdef APP-NVUE
this.isEnd = false
let ref = this.$.$refs['ani'] && this.$.$refs['ani'].ref
if(!ref) return
this._nvueNextAnimate(this.currentStepAnimates, 0, fn)
this.next = 0
// #endif
}
}
const animateTypes1 = ['matrix', 'matrix3d', 'rotate', 'rotate3d', 'rotateX', 'rotateY', 'rotateZ', 'scale', 'scale3d',
'scaleX', 'scaleY', 'scaleZ', 'skew', 'skewX', 'skewY', 'translate', 'translate3d', 'translateX', 'translateY',
'translateZ'
]
const animateTypes2 = ['opacity', 'backgroundColor']
const animateTypes3 = ['width', 'height', 'left', 'right', 'top', 'bottom']
animateTypes1.concat(animateTypes2, animateTypes3).forEach(type => {
MPAnimation.prototype[type] = function(...args) {
// #ifndef APP-NVUE
this.animation[type](...args)
// #endif
// #ifdef APP-NVUE
this._nvuePushAnimates(type, args)
// #endif
return this
}
})
export function createAnimation(option, _this) {
if(!_this) return
clearTimeout(_this.timer)
return new MPAnimation(option, _this)
}

@ -0,0 +1,277 @@
<template>
<view v-if="isShow" ref="ani" :animation="animationData" :class="customClass" :style="transformStyles" @click="onClick"><slot></slot></view>
</template>
<script>
import { createAnimation } from './createAnimation'
/**
* Transition 过渡动画
* @description 简单过渡动画组件
* @tutorial https://ext.dcloud.net.cn/plugin?id=985
* @property {Boolean} show = [false|true] 控制组件显示或隐藏
* @property {Array|String} modeClass = [fade|slide-top|slide-right|slide-bottom|slide-left|zoom-in|zoom-out] 过渡动画类型
* @value fade 渐隐渐出过渡
* @value slide-top 由上至下过渡
* @value slide-right 由右至左过渡
* @value slide-bottom 由下至上过渡
* @value slide-left 由左至右过渡
* @value zoom-in 由小到大过渡
* @value zoom-out 由大到小过渡
* @property {Number} duration 过渡动画持续时间
* @property {Object} styles 组件样式 css 样式注意带-连接符的属性需要使用小驼峰写法如`backgroundColor:red`
*/
export default {
name: 'uniTransition',
emits:['click','change'],
props: {
show: {
type: Boolean,
default: false
},
modeClass: {
type: [Array, String],
default() {
return 'fade'
}
},
duration: {
type: Number,
default: 300
},
styles: {
type: Object,
default() {
return {}
}
},
customClass:{
type: String,
default: ''
}
},
data() {
return {
isShow: false,
transform: '',
opacity: 1,
animationData: {},
durationTime: 300,
config: {}
}
},
watch: {
show: {
handler(newVal) {
if (newVal) {
this.open()
} else {
// close,
if (this.isShow) {
this.close()
}
}
},
immediate: true
}
},
computed: {
//
stylesObject() {
let styles = {
...this.styles,
'transition-duration': this.duration / 1000 + 's'
}
let transform = ''
for (let i in styles) {
let line = this.toLine(i)
transform += line + ':' + styles[i] + ';'
}
return transform
},
//
transformStyles() {
return 'transform:' + this.transform + ';' + 'opacity:' + this.opacity + ';' + this.stylesObject
}
},
created() {
//
this.config = {
duration: this.duration,
timingFunction: 'ease',
transformOrigin: '50% 50%',
delay: 0
}
this.durationTime = this.duration
},
methods: {
/**
* ref 触发 初始化动画
*/
init(obj = {}) {
if (obj.duration) {
this.durationTime = obj.duration
}
this.animation = createAnimation(Object.assign(this.config, obj),this)
},
/**
* 点击组件触发回调
*/
onClick() {
this.$emit('click', {
detail: this.isShow
})
},
/**
* ref 触发 动画分组
* @param {Object} obj
*/
step(obj, config = {}) {
if (!this.animation) return
for (let i in obj) {
try {
if(typeof obj[i] === 'object'){
this.animation[i](...obj[i])
}else{
this.animation[i](obj[i])
}
} catch (e) {
console.error(`方法 ${i} 不存在`)
}
}
this.animation.step(config)
return this
},
/**
* ref 触发 执行动画
*/
run(fn) {
if (!this.animation) return
this.animation.run(fn)
},
//
open() {
clearTimeout(this.timer)
this.transform = ''
this.isShow = true
let { opacity, transform } = this.styleInit(false)
if (typeof opacity !== 'undefined') {
this.opacity = opacity
}
this.transform = transform
// nextTick wx
this.$nextTick(() => {
// TODO
this.timer = setTimeout(() => {
this.animation = createAnimation(this.config, this)
this.tranfromInit(false).step()
this.animation.run()
this.$emit('change', {
detail: this.isShow
})
}, 20)
})
},
//
close(type) {
if (!this.animation) return
this.tranfromInit(true)
.step()
.run(() => {
this.isShow = false
this.animationData = null
this.animation = null
let { opacity, transform } = this.styleInit(false)
this.opacity = opacity || 1
this.transform = transform
this.$emit('change', {
detail: this.isShow
})
})
},
//
styleInit(type) {
let styles = {
transform: ''
}
let buildStyle = (type, mode) => {
if (mode === 'fade') {
styles.opacity = this.animationType(type)[mode]
} else {
styles.transform += this.animationType(type)[mode] + ' '
}
}
if (typeof this.modeClass === 'string') {
buildStyle(type, this.modeClass)
} else {
this.modeClass.forEach(mode => {
buildStyle(type, mode)
})
}
return styles
},
//
tranfromInit(type) {
let buildTranfrom = (type, mode) => {
let aniNum = null
if (mode === 'fade') {
aniNum = type ? 0 : 1
} else {
aniNum = type ? '-100%' : '0'
if (mode === 'zoom-in') {
aniNum = type ? 0.8 : 1
}
if (mode === 'zoom-out') {
aniNum = type ? 1.2 : 1
}
if (mode === 'slide-right') {
aniNum = type ? '100%' : '0'
}
if (mode === 'slide-bottom') {
aniNum = type ? '100%' : '0'
}
}
this.animation[this.animationMode()[mode]](aniNum)
}
if (typeof this.modeClass === 'string') {
buildTranfrom(type, this.modeClass)
} else {
this.modeClass.forEach(mode => {
buildTranfrom(type, mode)
})
}
return this.animation
},
animationType(type) {
return {
fade: type ? 1 : 0,
'slide-top': `translateY(${type ? '0' : '-100%'})`,
'slide-right': `translateX(${type ? '0' : '100%'})`,
'slide-bottom': `translateY(${type ? '0' : '100%'})`,
'slide-left': `translateX(${type ? '0' : '-100%'})`,
'zoom-in': `scaleX(${type ? 1 : 0.8}) scaleY(${type ? 1 : 0.8})`,
'zoom-out': `scaleX(${type ? 1 : 1.2}) scaleY(${type ? 1 : 1.2})`
}
},
//
animationMode() {
return {
fade: 'opacity',
'slide-top': 'translateY',
'slide-right': 'translateX',
'slide-bottom': 'translateY',
'slide-left': 'translateX',
'zoom-in': 'scale',
'zoom-out': 'scale'
}
},
// 线
toLine(name) {
return name.replace(/([A-Z])/g, '-$1').toLowerCase()
}
}
}
</script>
<style></style>

@ -0,0 +1,87 @@
{
"id": "uni-transition",
"displayName": "uni-transition 过渡动画",
"version": "1.3.1",
"description": "元素的简单过渡动画",
"keywords": [
"uni-ui",
"uniui",
"动画",
"过渡",
"过渡动画"
],
"repository": "https://github.com/dcloudio/uni-ui",
"engines": {
"HBuilderX": ""
},
"directories": {
"example": "../../temps/example_temps"
},
"dcloudext": {
"category": [
"前端组件",
"通用组件"
],
"sale": {
"regular": {
"price": "0.00"
},
"sourcecode": {
"price": "0.00"
}
},
"contact": {
"qq": ""
},
"declaration": {
"ads": "无",
"data": "无",
"permissions": "无"
},
"npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui"
},
"uni_modules": {
"dependencies": ["uni-scss"],
"encrypt": [],
"platforms": {
"cloud": {
"tcb": "y",
"aliyun": "y"
},
"client": {
"App": {
"app-vue": "y",
"app-nvue": "y"
},
"H5-mobile": {
"Safari": "y",
"Android Browser": "y",
"微信浏览器(Android)": "y",
"QQ浏览器(Android)": "y"
},
"H5-pc": {
"Chrome": "y",
"IE": "y",
"Edge": "y",
"Firefox": "y",
"Safari": "y"
},
"小程序": {
"微信": "y",
"阿里": "y",
"百度": "y",
"字节跳动": "y",
"QQ": "y"
},
"快应用": {
"华为": "u",
"联盟": "u"
},
"Vue": {
"vue2": "y",
"vue3": "y"
}
}
}
}
}

@ -0,0 +1,11 @@
## Transition 过渡动画
> **组件名:uni-transition**
> 代码块: `uTransition`
元素过渡动画
### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-transition)
#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839
Loading…
Cancel
Save