feat: add react render
This commit is contained in:
parent
c7763cddc3
commit
b8b649e694
@ -16,8 +16,10 @@
|
|||||||
"@emotion/react": "^11.14.0",
|
"@emotion/react": "^11.14.0",
|
||||||
"@emotion/styled": "^11.14.0",
|
"@emotion/styled": "^11.14.0",
|
||||||
"@mui/material": "^7.0.1",
|
"@mui/material": "^7.0.1",
|
||||||
|
"re-resizable": "^6.11.2",
|
||||||
"react": "19.1.0",
|
"react": "19.1.0",
|
||||||
"react-dom": "19.1.0",
|
"react-dom": "19.1.0",
|
||||||
|
"react-draggable": "^4.4.6",
|
||||||
"react-hook-form": "^7.55.0"
|
"react-hook-form": "^7.55.0"
|
||||||
},
|
},
|
||||||
"exports": {
|
"exports": {
|
||||||
|
65
src/drag-modal/index.tsx
Normal file
65
src/drag-modal/index.tsx
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
import { useRef } from 'react';
|
||||||
|
import Draggable from 'react-draggable';
|
||||||
|
import { clsxMerge } from '../clsx';
|
||||||
|
import { Resizable } from 're-resizable';
|
||||||
|
|
||||||
|
type DragModalProps = {
|
||||||
|
title?: React.ReactNode;
|
||||||
|
content?: React.ReactNode;
|
||||||
|
onClose?: () => void;
|
||||||
|
containerClassName?: string;
|
||||||
|
handleClassName?: string;
|
||||||
|
contentClassName?: string;
|
||||||
|
/**
|
||||||
|
* 默认大小, 单位为px
|
||||||
|
* width: defaultSize.width || 320
|
||||||
|
* height: defaultSize.height || 400
|
||||||
|
*/
|
||||||
|
defaultSize?: {
|
||||||
|
width: number;
|
||||||
|
height: number;
|
||||||
|
};
|
||||||
|
style?: React.CSSProperties;
|
||||||
|
};
|
||||||
|
export const DragModal = (props: DragModalProps) => {
|
||||||
|
const dragRef = useRef<HTMLDivElement>(null);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Draggable
|
||||||
|
nodeRef={dragRef as any}
|
||||||
|
onStop={(e, data) => {
|
||||||
|
console.log(e, data);
|
||||||
|
}}
|
||||||
|
handle='.handle'
|
||||||
|
grid={[1, 1]}
|
||||||
|
scale={1}
|
||||||
|
bounds='parent'
|
||||||
|
defaultPosition={{
|
||||||
|
x: 0,
|
||||||
|
y: 0,
|
||||||
|
}}>
|
||||||
|
<div
|
||||||
|
className={clsxMerge('absolute top-0 left-0 bg-white rounded-md border border-gray-200 shadow-sm', props.containerClassName)}
|
||||||
|
ref={dragRef}
|
||||||
|
style={props.style}>
|
||||||
|
<div className={clsxMerge('handle cursor-move border-b border-gray-200 py-2 px-4', props.handleClassName)}>{props.title || 'Move'}</div>
|
||||||
|
<Resizable
|
||||||
|
className={clsxMerge('', props.contentClassName)}
|
||||||
|
defaultSize={{
|
||||||
|
width: props.defaultSize?.width || 600,
|
||||||
|
height: props.defaultSize?.height || 400,
|
||||||
|
}}
|
||||||
|
onResizeStop={(e, direction, ref, d) => {
|
||||||
|
// console.log(e, direction, ref, d);
|
||||||
|
}}
|
||||||
|
enable={{
|
||||||
|
bottom: true,
|
||||||
|
right: true,
|
||||||
|
bottomRight: true,
|
||||||
|
}}>
|
||||||
|
{props.content}
|
||||||
|
</Resizable>
|
||||||
|
</div>
|
||||||
|
</Draggable>
|
||||||
|
);
|
||||||
|
};
|
40
src/render/ReactRender.tsx
Normal file
40
src/render/ReactRender.tsx
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import { createRoot } from 'react-dom/client';
|
||||||
|
|
||||||
|
export class ReactRenderer {
|
||||||
|
component: any;
|
||||||
|
element: HTMLElement;
|
||||||
|
ref: React.RefObject<any>;
|
||||||
|
props: any;
|
||||||
|
root: any;
|
||||||
|
|
||||||
|
constructor(component: any, { props }: any) {
|
||||||
|
this.component = component;
|
||||||
|
this.element = document.createElement('div');
|
||||||
|
this.ref = React.createRef();
|
||||||
|
this.props = {
|
||||||
|
...props,
|
||||||
|
ref: this.ref,
|
||||||
|
};
|
||||||
|
this.root = createRoot(this.element);
|
||||||
|
this.render();
|
||||||
|
}
|
||||||
|
|
||||||
|
updateProps(props: any) {
|
||||||
|
this.props = {
|
||||||
|
...this.props,
|
||||||
|
...props,
|
||||||
|
};
|
||||||
|
this.render();
|
||||||
|
}
|
||||||
|
|
||||||
|
render() {
|
||||||
|
this.root.render(React.createElement(this.component, this.props));
|
||||||
|
}
|
||||||
|
|
||||||
|
destroy() {
|
||||||
|
this.root.unmount();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default ReactRenderer;
|
Loading…
x
Reference in New Issue
Block a user