Files
dooring/packages/dooringx-lib/src/hooks/index.ts

99 lines
2.8 KiB
TypeScript
Raw Normal View History

2021-07-09 01:41:03 +08:00
/*
* @Author: yehuozhili
* @Date: 2021-03-14 05:35:15
* @LastEditors: yehuozhili
* @LastEditTime: 2021-07-04 17:52:02
* @FilePath: \DooringV2\packages\dooring-v2-lib\src\hooks\index.ts
*/
import { store } from '../runtime/store';
import { useEffect, useMemo, useState } from 'react';
import UserConfig from '../config';
import { ComponentRenderConfigProps } from '../core/components/componentItem';
import { registCommandFn, unRegistCommandFn } from '../core/command/runtime';
export function useStoreState(
config: UserConfig,
extraFn: Function = () => {},
everyFn: Function = () => {}
) {
const [state, setState] = useState(store.getData());
const forceUpdate = useState(0)[1];
useEffect(() => {
const unRegister = store.subscribe(() => {
setState(store.getData());
config.getEventCenter().syncEventMap(store.getData(), config.getStoreChanger());
extraFn();
});
store.setForceUpdate(() => forceUpdate((v) => v + 1));
const commandModules = config.getConfig().initCommandModule;
const commander = config.getCommanderRegister();
registCommandFn(commandModules, commander);
return () => {
unRegister();
unRegistCommandFn(commandModules, commander);
};
}, [config, extraFn]);
useEffect(() => {
everyFn();
}, [everyFn]);
// 去除默认滚动
useEffect(() => {
const fn1 = function (event: Event) {
if ((event as MouseEvent).ctrlKey === true || (event as MouseEvent).metaKey) {
event.preventDefault();
}
};
const fn2 = function (event: Event) {
if ((event as MouseEvent).ctrlKey === true || (event as MouseEvent).metaKey) {
event.preventDefault();
}
};
window.addEventListener('mousewheel', fn1, { passive: false });
//firefox
window.addEventListener('DOMMouseScroll', fn2, { passive: false });
return () => {
window.removeEventListener('mousewheel', fn1);
window.removeEventListener('mousewheel', fn2);
};
}, []);
return [state];
}
/**
*
* eventMap与eventCenter
* @export
* @param {ComponentRenderConfigProps} props render参数传来的
* @param {string} eventName
* @returns
*/
export function useDynamicAddEventCenter(
props: ComponentRenderConfigProps,
eventName: string,
displayName: string
) {
const eventCenter = useMemo(() => {
return props.config.getEventCenter();
}, [props.config]);
useEffect(() => {
const data = props.store.getData();
const map = props.data.eventMap;
const storeItem = data.block.find((v) => v.id === props.data.id);
if (storeItem) {
if (!map[eventName]) {
//动态store加属性需要通过hook
storeItem.eventMap[eventName] = {
arr: [],
displayName,
userSelect: [],
};
eventCenter.manualUpdateMap(eventName, displayName);
}
}
}, [eventCenter, props.data.eventMap, props.data.id, props.store]);
return;
}