Match-id-059b810a64127ac4b754b8a924dd931f129dafa2

This commit is contained in:
* 2022-04-11 11:04:30 +08:00 committed by *
parent 64a78f34ba
commit a81e49833d
5 changed files with 110 additions and 44 deletions

View File

@ -4,6 +4,7 @@ import Debug from '../svgs/Debug';
import Copy from '../svgs/Copy'; import Copy from '../svgs/Copy';
import Triangle from '../svgs/Triangle'; import Triangle from '../svgs/Triangle';
import { useState } from 'horizon'; import { useState } from 'horizon';
import { IData } from './VTree';
type IComponentInfo = { type IComponentInfo = {
name: string; name: string;
@ -12,7 +13,9 @@ type IComponentInfo = {
context?: IAttr[]; context?: IAttr[];
state?: IAttr[]; state?: IAttr[];
hooks?: IAttr[]; hooks?: IAttr[];
} };
parents: IData[];
onClickParent: (item: IData) => void;
}; };
type IAttr = { 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; const { state, props, context, hooks } = attrs;
return ( return (
<div className={styles.infoContainer} > <div className={styles.infoContainer} >
<div className={styles.componentInfoHead}> <div className={styles.componentInfoHead}>
<span className={styles.name}> {name && <>
{name} <span className={styles.name}>
</span> {name}
<span className={styles.eye} > </span>
<Eye /> <span className={styles.eye} >
</span> <Eye />
<span className={styles.debug}> </span>
<Debug /> <span className={styles.debug}>
</span> <Debug />
</span>
</>}
</div> </div>
<div className={styles.componentInfoMain}> <div className={styles.componentInfoMain}>
{context && <ComponentAttr name={'context'} attrs={context} />} {context && <ComponentAttr name={'context'} attrs={context} />}
{props && <ComponentAttr name={'props'} attrs={props} />} {props && <ComponentAttr name={'props'} attrs={props} />}
{state && <ComponentAttr name={'state'} attrs={state} />} {state && <ComponentAttr name={'state'} attrs={state} />}
{hooks && <ComponentAttr name={'hook'} attrs={hooks} />} {hooks && <ComponentAttr name={'hook'} attrs={hooks} />}
<div className={styles.renderInfo}> <div className={styles.parentsInfo}>
rendered by {name && <div>
parents: {
parents.map(item => (<button
className={styles.parent}
onClick={() => (onClickParent(item))}>
{item.name}
</button>))
}
</div>}
</div> </div>
</div> </div>
</div> </div>

View File

@ -32,11 +32,11 @@
.componentInfoMain { .componentInfoMain {
overflow-y: auto; overflow-y: auto;
:last-child { >:last-child {
border-bottom: unset; border-bottom: unset;
} }
:first-child { >:first-child {
padding: unset; padding: unset;
} }
@ -57,15 +57,11 @@
.attrType { .attrType {
flex: 1 1 0; flex: 1 1 0;
} }
.attrCopy { .attrCopy {
flex: 0 0 1rem; flex: 0 0 1rem;
padding-right: 1rem; padding-right: 1rem;
} }
} }
.attrDetail { .attrDetail {
padding-bottom: 0.5rem; padding-bottom: 0.5rem;
@ -84,9 +80,19 @@
} }
} }
} }
}
.renderInfo { .parentsInfo {
flex: 1 1 0; flex: 1 1 0;
.parent {
display: block;
cursor: pointer;
text-align: left;
color: @component-name-color;
width: 100%;
&:hover {
background-color: @select-color;
}
} }
} }
} }

View File

