diff --git a/app/src/components/tab/tab.vue b/app/src/components/tab/tab.vue new file mode 100644 index 00000000..0d752bdc --- /dev/null +++ b/app/src/components/tab/tab.vue @@ -0,0 +1,79 @@ + + + + + diff --git a/app/src/components/tabs/tabs.vue b/app/src/components/tabs/tabs.vue new file mode 100644 index 00000000..8b5f1890 --- /dev/null +++ b/app/src/components/tabs/tabs.vue @@ -0,0 +1,405 @@ + + + + + diff --git a/app/src/hooks/useTouch.ts b/app/src/hooks/useTouch.ts new file mode 100644 index 00000000..509764a9 --- /dev/null +++ b/app/src/hooks/useTouch.ts @@ -0,0 +1,73 @@ +import { reactive } from "vue" + +/** + * @description 触碰屏幕钩子函数 + * @return { Function } 暴露钩子 + */ +export function useTouch () { + // 最小移动距离 + const MIN_DISTANCE = 10; + + const touch = reactive({ + direction: '', + deltaX: 0, + deltaY: 0, + offsetX: 0, + offsetY: 0 + }) + + /** + * @description 计算距离 + * @return { string } 空字符串 + */ + const getDirection = (x: number, y: number) => { + if (x > y && x > MIN_DISTANCE) { + return 'horizontal'; + } + if (y > x && y > MIN_DISTANCE) { + return 'vertical'; + } + return ''; + } + + /** + * @description 重置参数 + */ + const resetTouchStatus = () => { + touch.direction = ''; + touch.deltaX = 0; + touch.deltaY = 0; + touch.offsetX = 0; + touch.offsetY = 0; + } + + /** + * @description 触发 + */ + const touchStart = (event: any) => { + resetTouchStatus(); + const events = event.touches[0]; + touch.startX = events.clientX; + touch.startY = events.clientY; + } + + /** + * @description 移动 + */ + const touchMove = (event: any) => { + const events = event.touches[0]; + touch.deltaX = events.clientX - touch.startX; + touch.deltaY = events.clientY - touch.startY; + touch.offsetX = Math.abs(touch.deltaX); + touch.offsetY = Math.abs(touch.deltaY); + touch.direction = + touch.direction || getDirection(touch.offsetX, touch.offsetY); + } + + return { + touch, + resetTouchStatus, + touchStart, + touchMove + } +} diff --git a/app/src/utils/util.ts b/app/src/utils/util.ts new file mode 100644 index 00000000..b7d35726 --- /dev/null +++ b/app/src/utils/util.ts @@ -0,0 +1,23 @@ +/** + * @description 获取元素节点信息(在组件中的元素必须要传ctx) + * @param { String } selector 选择器 '.app' | '#app' + * @param { Boolean } all 是否多选 + * @param { ctx } context 当前组件实例 + */ +export const getRect = (selector: string, all: boolean = false, context?: any) => { + return new Promise((resolve, reject) => { + let qurey = uni.createSelectorQuery() + if (context) { + qurey = uni.createSelectorQuery().in(context) + } + qurey[all ? 'selectAll' : 'select'](selector).boundingClientRect(function(rect) { + if (all && Array.isArray(rect) && rect.length) { + return resolve(rect) + } + if (!all && rect) { + return resolve(rect) + } + reject('找不到元素') + }).exec() + }) +} \ No newline at end of file