UNPKG

ttk-app-core

Version:

@ttk/recat enterprise develop framework

92 lines (87 loc) 3.38 kB
import React, { useCallback, useState } from 'react' import './style.less' export default React.memo(Page) /** * * @props.menuWidth 菜单栏宽度(默认200) * @props.minMenuWidth 菜单栏最小宽度(默认160),限制拖动的参数 * @props.maxMenuWidth 菜单栏最大宽度(默认800),限制拖动的参数 * @props.layout 布局模式, 默认普通模式、horizontal水平模式、vertical垂直模式 * @props.withTabbar 是否需要Tabbar标签条 * @props.header 布局的header内容 * @props.tabbar 标签条内容 * @props.aside 菜单栏内容 */ function Page(props) { let [menuWidth, setMenuWidth] = useState(props.menuWidth || 200) const minMenuWidth = props.minMenuWidth || 160 const maxMenuWidth = props.maxMenuWidth || 800 const layout = props.layout || '' const withTabbar = props.withTabbar === false ? false : true const className = [ 'app-portal', `app-portal-layout${layout ? '-' + layout : ''}`, `${withTabbar ? '' : 'no-tabbar'}` ].join(' ') let splitting = false // 正在拖拽 const splitMouseDown = useCallback(() => { splitting = true // 拖拽时,禁止选中文字,避免浏览器拖拽选中文字的影响 window.getSelection?window.getSelection().removeAllRanges():document.selection.empty() }, []) const splitMouseMove = useCallback((e) => { if (splitting) { // 拖拽时,禁止选中文字,避免浏览器拖拽选中文字的影响 window.getSelection?window.getSelection().removeAllRanges():document.selection.empty() if ((e.pageX + 10) <= minMenuWidth) { setMenuWidth(minMenuWidth) return false } else if ((e.pageX) >= maxMenuWidth) { setMenuWidth(maxMenuWidth) return false } setMenuWidth(e.pageX) } }, []) const splitMouseUp = useCallback(() => { if (splitting) { // 拖拽后的鼠标释放才出发resize事件 ##TAXCHAIN-4675 setTimeout(() => { // 拖拽后,触发window的onresize事件,以便datagrid和其他依赖onresize时间重新计算样式的组件进行样式更新 let ev = document.createEvent('Event') ev.initEvent('resize', true, true) window.dispatchEvent(ev) }, 0) } splitting = false }, []) // 右边内容区样式 let rightStyle = {left: menuWidth + 'px'} if (layout === 'horizontal') { rightStyle = {left: (menuWidth - 10) + 'px'} } else if(layout === 'vertical') { rightStyle = {} } // 拖拽条样式 let splitStyle = {left: (menuWidth - 10) + 'px'} if (layout === 'horizontal') { splitStyle = {left: (menuWidth - 20) + 'px', top: 0} } return ( <div className={className} onMouseUp={(e) => splitMouseUp(e)} onMouseMove={(e) => splitMouseMove(e)}> { layout !== 'horizontal' && <div className="header"> {props.header} </div>} { layout !== 'vertical' && <div className="aside" style={{width: (menuWidth - 20) + 'px'}}> {props.aside} <div className="layout-split-pane" style={splitStyle} onMouseDown={(e) => splitMouseDown(e)}></div> </div>} { withTabbar && <div className="tabbar" style={rightStyle}> {props.tabbar} </div>} <div className="content" style={rightStyle}> {props.children} </div> </div> ) }