From a81e49833d6493431fee44c3541a13e7f45be5a5 Mon Sep 17 00:00:00 2001 From: * <8> Date: Mon, 11 Apr 2022 11:04:30 +0800 Subject: [PATCH] Match-id-059b810a64127ac4b754b8a924dd931f129dafa2 --- .../src/components/ComponentInfo.tsx | 39 +++++++---- .../src/components/ComponentsInfo.less | 22 +++--- libs/extension/src/components/VTree.tsx | 16 ++++- libs/extension/src/panel/App.less | 9 ++- libs/extension/src/panel/App.tsx | 68 ++++++++++++++----- 5 files changed, 110 insertions(+), 44 deletions(-) diff --git a/libs/extension/src/components/ComponentInfo.tsx b/libs/extension/src/components/ComponentInfo.tsx index 80127470..10a1f637 100644 --- a/libs/extension/src/components/ComponentInfo.tsx +++ b/libs/extension/src/components/ComponentInfo.tsx @@ -4,6 +4,7 @@ import Debug from '../svgs/Debug'; import Copy from '../svgs/Copy'; import Triangle from '../svgs/Triangle'; import { useState } from 'horizon'; +import { IData } from './VTree'; type IComponentInfo = { name: string; @@ -12,7 +13,9 @@ type IComponentInfo = { context?: IAttr[]; state?: IAttr[]; hooks?: IAttr[]; - } + }; + parents: IData[]; + onClickParent: (item: IData) => void; }; type IAttr = { @@ -84,28 +87,38 @@ function ComponentAttr({ name, attrs }: { name: string, attrs: IAttr[] }) { ); } -export default function ComponentInfo({ name, attrs }: IComponentInfo) { +export default function ComponentInfo({ name, attrs, parents, onClickParent }: IComponentInfo) { const { state, props, context, hooks } = attrs; return (
- - {name} - - - - - - - + {name && <> + + {name} + + + + + + + + }
{context && } {props && } {state && } {hooks && } -
- rendered by +
+ {name &&
+ parents: { + parents.map(item => ()) + } +
}
diff --git a/libs/extension/src/components/ComponentsInfo.less b/libs/extension/src/components/ComponentsInfo.less index 3622363e..9a52e2fb 100644 --- a/libs/extension/src/components/ComponentsInfo.less +++ b/libs/extension/src/components/ComponentsInfo.less @@ -32,11 +32,11 @@ .componentInfoMain { overflow-y: auto; - :last-child { + >:last-child { border-bottom: unset; } - :first-child { + >:first-child { padding: unset; } @@ -57,15 +57,11 @@ .attrType { flex: 1 1 0; } - - .attrCopy { flex: 0 0 1rem; padding-right: 1rem; } } - - .attrDetail { padding-bottom: 0.5rem; @@ -84,9 +80,19 @@ } } } + } - .renderInfo { - flex: 1 1 0; + .parentsInfo { + flex: 1 1 0; + .parent { + display: block; + cursor: pointer; + text-align: left; + color: @component-name-color; + width: 100%; + &:hover { + background-color: @select-color; + } } } } diff --git a/libs/extension/src/components/VTree.tsx b/libs/extension/src/components/VTree.tsx index 044e64dc..a286e411 100644 --- a/libs/extension/src/components/VTree.tsx +++ b/libs/extension/src/components/VTree.tsx @@ -102,13 +102,20 @@ function VTree(props: { onRendered: (renderInfo: renderInfoType) => void, collapsedNodes?: IData[], onCollapseNode?: (item: IData[]) => void, + selectItem: IData[], + onSelectItem: (item: IData) => void, }) { - const { data, highlightValue, scrollToItem, onRendered, onCollapseNode } = props; + const { data, highlightValue, scrollToItem, onRendered, onCollapseNode, onSelectItem } = props; const [collapseNode, setCollapseNode] = useState(props.collapsedNodes || []); - const [selectItem, setSelectItem] = useState(scrollToItem); + const [selectItem, setSelectItem] = useState(props.selectItem); useEffect(() => { setSelectItem(scrollToItem); }, [scrollToItem]); + useEffect(() => { + if (props.selectItem !== selectItem) { + setSelectItem(props.selectItem); + } + }, [props.selectItem]); useEffect(() => { setCollapseNode(props.collapsedNodes || []); }, [props.collapsedNodes]); @@ -128,6 +135,9 @@ function VTree(props: { }; const handleClickItem = (item: IData) => { setSelectItem(item); + if (onSelectItem) { + onSelectItem(item); + } }; let currentCollapseIndentation: null | number = null; @@ -159,7 +169,7 @@ function VTree(props: { width={width} height={height} itemHeight={18} - scrollToItem={scrollToItem} + scrollToItem={selectItem} filter={filter} onRendered={onRendered} > diff --git a/libs/extension/src/panel/App.less b/libs/extension/src/panel/App.less index dc0da330..b974c557 100644 --- a/libs/extension/src/panel/App.less +++ b/libs/extension/src/panel/App.less @@ -7,6 +7,12 @@ font-size: @common-font-size; } +button { + border: none; + background: none; + padding: 0; +} + .left { flex: 7; display: flex; @@ -41,10 +47,7 @@ } .searchAction { - padding: 0; flex: 0 0 1rem; - border: none; - background: none; height: 1rem; color: @arrow-color; &:hover{ diff --git a/libs/extension/src/panel/App.tsx b/libs/extension/src/panel/App.tsx index dcc18a67..7cea62e9 100644 --- a/libs/extension/src/panel/App.tsx +++ b/libs/extension/src/panel/App.tsx @@ -34,23 +34,27 @@ const parseVNodeData = (rawData) => { return data; }; +const getParents = (item: IData | null, parsedVNodeData: IData[]) => { + const parents: IData[] = []; + if (item) { + const index = parsedVNodeData.indexOf(item); + let indentation = item.indentation; + for (let i = index; i >= 0; i--) { + const last = parsedVNodeData[i]; + const lastIndentation = last.indentation; + if (lastIndentation < indentation) { + parents.push(last); + indentation = lastIndentation; + } + } + } + return parents; +}; + function App() { const [parsedVNodeData, setParsedVNodeData] = useState([]); - const [componentInfo, setComponentInfo] = useState({ name: null, attrs: {} }); - - useEffect(() => { - if (isDev) { - const parsedData = parseVNodeData(mockParsedVNodeData); - setParsedVNodeData(parsedData); - setComponentInfo({ - name: 'Demo', - attrs: { - state: parsedMockState, - props: parsedMockState, - }, - }); - } - }, []); + const [componentAttrs, setComponentAttrs] = useState({}); + const [selectComp, setSelectComp] = useState(null); const { filterValue, @@ -65,13 +69,37 @@ function App() { setCollapsedNodes, } = FilterTree({ data: parsedVNodeData }); + useEffect(() => { + if (isDev) { + const parsedData = parseVNodeData(mockParsedVNodeData); + setParsedVNodeData(parsedData); + setComponentAttrs({ + state: parsedMockState, + props: parsedMockState, + }); + } + }, []); + const handleSearchChange = (str: string) => { setFilterValue(str); }; + const handleSelectComp = (item: IData) => { + setComponentAttrs({ + state: parsedMockState, + props: parsedMockState, + }); + setSelectComp(item); + }; + + const handleClickParent = (item: IData) => { + setSelectComp(item); + }; + const onRendered = (info) => { setShowItems(info.visibleItems); }; + const parents = getParents(selectComp, parsedVNodeData); return (
@@ -99,11 +127,17 @@ function App() { onRendered={onRendered} collapsedNodes={collapsedNodes} onCollapseNode={setCollapsedNodes} - scrollToItem={currentItem} /> + scrollToItem={currentItem} + selectItem={selectComp} + onSelectItem={handleSelectComp} />
- +
);