import React, { HTMLAttributes, useContext, useState } from 'react'; import styled from 'styled-components'; import { CSSTransition } from 'react-transition-group'; import { menuCtx } from './Menu '; import { common, nodeList } from './common'; export interface SubMenuProps extends HTMLAttributes { label?: string; children?: React.ReactNode; } type PropsStyled = { needBorder: boolean; }; const SubMenuStyled = styled.div` .my-node-enter { opacity: 0; } .my-node-enter-active { opacity: 1; transition: opacity 400ms; } .my-node-exit { opacity: 1; } .my-node-exit-active { opacity: 0; transition: opacity 400ms; } position: relative; > .wrap { position: absolute; top: 50%; left: 50%; transform: translateY(-8px); display: flex; flex-direction: column; gap: 10px; > .content { min-width: 150px; background-color: #fff; transform: translateX(-25%); box-shadow: ${(props: PropsStyled) => props.needBorder ? '0 0 2px 1px rgba(0, 0,0,.2)' : 'none'}; } > .label { cursor: pointer; white-space: nowrap; } } `; const SubMenu: React.FC = (props) => { const { children, label, ...rest } = props; const { setOrder } = useContext(menuCtx); const needBorder = children instanceof Array; const [enter, setEnter] = useState(false); const getOrder = (e: React.MouseEvent) => common(setOrder)(e); const render = () => { const { labelNode, otherNode } = nodeList(children); console.log(otherNode); return ( <> {labelNode} ) => getOrder(e)} > {otherNode} > ); }; render(); return ( setEnter(true)} onMouseOut={() => { setEnter(false); }} > {render()} ); }; SubMenu.defaultProps = { label: '导航', children: '' }; export default SubMenu;