diff --git a/src/AsanyEditor.tsx b/src/AsanyEditor.tsx index 6af0add..bbf49b1 100644 --- a/src/AsanyEditor.tsx +++ b/src/AsanyEditor.tsx @@ -1,4 +1,4 @@ -import { useState } from 'react'; +import { useImperativeHandle, useState } from 'react'; import React, { ComponentType, useCallback, useEffect, useReducer } from 'react'; import { isElement, isValidElementType } from 'react-is'; @@ -12,9 +12,9 @@ import { AsanyProvider } from './AsanyContext'; import { ActionType } from './reducers/actions'; import RuntimeContainer from './RuntimeContainer'; import Toolbar from './components/toolbar/Toolbar'; -import { useDispatch, useSelector } from './hooks'; +import { useDispatch, useEditor, useSelector } from './hooks'; import DefaultLoadingComponent, { LoadingComponentProps } from './components/scena/LoadingComponent'; -import { AsanyProject, EditorPlugin, WorkspaceProps } from './typings'; +import { AsanyProject, EditorPlugin, IAsanyEditor, WorkspaceProps } from './typings'; import './icons'; import './style/tailwind.css'; @@ -29,14 +29,10 @@ interface AsanyProps { children?: React.ReactNode; } -function Editor({ - className, - onSave, - container, - loading: LoadingComponent = DefaultLoadingComponent, - children, - ...props -}: AsanyProps) { +const Editor = React.forwardRef(function Editor( + { className, onSave, container, loading: LoadingComponent = DefaultLoadingComponent, children, ...props }: AsanyProps, + ref?: React.ForwardedRef +) { const dispatch = useDispatch(); const [offsetLeft, setOffsetLeft] = useState(0); @@ -73,6 +69,10 @@ function Editor({ setOffsetLeft(x); }, []); + const api = useEditor(); + + useImperativeHandle(ref, () => api); + return (
@@ -100,7 +100,7 @@ function Editor({
); -} +}); interface AsanyWarpperProps { className?: string; @@ -114,7 +114,7 @@ interface AsanyWarpperProps { children?: React.ReactNode; } -export default function AsanyEditor(props: AsanyWarpperProps) { +function AsanyEditor(props: AsanyWarpperProps, ref?: React.ForwardedRef) { const { children, project, onSave, onBack, container = RuntimeContainer, plugins = [], loading, className } = props; const [version, forceRender] = useReducer((s) => s + 1, 0); useEffect(() => { @@ -123,11 +123,14 @@ export default function AsanyEditor(props: AsanyWarpperProps) { } forceRender(); }, [project]); + return ( - + {children} ); } + +export default React.forwardRef(AsanyEditor); diff --git a/stories/Layout.stories.tsx b/stories/Layout.stories.tsx index ad6ba5a..cb5a7f9 100644 --- a/stories/Layout.stories.tsx +++ b/stories/Layout.stories.tsx @@ -1,8 +1,8 @@ -import React from 'react'; +import React, { useEffect, useRef } from 'react'; import { Meta, Story } from '@storybook/react'; import { DndProvider } from 'react-dnd'; import { HTML5Backend } from 'react-dnd-html5-backend'; -import AsanyEditor from '../src'; +import AsanyEditor, { IAsanyEditor } from '../src'; import DemoPlugin from './editors/demo'; @@ -18,18 +18,23 @@ const meta: Meta = { export default meta; const Template: Story = (_args) => { + const api = useRef(null); + + useEffect(() => { + setTimeout(() => { + api.current?.features.ruler(false); + }, 5000); + }, []); + return ( console.log(data)} project={{ id: 'test', - name: ( -
- 项目名称展示区域 -
- ) as any, + name: (
项目名称展示区域
) as any, type: 'demo', data: { id: '111',