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} />
-
+
);