mirror of
https://github.com/pure-admin/vue-pure-admin.git
synced 2025-06-07 08:57:19 +08:00
feat: ready add SeamlessScroll component
This commit is contained in:
parent
71181b9d2b
commit
bd8348b432
@ -1,7 +1,7 @@
|
|||||||
import type { CSSProperties } from 'vue'
|
import type { CSSProperties } from 'vue'
|
||||||
|
|
||||||
import { defineComponent, onBeforeMount, nextTick, ref, unref, computed, PropType, getCurrentInstance } from 'vue'
|
import { defineComponent, onBeforeMount, nextTick, ref, unref, computed, PropType } from 'vue'
|
||||||
|
import { templateRef } from '@vueuse/core'
|
||||||
import { useAttrs } from '/@/utils/useAttrs'
|
import { useAttrs } from '/@/utils/useAttrs'
|
||||||
import { emitter } from '/@/utils/mitt'
|
import { emitter } from '/@/utils/mitt'
|
||||||
|
|
||||||
@ -64,8 +64,8 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
setup(props) {
|
setup(props) {
|
||||||
let vm: any
|
|
||||||
const cropper: any = ref<Nullable<Cropper>>(null)
|
const cropper: any = ref<Nullable<Cropper>>(null)
|
||||||
|
const imgElRef = templateRef<HTMLElement | null>('imgElRef', null)
|
||||||
|
|
||||||
const isReady = ref(false)
|
const isReady = ref(false)
|
||||||
|
|
||||||
@ -88,7 +88,7 @@ export default defineComponent({
|
|||||||
)
|
)
|
||||||
|
|
||||||
async function init() {
|
async function init() {
|
||||||
const imgEl = vm.refs.imgElRef
|
const imgEl = unref(imgElRef)
|
||||||
if (!imgEl) {
|
if (!imgEl) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -102,7 +102,6 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
|
|
||||||
onBeforeMount(() => {
|
onBeforeMount(() => {
|
||||||
vm = getCurrentInstance()
|
|
||||||
nextTick(() => {
|
nextTick(() => {
|
||||||
init()
|
init()
|
||||||
// tsx语法返回渲染模板,外部组件想调用内部方法或者获取setup里面的实例,暂时想到的办法是通过公共事件
|
// tsx语法返回渲染模板,外部组件想调用内部方法或者获取setup里面的实例,暂时想到的办法是通过公共事件
|
||||||
|
10
src/components/SeamlessScroll/index.ts
Normal file
10
src/components/SeamlessScroll/index.ts
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
import { App } from "vue"
|
||||||
|
import seamlessScroll from "./src/SeamlessScroll.vue"
|
||||||
|
|
||||||
|
export const SeamlessScroll = Object.assign(seamlessScroll, {
|
||||||
|
install(app: App) {
|
||||||
|
app.component(seamlessScroll.name, seamlessScroll)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
export default SeamlessScroll
|
15
src/components/SeamlessScroll/src/SeamlessScroll.vue
Normal file
15
src/components/SeamlessScroll/src/SeamlessScroll.vue
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
<template>
|
||||||
|
<div></div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang='ts'>
|
||||||
|
export default {
|
||||||
|
name: "SeamlessScroll",
|
||||||
|
setup() {
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
</style>
|
114
src/components/SeamlessScroll/src/utils.ts
Normal file
114
src/components/SeamlessScroll/src/utils.ts
Normal file
@ -0,0 +1,114 @@
|
|||||||
|
/**
|
||||||
|
* @desc AnimationFrame简单兼容hack
|
||||||
|
*/
|
||||||
|
const animationFrame = () => {
|
||||||
|
window.cancelAnimationFrame = (function () {
|
||||||
|
return window.cancelAnimationFrame ||
|
||||||
|
window.webkitCancelAnimationFrame ||
|
||||||
|
window.mozCancelAnimationFrame ||
|
||||||
|
window.oCancelAnimationFrame ||
|
||||||
|
window.msCancelAnimationFrame ||
|
||||||
|
function (id) {
|
||||||
|
return window.clearTimeout(id)
|
||||||
|
}
|
||||||
|
})()
|
||||||
|
window.requestAnimationFrame = function () {
|
||||||
|
return (
|
||||||
|
window.requestAnimationFrame ||
|
||||||
|
window.webkitRequestAnimationFrame ||
|
||||||
|
window.mozRequestAnimationFrame ||
|
||||||
|
window.oRequestAnimationFrame ||
|
||||||
|
window.msRequestAnimationFrame ||
|
||||||
|
function (callback) {
|
||||||
|
return window.setTimeout(callback, 1000 / 60)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @desc 判断数组是否相等
|
||||||
|
* @param {arr1,arr2}
|
||||||
|
* @return {Boolean}
|
||||||
|
*/
|
||||||
|
const arrayEqual = (arr1: Array<any>, arr2: Array<any>) => {
|
||||||
|
if (arr1 === arr2) return true
|
||||||
|
if (arr1.length !== arr2.length) return false
|
||||||
|
for (let i = 0; i < arr1.length; ++i) {
|
||||||
|
if (arr1[i] !== arr2[i]) return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @desc 深浅合并拷贝
|
||||||
|
*/
|
||||||
|
function copyObj() {
|
||||||
|
if (!Array.isArray) {
|
||||||
|
// @ts-expect-error
|
||||||
|
Array.isArray = function (arg) {
|
||||||
|
return Object.prototype.toString.call(arg) === '[object Array]'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let name, options, src, copy, copyIsArray, clone,
|
||||||
|
i = 1,
|
||||||
|
target = arguments[0] || {}, // 使用||运算符,排除隐式强制类型转换为false的数据类型
|
||||||
|
deep = false,
|
||||||
|
len = arguments.length
|
||||||
|
if (typeof target === 'boolean') {
|
||||||
|
deep = target
|
||||||
|
target = arguments[1] || {}
|
||||||
|
i++
|
||||||
|
}
|
||||||
|
if (typeof target !== 'object' && typeof target !== 'function') {
|
||||||
|
target = {}
|
||||||
|
}
|
||||||
|
// 如果arguments.length === 1 或typeof arguments[0] === 'boolean',且存在arguments[1],则直接返回target对象
|
||||||
|
if (i === len) {
|
||||||
|
return target
|
||||||
|
}
|
||||||
|
for (; i < len; i++) {
|
||||||
|
//所以如果源对象中数据类型为Undefined或Null那么就会跳过本次循环,接着循环下一个源对象
|
||||||
|
if ((options = arguments[i]) != null) {
|
||||||
|
// 如果遇到源对象的数据类型为Boolean, Number for in循环会被跳过,不执行for in循环// src用于判断target对象是否存在name属性
|
||||||
|
for (name in options) {
|
||||||
|
// src用于判断target对象是否存在name属性
|
||||||
|
src = target[name]
|
||||||
|
// 需要复制的属性当前源对象的name属性
|
||||||
|
copy = options[name]
|
||||||
|
// 判断copy是否是数组
|
||||||
|
copyIsArray = Array.isArray(copy)
|
||||||
|
// 如果是深复制且copy是一个对象或数组则需要递归直到copy成为一个基本数据类型为止
|
||||||
|
if (deep && copy && (typeof copy === 'object' || copyIsArray)) {
|
||||||
|
if (copyIsArray) {
|
||||||
|
copyIsArray = false
|
||||||
|
// 如果目标对象存在name属性且是一个数组
|
||||||
|
// 则使用目标对象的name属性,否则重新创建一个数组,用于复制
|
||||||
|
clone = src && Array.isArray(src) ? src : []
|
||||||
|
} else {
|
||||||
|
// 如果目标对象存在name属性且是一个对象则使用目标对象的name属性,否则重新创建一个对象,用于复制
|
||||||
|
clone = src && typeof src === 'object' ? src : {}
|
||||||
|
}
|
||||||
|
// 深复制,所以递归调用copyObject函数
|
||||||
|
// 返回值为target对象,即clone对象
|
||||||
|
// copy是一个源对象
|
||||||
|
// @ts-expect-error
|
||||||
|
target[name] = copyObj(deep, clone, copy)
|
||||||
|
} else if (copy !== undefined) {
|
||||||
|
// 浅复制,直接复制到target对象上
|
||||||
|
target[name] = copy
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return target
|
||||||
|
}
|
||||||
|
|
||||||
|
export default {
|
||||||
|
animationFrame,
|
||||||
|
arrayEqual,
|
||||||
|
copyObj
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
8
types/global.d.ts
vendored
8
types/global.d.ts
vendored
@ -18,7 +18,13 @@ declare global {
|
|||||||
}
|
}
|
||||||
declare interface Window {
|
declare interface Window {
|
||||||
// Global vue app instance
|
// Global vue app instance
|
||||||
__APP__: App<Element>
|
__APP__: App<Element>,
|
||||||
|
mozCancelAnimationFrame: (id?: any) => any,
|
||||||
|
oCancelAnimationFrame: (id?: any) => any,
|
||||||
|
msCancelAnimationFrame: (id?: any) => any,
|
||||||
|
mozRequestAnimationFrame: (id?: any) => any,
|
||||||
|
oRequestAnimationFrame: (id?: any) => any,
|
||||||
|
msRequestAnimationFrame: (id?: any) => any
|
||||||
}
|
}
|
||||||
|
|
||||||
// vue
|
// vue
|
||||||
|
Loading…
x
Reference in New Issue
Block a user