| | |
| | | export default { |
| | | data() { |
| | | return { |
| | | x: 0, |
| | | transition: false, |
| | | width: 0, |
| | | viewWidth: 0, |
| | | swipeShow: 0 |
| | | } |
| | | }, |
| | | watch: { |
| | | show(newVal) { |
| | | if (this.autoClose) return |
| | | if (newVal && newVal !== 'none' ) { |
| | | this.transition = true |
| | | this.open(newVal) |
| | | } else { |
| | | this.close() |
| | | } |
| | | } |
| | | }, |
| | | created() { |
| | | this.swipeaction = this.getSwipeAction() |
| | | if (this.swipeaction.children !== undefined) { |
| | | this.swipeaction.children.push(this) |
| | | } |
| | | }, |
| | | mounted() { |
| | | this.isopen = false |
| | | setTimeout(() => { |
| | | this.getQuerySelect() |
| | | }, 50) |
| | | }, |
| | | methods: { |
| | | appTouchStart(e) { |
| | | const { |
| | | clientX |
| | | } = e.changedTouches[0] |
| | | this.clientX = clientX |
| | | this.timestamp = new Date().getTime() |
| | | }, |
| | | appTouchEnd(e, index, item, position) { |
| | | const { |
| | | clientX |
| | | } = e.changedTouches[0] |
| | | // fixed by xxxx 模拟点击事件,解决 ios 13 点击区域错位的问题 |
| | | let diff = Math.abs(this.clientX - clientX) |
| | | let time = (new Date().getTime()) - this.timestamp |
| | | if (diff < 40 && time < 300) { |
| | | this.$emit('click', { |
| | | content: item, |
| | | index, |
| | | position |
| | | }) |
| | | } |
| | | }, |
| | | /** |
| | | * 移动触发 |
| | | * @param {Object} e |
| | | */ |
| | | onChange(e) { |
| | | this.moveX = e.detail.x |
| | | this.isclose = false |
| | | }, |
| | | touchstart(e) { |
| | | this.transition = false |
| | | this.isclose = true |
| | | this.autoClose && this.swipeaction.closeOther(this) |
| | | }, |
| | | touchmove(e) {}, |
| | | touchend(e) { |
| | | // 0的位置什么都不执行 |
| | | if (this.isclose && this.isopen === 'none') return |
| | | if (this.isclose && this.isopen !== 'none') { |
| | | this.transition = true |
| | | this.close() |
| | | } else { |
| | | this.move(this.moveX + this.leftWidth) |
| | | } |
| | | }, |
| | | |
| | | /** |
| | | * 移动 |
| | | * @param {Object} moveX |
| | | */ |
| | | move(moveX) { |
| | | // 打开关闭的处理逻辑不太一样 |
| | | this.transition = true |
| | | // 未打开状态 |
| | | if (!this.isopen || this.isopen === 'none') { |
| | | if (moveX > this.threshold) { |
| | | this.open('left') |
| | | } else if (moveX < -this.threshold) { |
| | | this.open('right') |
| | | } else { |
| | | this.close() |
| | | } |
| | | } else { |
| | | if (moveX < 0 && moveX < this.rightWidth) { |
| | | const rightX = this.rightWidth + moveX |
| | | if (rightX < this.threshold) { |
| | | this.open('right') |
| | | } else { |
| | | this.close() |
| | | } |
| | | } else if (moveX > 0 && moveX < this.leftWidth) { |
| | | const leftX = this.leftWidth - moveX |
| | | if (leftX < this.threshold) { |
| | | this.open('left') |
| | | } else { |
| | | this.close() |
| | | } |
| | | } |
| | | |
| | | } |
| | | |
| | | }, |
| | | |
| | | /** |
| | | * 打开 |
| | | */ |
| | | open(type) { |
| | | this.x = this.moveX |
| | | this.animation(type) |
| | | }, |
| | | |
| | | /** |
| | | * 关闭 |
| | | */ |
| | | close() { |
| | | this.x = this.moveX |
| | | // TODO 解决 x 值不更新的问题,所以会多触发一次 nextTick ,待优化 |
| | | this.$nextTick(() => { |
| | | this.x = -this.leftWidth |
| | | if(this.isopen!=='none'){ |
| | | this.$emit('change', 'none') |
| | | } |
| | | this.isopen = 'none' |
| | | }) |
| | | }, |
| | | |
| | | /** |
| | | * 执行结束动画 |
| | | * @param {Object} type |
| | | */ |
| | | animation(type) { |
| | | this.$nextTick(() => { |
| | | if (type === 'left') { |
| | | this.x = 0 |
| | | } else { |
| | | this.x = -this.rightWidth - this.leftWidth |
| | | } |
| | | |
| | | if(this.isopen!==type){ |
| | | this.$emit('change', type) |
| | | } |
| | | this.isopen = type |
| | | }) |
| | | |
| | | }, |
| | | getSlide(x) {}, |
| | | getQuerySelect() { |
| | | const query = uni.createSelectorQuery().in(this); |
| | | query.selectAll('.movable-view--hock').boundingClientRect(data => { |
| | | this.leftWidth = data[1].width |
| | | this.rightWidth = data[2].width |
| | | this.width = data[0].width |
| | | this.viewWidth = this.width + this.rightWidth + this.leftWidth |
| | | if (this.leftWidth === 0) { |
| | | // TODO 疑似bug ,初始化的时候如果x 是0,会导致移动位置错误,所以让元素超出一点 |
| | | this.x = -0.1 |
| | | } else { |
| | | this.x = -this.leftWidth |
| | | } |
| | | this.moveX = this.x |
| | | this.$nextTick(() => { |
| | | this.swipeShow = 1 |
| | | }) |
| | | |
| | | if (!this.buttonWidth) { |
| | | this.disabledView = true |
| | | } |
| | | |
| | | if (this.autoClose) return |
| | | if (this.show !== 'none') { |
| | | this.transition = true |
| | | this.open(this.shows) |
| | | } |
| | | }).exec(); |
| | | |
| | | } |
| | | } |
| | | } |
| | | export default {
|
| | | data() {
|
| | | return {
|
| | | x: 0,
|
| | | transition: false,
|
| | | width: 0,
|
| | | viewWidth: 0,
|
| | | swipeShow: 0
|
| | | }
|
| | | },
|
| | | watch: {
|
| | | show(newVal) {
|
| | | if (this.autoClose) return
|
| | | if (newVal && newVal !== 'none' ) {
|
| | | this.transition = true
|
| | | this.open(newVal)
|
| | | } else {
|
| | | this.close()
|
| | | }
|
| | | }
|
| | | },
|
| | | created() {
|
| | | this.swipeaction = this.getSwipeAction()
|
| | | if (this.swipeaction.children !== undefined) {
|
| | | this.swipeaction.children.push(this)
|
| | | }
|
| | | },
|
| | | mounted() {
|
| | | this.isopen = false
|
| | | setTimeout(() => {
|
| | | this.getQuerySelect()
|
| | | }, 50)
|
| | | },
|
| | | methods: {
|
| | | appTouchStart(e) {
|
| | | const {
|
| | | clientX
|
| | | } = e.changedTouches[0]
|
| | | this.clientX = clientX
|
| | | this.timestamp = new Date().getTime()
|
| | | },
|
| | | appTouchEnd(e, index, item, position) {
|
| | | const {
|
| | | clientX
|
| | | } = e.changedTouches[0]
|
| | | // fixed by xxxx 模拟点击事件,解决 ios 13 点击区域错位的问题
|
| | | let diff = Math.abs(this.clientX - clientX)
|
| | | let time = (new Date().getTime()) - this.timestamp
|
| | | if (diff < 40 && time < 300) {
|
| | | this.$emit('click', {
|
| | | content: item,
|
| | | index,
|
| | | position
|
| | | })
|
| | | }
|
| | | },
|
| | | /**
|
| | | * 移动触发
|
| | | * @param {Object} e
|
| | | */
|
| | | onChange(e) {
|
| | | this.moveX = e.detail.x
|
| | | this.isclose = false
|
| | | },
|
| | | touchstart(e) {
|
| | | this.transition = false
|
| | | this.isclose = true
|
| | | this.autoClose && this.swipeaction.closeOther(this)
|
| | | },
|
| | | touchmove(e) {},
|
| | | touchend(e) {
|
| | | // 0的位置什么都不执行
|
| | | if (this.isclose && this.isopen === 'none') return
|
| | | if (this.isclose && this.isopen !== 'none') {
|
| | | this.transition = true
|
| | | this.close()
|
| | | } else {
|
| | | this.move(this.moveX + this.leftWidth)
|
| | | }
|
| | | },
|
| | |
|
| | | /**
|
| | | * 移动
|
| | | * @param {Object} moveX
|
| | | */
|
| | | move(moveX) {
|
| | | // 打开关闭的处理逻辑不太一样
|
| | | this.transition = true
|
| | | // 未打开状态
|
| | | if (!this.isopen || this.isopen === 'none') {
|
| | | if (moveX > this.threshold) {
|
| | | this.open('left')
|
| | | } else if (moveX < -this.threshold) {
|
| | | this.open('right')
|
| | | } else {
|
| | | this.close()
|
| | | }
|
| | | } else {
|
| | | if (moveX < 0 && moveX < this.rightWidth) {
|
| | | const rightX = this.rightWidth + moveX
|
| | | if (rightX < this.threshold) {
|
| | | this.open('right')
|
| | | } else {
|
| | | this.close()
|
| | | }
|
| | | } else if (moveX > 0 && moveX < this.leftWidth) {
|
| | | const leftX = this.leftWidth - moveX
|
| | | if (leftX < this.threshold) {
|
| | | this.open('left')
|
| | | } else {
|
| | | this.close()
|
| | | }
|
| | | }
|
| | |
|
| | | }
|
| | |
|
| | | },
|
| | |
|
| | | /**
|
| | | * 打开
|
| | | */
|
| | | open(type) {
|
| | | this.x = this.moveX
|
| | | this.animation(type)
|
| | | },
|
| | |
|
| | | /**
|
| | | * 关闭
|
| | | */
|
| | | close() {
|
| | | this.x = this.moveX
|
| | | // TODO 解决 x 值不更新的问题,所以会多触发一次 nextTick ,待优化
|
| | | this.$nextTick(() => {
|
| | | this.x = -this.leftWidth
|
| | | if(this.isopen!=='none'){
|
| | | this.$emit('change', 'none')
|
| | | }
|
| | | this.isopen = 'none'
|
| | | })
|
| | | },
|
| | |
|
| | | /**
|
| | | * 执行结束动画
|
| | | * @param {Object} type
|
| | | */
|
| | | animation(type) {
|
| | | this.$nextTick(() => {
|
| | | if (type === 'left') {
|
| | | this.x = 0
|
| | | } else {
|
| | | this.x = -this.rightWidth - this.leftWidth
|
| | | }
|
| | | |
| | | if(this.isopen!==type){
|
| | | this.$emit('change', type)
|
| | | }
|
| | | this.isopen = type
|
| | | })
|
| | |
|
| | | },
|
| | | getSlide(x) {},
|
| | | getQuerySelect() {
|
| | | const query = uni.createSelectorQuery().in(this);
|
| | | query.selectAll('.movable-view--hock').boundingClientRect(data => {
|
| | | this.leftWidth = data[1].width
|
| | | this.rightWidth = data[2].width
|
| | | this.width = data[0].width
|
| | | this.viewWidth = this.width + this.rightWidth + this.leftWidth
|
| | | if (this.leftWidth === 0) {
|
| | | // TODO 疑似bug ,初始化的时候如果x 是0,会导致移动位置错误,所以让元素超出一点
|
| | | this.x = -0.1
|
| | | } else {
|
| | | this.x = -this.leftWidth
|
| | | }
|
| | | this.moveX = this.x
|
| | | this.$nextTick(() => {
|
| | | this.swipeShow = 1
|
| | | })
|
| | |
|
| | | if (!this.buttonWidth) {
|
| | | this.disabledView = true
|
| | | }
|
| | |
|
| | | if (this.autoClose) return
|
| | | if (this.show !== 'none') {
|
| | | this.transition = true
|
| | | this.open(this.shows)
|
| | | }
|
| | | }).exec();
|
| | |
|
| | | }
|
| | | }
|
| | | }
|