@ -102,13 +102,20 @@ function VTree(props: {
onRendered: (renderInfo: renderInfoType<IData>) => void, onRendered: (renderInfo: renderInfoType<IData>) => void,
collapsedNodes?: IData[], collapsedNodes?: IData[],
onCollapseNode?: (item: IData[]) => void, 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 [collapseNode, setCollapseNode] = useState(props.collapsedNodes || []);
const [selectItem, setSelectItem] = useState(scrollToItem); const [selectItem, setSelectItem] = useState(props.selectItem);
useEffect(() => { useEffect(() => {
setSelectItem(scrollToItem); setSelectItem(scrollToItem);
}, [scrollToItem]); }, [scrollToItem]);
useEffect(() => {
if (props.selectItem !== selectItem) {
setSelectItem(props.selectItem);
}
}, [props.selectItem]);
useEffect(() => { useEffect(() => {
setCollapseNode(props.collapsedNodes || []); setCollapseNode(props.collapsedNodes || []);
}, [props.collapsedNodes]); }, [props.collapsedNodes]);
@ -128,6 +135,9 @@ function VTree(props: {
}; };
const handleClickItem = (item: IData) => { const handleClickItem = (item: IData) => {
setSelectItem(item); setSelectItem(item);
if (onSelectItem) {
onSelectItem(item);
}
}; };
let currentCollapseIndentation: null | number = null; let currentCollapseIndentation: null | number = null;
@ -159,7 +169,7 @@ function VTree(props: {
width={width} width={width}
height={height} height={height}
itemHeight={18} itemHeight={18}
scrollToItem={scrollToItem} scrollToItem={selectItem}
filter={filter} filter={filter}
onRendered={onRendered} onRendered={onRendered}
> >

View File

@ -7,6 +7,12 @@
font-size: @common-font-size; font-size: @common-font-size;
} }
button {
border: none;
background: none;
padding: 0;
}
.left { .left {
flex: 7; flex: 7;
display: flex; display: flex;
@ -41,10 +47,7 @@
} }
.searchAction { .searchAction {
padding: 0;
flex: 0 0 1rem; flex: 0 0 1rem;
border: none;
background: none;
height: 1rem; height: 1rem;
color: @arrow-color; color: @arrow-color;
&:hover{ &:hover{

View File

@ -34,23 +34,27 @@ const parseVNodeData = (rawData) => {
return data; 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() { function App() {
const [parsedVNodeData, setParsedVNodeData] = useState([]); const [parsedVNodeData, setParsedVNodeData] = useState([]);
const [componentInfo, setComponentInfo] = useState({ name: null, attrs: {} }); const [componentAttrs, setComponentAttrs] = useState({});
const [selectComp, setSelectComp] = useState(null);
useEffect(() => {
if (isDev) {
const parsedData = parseVNodeData(mockParsedVNodeData);
setParsedVNodeData(parsedData);
setComponentInfo({
name: 'Demo',
attrs: {
state: parsedMockState,
props: parsedMockState,
},
});
}
}, []);
const { const {
filterValue, filterValue,
@ -65,13 +69,37 @@ function App() {
setCollapsedNodes, setCollapsedNodes,
} = FilterTree({ data: parsedVNodeData }); } = FilterTree({ data: parsedVNodeData });
useEffect(() => {
if (isDev) {
const parsedData = parseVNodeData(mockParsedVNodeData);
setParsedVNodeData(parsedData);
setComponentAttrs({
state: parsedMockState,
props: parsedMockState,
});
}
}, []);
const handleSearchChange = (str: string) => { const handleSearchChange = (str: string) => {
setFilterValue(str); setFilterValue(str);
}; };
const handleSelectComp = (item: IData) => {
setComponentAttrs({
state: parsedMockState,
props: parsedMockState,
});
setSelectComp(item);
};
const handleClickParent = (item: IData) => {
setSelectComp(item);
};
const onRendered = (info) => { const onRendered = (info) => {
setShowItems(info.visibleItems); setShowItems(info.visibleItems);
}; };
const parents = getParents(selectComp, parsedVNodeData);
return ( return (
<div className={styles.app}> <div className={styles.app}>
@ -99,11 +127,17 @@ function App() {
onRendered={onRendered} onRendered={onRendered}
collapsedNodes={collapsedNodes} collapsedNodes={collapsedNodes}
onCollapseNode={setCollapsedNodes} onCollapseNode={setCollapsedNodes}
scrollToItem={currentItem} /> scrollToItem={currentItem}
selectItem={selectComp}
onSelectItem={handleSelectComp} />
</div> </div>
</div> </div>
<div className={styles.right}> <div className={styles.right}>
<ComponentInfo name={componentInfo.name} attrs={componentInfo.attrs} /> <ComponentInfo
name={selectComp ? selectComp.name: null}
attrs={selectComp ? componentAttrs: {}}
parents={parents}
onClickParent={handleClickParent} />
</div> </div>
</div> </div>
); );