perf: table, close #4787
parent
816665f935
commit
9322965027
|
@ -6,7 +6,7 @@ let id = 0;
|
|||
const ids: RafMap = {};
|
||||
|
||||
// Support call raf with delay specified frame
|
||||
export default function wrapperRaf(callback: () => void, delayFrames = 1): number {
|
||||
export default function raf(callback: () => void, delayFrames = 1): number {
|
||||
const myId: number = id++;
|
||||
let restFrames: number = delayFrames;
|
||||
|
||||
|
@ -26,11 +26,11 @@ export default function wrapperRaf(callback: () => void, delayFrames = 1): numbe
|
|||
return myId;
|
||||
}
|
||||
|
||||
wrapperRaf.cancel = function cancel(pid?: number) {
|
||||
raf.cancel = function cancel(pid?: number) {
|
||||
if (pid === undefined) return;
|
||||
|
||||
cancelAnimationFrame(ids[pid]);
|
||||
delete ids[pid];
|
||||
};
|
||||
|
||||
wrapperRaf.ids = ids; // export this for test usage
|
||||
raf.ids = ids; // export this for test usage
|
||||
|
|
|
@ -448,12 +448,15 @@ export default defineComponent<TableProps<DefaultRecordType>>({
|
|||
onScroll({ currentTarget: scrollBodyRef.value });
|
||||
}
|
||||
};
|
||||
|
||||
let timtout;
|
||||
const onFullTableResize = ({ width }) => {
|
||||
if (width !== componentWidth.value) {
|
||||
triggerOnScroll();
|
||||
componentWidth.value = fullTableRef.value ? fullTableRef.value.offsetWidth : width;
|
||||
}
|
||||
clearTimeout(timtout);
|
||||
timtout = setTimeout(() => {
|
||||
if (width !== componentWidth.value) {
|
||||
triggerOnScroll();
|
||||
componentWidth.value = fullTableRef.value ? fullTableRef.value.offsetWidth : width;
|
||||
}
|
||||
}, 100);
|
||||
};
|
||||
|
||||
watch([horizonScroll, () => props.data, () => props.columns], () => {
|
||||
|
|
|
@ -1,41 +1,29 @@
|
|||
import raf from '../../_util/raf';
|
||||
import type { Ref, UnwrapRef } from 'vue';
|
||||
import { onBeforeUnmount, ref } from 'vue';
|
||||
import { onBeforeUnmount, ref, shallowRef } from 'vue';
|
||||
|
||||
export type Updater<State> = (prev: State) => State;
|
||||
|
||||
/**
|
||||
* Execute code before next frame but async
|
||||
*/
|
||||
export function useLayoutState<State>(
|
||||
defaultState: State,
|
||||
): [Ref<State>, (updater: Updater<State>) => void] {
|
||||
const stateRef = ref<State>(defaultState);
|
||||
// const [, forceUpdate] = useState({});
|
||||
|
||||
const lastPromiseRef = ref<Promise<void>>(null);
|
||||
const updateBatchRef = ref<Updater<State>[]>([]);
|
||||
const stateRef = shallowRef<State>(defaultState);
|
||||
let rafId: number;
|
||||
const updateBatchRef = shallowRef<Updater<State>[]>([]);
|
||||
function setFrameState(updater: Updater<State>) {
|
||||
updateBatchRef.value.push(updater);
|
||||
|
||||
const promise = Promise.resolve();
|
||||
lastPromiseRef.value = promise;
|
||||
|
||||
promise.then(() => {
|
||||
if (lastPromiseRef.value === promise) {
|
||||
const prevBatch = updateBatchRef.value;
|
||||
// const prevState = stateRef.value;
|
||||
updateBatchRef.value = [];
|
||||
|
||||
prevBatch.forEach(batchUpdater => {
|
||||
stateRef.value = batchUpdater(stateRef.value as State) as UnwrapRef<State>;
|
||||
});
|
||||
|
||||
lastPromiseRef.value = null;
|
||||
}
|
||||
raf.cancel(rafId);
|
||||
rafId = raf(() => {
|
||||
const prevBatch = updateBatchRef.value;
|
||||
// const prevState = stateRef.value;
|
||||
updateBatchRef.value = [];
|
||||
prevBatch.forEach(batchUpdater => {
|
||||
stateRef.value = batchUpdater(stateRef.value as State);
|
||||
});
|
||||
});
|
||||
}
|
||||
onBeforeUnmount(() => {
|
||||
lastPromiseRef.value = null;
|
||||
raf.cancel(rafId);
|
||||
});
|
||||
|
||||
return [stateRef as Ref<State>, setFrameState];
|
||||
|
|
Loading…
Reference in New Issue