123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245 |
- const BindingX = uni.requireNativePlugin('bindingx');
- const dom = uni.requireNativePlugin('dom');
- const animation = uni.requireNativePlugin('animation');
- export default {
- data() {
- return {
- right: 0,
- button: [],
- preventGesture: false
- }
- },
- watch: {
- show(newVal) {
- if (!this.position || JSON.stringify(this.position) === '{}') return;
- if (this.autoClose) return
- if (this.isInAnimation) return
- if (newVal) {
- this.open()
- } else {
- this.close()
- }
- },
- },
- created() {
- if (this.swipeaction.children !== undefined) {
- this.swipeaction.children.push(this)
- }
- },
- mounted() {
- this.boxSelector = this.getEl(this.$refs['selector-box-hock']);
- this.selector = this.getEl(this.$refs['selector-content-hock']);
- this.buttonSelector = this.getEl(this.$refs['selector-button-hock']);
- this.position = {}
- this.x = 0
- setTimeout(() => {
- this.getSelectorQuery()
- }, 200)
- },
- beforeDestroy() {
- if (this.timing) {
- BindingX.unbind({
- token: this.timing.token,
- eventType: 'timing'
- })
- }
- if (this.eventpan) {
- BindingX.unbind({
- token: this.eventpan.token,
- eventType: 'pan'
- })
- }
- this.swipeaction.children.forEach((item, index) => {
- if (item === this) {
- this.swipeaction.children.splice(index, 1)
- }
- })
- },
- methods: {
- onClick(index, item) {
- this.$emit('click', {
- content: item,
- index
- })
- },
- touchstart(e) {
- if (this.isInAnimation) return
- if (this.stop) return
- this.stop = true
- if (this.autoClose) {
- this.swipeaction.closeOther(this)
- }
- let endWidth = this.right
- let boxStep = `(x+${this.x})`
- let pageX = `${boxStep}> ${-endWidth} && ${boxStep} < 0?${boxStep}:(x+${this.x} < 0? ${-endWidth}:0)`
- let props = [{
- element: this.selector,
- property: 'transform.translateX',
- expression: pageX
- }]
- let left = 0
- for (let i = 0; i < this.options.length; i++) {
- let buttonSelectors = this.getEl(this.$refs['button-hock'][i]);
- if (this.button.length === 0 || !this.button[i] || !this.button[i].width) return
- let moveMix = endWidth - left
- left += this.button[i].width
- let step = `(${this.x}+x)/${endWidth}`
- let moveX = `(${step}) * ${moveMix}`
- let pageButtonX = `${moveX}&& (x+${this.x} > ${-endWidth})?${moveX}:${-moveMix}`
- props.push({
- element: buttonSelectors,
- property: 'transform.translateX',
- expression: pageButtonX
- })
- }
- this.eventpan = this._bind(this.boxSelector, props, 'pan', (e) => {
- if (e.state === 'end') {
- this.x = e.deltaX + this.x;
- if (this.x < -endWidth) {
- this.x = -endWidth
- }
- if (this.x > 0) {
- this.x = 0
- }
- this.stop = false
- this.bindTiming();
- }
- })
- },
- touchend(e) {
- this.$nextTick(() => {
- if (this.isopen && !this.isDrag && !this.isInAnimation) {
- this.close()
- }
- })
- },
- bindTiming() {
- if (this.isopen) {
- this.move(this.x, -this.right)
- } else {
- this.move(this.x, -40)
- }
- },
- move(left, value) {
- if (left >= value) {
- this.close()
- } else {
- this.open()
- }
- },
- /**
- * 开启swipe
- */
- open() {
- this.animation(true)
- },
- /**
- * 关闭swipe
- */
- close() {
- this.animation(false)
- },
- /**
- * 开启关闭动画
- * @param {Object} type
- */
- animation(type) {
- this.isDrag = true
- let endWidth = this.right
- let time = 200
- this.isInAnimation = true;
- let exit = `t>${time}`;
- let translate_x_expression = `easeOutExpo(t,${this.x},${type?(-endWidth-this.x):(-this.x)},${time})`
- let props = [{
- element: this.selector,
- property: 'transform.translateX',
- expression: translate_x_expression
- }]
- let left = 0
- for (let i = 0; i < this.options.length; i++) {
- let buttonSelectors = this.getEl(this.$refs['button-hock'][i]);
- if (this.button.length === 0 || !this.button[i] || !this.button[i].width) return
- let moveMix = endWidth - left
- left += this.button[i].width
- let step = `${this.x}/${endWidth}`
- let moveX = `(${step}) * ${moveMix}`
- let pageButtonX = `easeOutExpo(t,${moveX},${type ? -moveMix + '-' + moveX: 0 + '-' + moveX},${time})`
- props.push({
- element: buttonSelectors,
- property: 'transform.translateX',
- expression: pageButtonX
- })
- }
- this.timing = BindingX.bind({
- eventType: 'timing',
- exitExpression: exit,
- props: props
- }, (e) => {
- if (e.state === 'end' || e.state === 'exit') {
- this.x = type ? -endWidth : 0
- this.isInAnimation = false;
- this.isopen = this.isopen || false
- if (this.isopen !== type) {
- this.$emit('change', type)
- }
- this.isopen = type
- this.isDrag = false
- }
- });
- },
- /**
- * 绑定 BindingX
- * @param {Object} anchor
- * @param {Object} props
- * @param {Object} fn
- */
- _bind(anchor, props, eventType, fn) {
- return BindingX.bind({
- anchor,
- eventType,
- props
- }, (e) => {
- typeof(fn) === 'function' && fn(e)
- });
- },
- /**
- * 获取ref
- * @param {Object} el
- */
- getEl(el) {
- return el.ref
- },
- /**
- * 获取节点信息
- */
- getSelectorQuery() {
- dom.getComponentRect(this.$refs['selector-content-hock'], (data) => {
- if (this.position.content) return
- this.position.content = data.size
- })
- for (let i = 0; i < this.options.length; i++) {
- dom.getComponentRect(this.$refs['button-hock'][i], (data) => {
- if (!this.button) {
- this.button = []
- }
- if (this.options.length === this.button.length) return
- this.button.push(data.size)
- this.right += data.size.width
- if (this.autoClose) return
- if (this.show) {
- this.open()
- }
- })
- }
- }
- }
- }
|