import * as React from 'react'; import { Box, Input, Radio } from '@alifd/next'; import { BehaviorActionProps, BehaviorAction } from '../types'; const findReact = (id: string, traverseUp = 0) => { const dom = document.querySelector(`#${id}`); if (!dom) return; const key = Object.keys(dom).find((item) => { return ( item.startsWith('__reactFiber$') || // react 17+ item.startsWith('__reactInternalInstance$') ); // react <17 }); const domFiber = dom[key]; if (domFiber == null) return null; // react <16 if (domFiber._currentElement) { let compFiber = domFiber._currentElement._owner; for (let i = 0; i < traverseUp; i++) { compFiber = compFiber._currentElement._owner; } return compFiber._instance; } // react 16+ const GetCompFiber = (fiber) => { // return fiber._debugOwner; // this also works, but is __DEV__ only let parentFiber = fiber.return; while (typeof parentFiber.type === 'string') { parentFiber = parentFiber.return; } return parentFiber; }; let compFiber = GetCompFiber(domFiber); for (let i = 0; i < traverseUp; i++) { compFiber = GetCompFiber(compFiber); } return compFiber.stateNode; } interface TooltipActionValue { content?: string; triggerType?: 'click' | 'hover'; } interface TooltipActionOptions { id: string; } const TooltipActionContent: React.FC> = ({ value = {}, onChange, }) => { return ( 触发方式 { onChange({ ...value, triggerType, }); }} /> 通知内容 { onChange({ ...value, content, }); }} /> ); }; export const tooltipBehaviorAction: BehaviorAction = { name: 'tooltip', title: 'Tooltip', render: (props) => , toActionValue: (value, options) => ({ type: 'JSExpression', value: `function() { const id = '${options.id}'; const findReact = ${findReact}; const node = findReact(id); if (!node) return; if (typeof node.enableTooltip === 'function') { node.enableTooltip('${value.triggerType}', '${value.content}'); } else if (typeof node.toggleTip === 'function') { node.toggleTip('${value.content}'); } }`, }), };