feat(component): 添加组件预览功能
- 在添加组件弹窗中集成组件预览模块 - 新增 CompReview 组件用于展示组件设计数据 - 调整组件市场复制接口路径至 componentBase - 优化组件预览样式与布局结构 - 支持组件输入输出参数的动态渲染 - 增加无参数时的占位提示信息master
parent
0ec49e8907
commit
c0555b56fb
@ -0,0 +1,91 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import styles from './style/compReview.module.less';
|
||||||
|
|
||||||
|
const CompReview = ({ componentDesignData }) => {
|
||||||
|
console.log('componentDesignData:', componentDesignData);
|
||||||
|
|
||||||
|
// 确保数据是数组格式
|
||||||
|
const dataArray = Array.isArray(componentDesignData) ? componentDesignData :
|
||||||
|
componentDesignData ? [componentDesignData] : [];
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className={styles['comp-review-container']}>
|
||||||
|
<div className={styles['comp-review-header']}>
|
||||||
|
<div className={styles['comp-review-title']}>组件预览</div>
|
||||||
|
</div>
|
||||||
|
<div className={styles['comp-review-body']}>
|
||||||
|
<div className={styles['comp-review-content']}>
|
||||||
|
{/* 上方内容 - 根据数组长度渲染 */}
|
||||||
|
<div className={styles['comp-review-top']}>
|
||||||
|
{dataArray.map((data, index) => (
|
||||||
|
<div key={data.key || data.id || index} className={styles['comp-review-item']}>
|
||||||
|
<div className={styles['comp-review-name']}>{data.ident}</div>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* 输入输出部分 - 根据数组长度渲染 */}
|
||||||
|
<div className={styles['comp-review-io']}>
|
||||||
|
{/* 输入部分 */}
|
||||||
|
<div className={styles['comp-review-input']}>
|
||||||
|
<div className={styles['comp-review-io-label']}>input</div>
|
||||||
|
<div className={styles['comp-review-io-items']}>
|
||||||
|
{dataArray.map((data, index) => {
|
||||||
|
// 确保参数始终是数组格式
|
||||||
|
const parameters = Array.isArray(data.parameters) ? data.parameters :
|
||||||
|
(data.parameters ? [data.parameters] : []);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div key={data.key || data.id || index}>
|
||||||
|
{parameters.length > 0 ? (
|
||||||
|
parameters.map((param, paramIndex) => (
|
||||||
|
<div key={paramIndex} className={styles['comp-review-io-item']}>
|
||||||
|
{param.ident} {param.type}
|
||||||
|
</div>
|
||||||
|
))
|
||||||
|
) : (
|
||||||
|
<div className={styles['comp-review-io-placeholder']}>
|
||||||
|
无输入参数
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
})}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* 输出部分 */}
|
||||||
|
<div className={styles['comp-review-output']}>
|
||||||
|
<div className={styles['comp-review-io-label']}>output</div>
|
||||||
|
<div className={styles['comp-review-io-items']}>
|
||||||
|
{dataArray.map((data, index) => {
|
||||||
|
// 确保响应始终是数组格式
|
||||||
|
const responses = Array.isArray(data.responses) ? data.responses :
|
||||||
|
(data.responses ? [data.responses] : []);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div key={data.key || data.id || index}>
|
||||||
|
{responses.length > 0 ? (
|
||||||
|
responses.map((response, responseIndex) => (
|
||||||
|
<div key={responseIndex} className={styles['comp-review-io-item']}>
|
||||||
|
{response.type} {response.ident}
|
||||||
|
</div>
|
||||||
|
))
|
||||||
|
) : (
|
||||||
|
<div className={styles['comp-review-io-placeholder']}>
|
||||||
|
无输出参数
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
})}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default CompReview;
|
||||||
@ -0,0 +1,94 @@
|
|||||||
|
.comp-review-container {
|
||||||
|
width: 300px;
|
||||||
|
border-radius: 8px;
|
||||||
|
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.comp-review-header {
|
||||||
|
background-color: #FFA500;
|
||||||
|
color: white;
|
||||||
|
padding: 8px 12px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.comp-review-icon {
|
||||||
|
font-size: 16px;
|
||||||
|
margin-right: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.comp-review-title {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.comp-review-actions {
|
||||||
|
font-size: 12px;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
.comp-review-body {
|
||||||
|
background-color: white;
|
||||||
|
padding: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.comp-review-content {
|
||||||
|
border-radius: 4px;
|
||||||
|
padding: 8px;
|
||||||
|
min-height: 120px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.comp-review-top {
|
||||||
|
margin-bottom: 12px;
|
||||||
|
border-bottom: 1px solid #ebeef5;
|
||||||
|
}
|
||||||
|
|
||||||
|
.comp-review-name {
|
||||||
|
font-weight: bold;
|
||||||
|
margin-bottom: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.comp-review-desc {
|
||||||
|
color: #666;
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.comp-review-io {
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.comp-review-input,
|
||||||
|
.comp-review-output {
|
||||||
|
flex: 1;
|
||||||
|
padding: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.comp-review-output {
|
||||||
|
border-right: none;
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
.comp-review-io-label {
|
||||||
|
font-weight: bold;
|
||||||
|
margin-bottom: 4px;
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.comp-review-io-items {
|
||||||
|
margin-top: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.comp-review-io-item {
|
||||||
|
margin-bottom: 4px;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.comp-review-io-placeholder {
|
||||||
|
color: #999;
|
||||||
|
font-size: 12px;
|
||||||
|
text-align: center;
|
||||||
|
padding: 8px 0;
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue