Skip to main content Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
直接コマンドでは確認用 Prompt が省略されます。実行前にソースを確認してください。
npx skills add https://github.com/microwind/ai-skills --skill reactコマンドは1行のまま表示されます。コピー前に横へスクロールして全体を確認してください。
ローカルで確認しますか?SkillsMP が現在取得できるファイルをダウンロードできます。
| name | React组件最佳实践 |
| description | 当开发React组件时,设计组件架构,实现状态管理,优化性能。处理组件通信,实现复用逻辑,和最佳实践应用。 |
| license | MIT |
React组件最佳实践技能
概述
React组件开发是前端开发的核心技能。不当的组件设计会导致代码重复、性能问题、维护困难。需要系统性的组件设计和优化方法。
核心原则: 好的React组件应该单一职责、可复用、可测试、性能优良。坏的组件会职责混乱、难以复用、测试困难、性能低下。
何时使用
始终:
- 设计新组件时
- 重构现有组件时
- 优化组件性能时
- 处理组件通信时
- 实现复用逻辑时
- 测试组件功能时
触发短语:
- "React组件最佳实践"
- "组件设计模式"
- "状态管理策略"
- "组件性能优化"
- "组件通信方案"
- "复用逻辑实现"
React组件功能
组件设计
- 单一职责原则
- 组件层次结构
- 接口设计规范
- 可复用性设计
- 可测试性考虑
状态管理
- 本地状态管理
- 全局状态方案
- 状态提升策略
- 状态同步处理
- 状态持久化
性能优化
- 渲染优化
- 内存管理
- 组件懒加载
- 虚拟化处理
- 防抖节流
组件通信
- 属性传递
- 回调函数
- Context API
- 状态管理库
- 事件总线
常见React组件问题
组件职责混乱
问题:
组件承担过多职责,代码复杂难维护
错误示例:
- 一个组件处理UI、业务逻辑、数据获取
- 组件内部包含过多不相关的功能
- 组件依赖过多外部状态
- 组件接口设计不合理
解决方案:
1. 遵循单一职责原则
2. 拆分复杂组件
3. 提取业务逻辑
4. 设计清晰的组件接口
性能问题
问题:
组件渲染性能差,用户体验不佳
错误示例:
- 不必要的重新渲染
- 缺少React.memo优化
- 状态更新过于频繁
- 大量DOM操作
解决方案:
1. 使用React.memo优化
2. 合理使用useMemo和useCallback
3. 优化状态更新策略
4. 减少不必要的渲染
状态管理混乱
问题:
组件状态管理复杂,数据流不清晰
错误示例:
- 状态分散在各个组件
- 状态同步困难
- 状态更新逻辑混乱
- 缺少统一的状态管理
解决方案:
1. 使用合适的状态管理方案
2. 明确数据流向
3. 统一状态更新逻辑
4. 实现状态持久化
组件复用困难
问题:
组件难以复用,代码重复严重
错误示例:
- 组件耦合度过高
- 缺少抽象层
- 配置不够灵活
- 硬编码过多
解决方案:
1. 降低组件耦合度
2. 提取公共逻辑
3. 增强组件配置性
4. 使用高阶组件和Hook
代码实现示例
React组件设计器
import re
from typing import Dict, Any, List, Optional, Tuple
from dataclasses import dataclass
from enum import Enum
class ComponentType(Enum):
"""组件类型"""
FUNCTIONAL = "functional"
CLASS = "class"
HOC = "hoc"
CUSTOM_HOOK = "custom_hook"
class StateManagementType(Enum):
"""状态管理类型"""
LOCAL_STATE = "local_state"
CONTEXT = "context"
REDUX = "redux"
MOBX = "mobx"
ZUSTAND = "zustand"
@dataclass
class ComponentSpec:
"""组件规格"""
name: str
type: ComponentType
props: List[Dict[str, Any]]
state: List[Dict[str, Any]]
methods: List[Dict[str, Any]]
lifecycle: List[str]
dependencies: List[str]
@dataclass
:
use_memo: []
use_callback: []
memo_wrap:
lazy_load:
virtualize:
:
():
.component_templates = {}
.optimization_strategies = {}
() -> :
spec. == ComponentType.FUNCTIONAL:
component_code = ._generate_functional_component(spec, state_management, performance_config)
spec. == ComponentType.CLASS:
component_code = ._generate_class_component(spec, state_management, performance_config)
:
ValueError()
component_code
() -> :
imports = ._generate_imports(spec, state_management, performance_config)
component_lines = []
spec.props:
props_interface = ._generate_props_interface(spec.props)
component_lines.append(props_interface)
component_lines.append() spec.props )
hook_imports = ._generate_hook_imports(state_management, performance_config)
component_lines.extend(hook_imports)
state_definitions = ._generate_state_definitions(spec.state, state_management)
component_lines.extend(state_definitions)
performance_config:
optimizations = ._generate_performance_optimizations(performance_config, spec)
component_lines.extend(optimizations)
event_handlers = ._generate_event_handlers(spec.methods)
component_lines.extend(event_handlers)
effects = ._generate_effects(spec.lifecycle, spec.state, spec.dependencies)
component_lines.extend(effects)
render_logic = ._generate_render_logic(spec)
component_lines.extend(render_logic)
component_lines.append()
performance_config performance_config.memo_wrap:
component_lines.append()
:
component_lines.append()
.join([imports] + component_lines)
() -> :
imports = ._generate_imports(spec, state_management, performance_config)
component_lines = []
spec.props:
props_interface = ._generate_props_interface(spec.props)
component_lines.append(props_interface)
component_lines.append()
spec.state:
constructor = ._generate_constructor(spec.state)
component_lines.append(constructor)
lifecycle_methods = ._generate_lifecycle_methods(spec.lifecycle, spec.state, spec.dependencies)
component_lines.extend(lifecycle_methods)
event_handlers = ._generate_class_methods(spec.methods)
component_lines.extend(event_handlers)
render_method = ._generate_class_render(spec)
component_lines.append(render_method)
component_lines.append()
component_lines.append()
.join([imports] + component_lines)
() -> :
imports = []
state_management == StateManagementType.CONTEXT:
imports.append()
state_management == StateManagementType.REDUX:
imports.extend([])
state_management == StateManagementType.ZUSTAND:
imports.append()
performance_config:
performance_config.use_memo performance_config.use_callback:
imports.append()
performance_config.lazy_load:
imports.append()
performance_config.virtualize:
imports.append()
.join(imports)
() -> :
interface_lines = []
prop props:
prop_name = prop[]
prop_type = prop[]
optional = prop.get(, )
default_value = prop.get(, )
optional_mark = optional
line =
default_value :
line +=
interface_lines.append(line)
interface_lines.append()
.join(interface_lines)
() -> []:
imports = []
imports.append()
imports.append()
state_management == StateManagementType.CONTEXT:
imports.append()
state_management == StateManagementType.REDUX:
imports.append()
imports.append()
state_management == StateManagementType.ZUSTAND:
imports.append()
imports
() -> []:
definitions = []
state_spec state_specs:
state_name = state_spec[]
state_type = state_spec[]
initial_value = state_spec.get(, )
initial_value :
definition =
:
definition =
definitions.append(definition)
definitions
() -> []:
optimizations = []
memo_item config.use_memo:
optimizations.append()
optimizations.append()
optimizations.append()
optimizations.append()
callback_item config.use_callback:
optimizations.append()
optimizations.append()
optimizations.append()
optimizations
() -> []:
handlers = []
method methods:
method_name = method[]
method_params = method.get(, [])
method_body = method.get(, )
params_str = .join(method_params)
handlers.append()
handlers.append()
handlers.append()
handlers
() -> []:
effects = []
lifecycle lifecycle:
effects.append()
effects.append()
effects.append()
effects.append()
state_spec state:
state_name = state_spec[]
effects.append()
effects.append()
effects.append()
effects.append()
effects
() -> []:
render_lines = []
render_lines.append()
render_lines.append()
prop spec.props:
prop_name = prop[]
render_lines.append()
state_spec spec.state:
state_name = state_spec[]
render_lines.append()
method spec.methods:
method_name = method[]
render_lines.append()
render_lines.append()
render_lines.append()
render_lines
() -> :
constructor_lines = []
constructor_lines.append()
constructor_lines.append()
state_spec state_specs:
state_name = state_spec[]
initial_value = state_spec.get(, )
constructor_lines.append()
constructor_lines.append()
constructor_lines.append()
.join(constructor_lines)
() -> []:
methods = []
lifecycle:
methods.append()
methods.append()
methods.append()
methods.append()
lifecycle:
methods.append()
methods.append()
methods.append()
methods.append()
lifecycle:
methods.append()
methods.append()
methods.append()
methods.append()
methods
() -> []:
class_methods = []
method methods:
method_name = method[]
method_params = method.get(, [])
method_body = method.get(, )
params_str = .join(method_params)
class_methods.append()
class_methods.append()
class_methods.append()
class_methods
() -> :
render_lines = []
render_lines.append()
render_lines.append()
render_lines.append()
prop spec.props:
prop_name = prop[]
render_lines.append()
state_spec spec.state:
state_name = state_spec[]
render_lines.append()
method spec.methods:
method_name = method[]
render_lines.append()
render_lines.append()
render_lines.append()
render_lines.append()
.join(render_lines)
:
():
.analysis_rules = {}
() -> [, ]:
analysis = {
: ._detect_component_type(component_code),
: ,
: [],
: [],
: {}
}
analysis[] = ._calculate_complexity(component_code)
analysis[] = ._detect_issues(component_code)
analysis[] = ._generate_recommendations(analysis[])
analysis[] = ._calculate_metrics(component_code)
analysis
() -> :
code code:
code code code:
code:
:
() -> :
complexity =
lines = code.split()
complexity += (lines) //
state_count = code.count() + code.count()
complexity += state_count *
method_count = code.count() + code.count() + code.count()
complexity += method_count
nesting_level = (line.count() line lines) //
complexity += nesting_level
complexity
() -> []:
issues = []
code code code:
issues.append()
code.count() > :
issues.append()
lines = (code.split())
lines > :
issues.append()
props_count = code.count()
props_count > :
issues.append()
code:
issues.append()
code code:
issues.append()
issues
() -> []:
recommendations = []
issue issues:
issue:
recommendations.append()
issue:
recommendations.append()
issue:
recommendations.append()
issue:
recommendations.append()
issue:
recommendations.append()
issue:
recommendations.append()
((recommendations))
() -> [, ]:
metrics = {}
lines = code.split()
metrics[] = (lines)
metrics[] = ([line line lines line.strip() line.strip().startswith()])
metrics[] = ([line line lines line.strip().startswith()])
metrics[] = {
: code.count(),
: code.count(),
: code.count(),
: code.count(),
: code.count(),
: code.count()
}
metrics[] = code.count()
metrics[] = code.count() + code.count()
metrics[] = code.count() + code.count()
metrics
():
()
designer = ReactComponentDesigner()
component_spec = ComponentSpec(
name=,
=ComponentType.FUNCTIONAL,
props=[
{: , : , : },
{: , : , : },
{: , : , : , : }
],
state=[
{: , : , : },
{: , : , : },
{: , : , : }
],
methods=[
{: , : [], : },
{: , : [], : }
],
lifecycle=[, ],
dependencies=[, ]
)
performance_config = PerformanceOptimization(
use_memo=[],
use_callback=[],
memo_wrap=,
lazy_load=,
virtualize=
)
component_code = designer.design_component(
component_spec,
StateManagementType.LOCAL_STATE,
performance_config
)
()
(component_code)
()
analyzer = ReactComponentAnalyzer()
analysis = analyzer.analyze_component(component_code)
()
()
()
analysis[]:
()
issue analysis[]:
()
analysis[]:
()
rec analysis[]:
()
()
metric, value analysis[].items():
(value, ):
()
k, v value.items():
()
:
()
__name__ == :
main()
React组件优化器
from typing import Dict, Any, List, Optional
import re
class ReactComponentOptimizer:
def __init__(self):
self.optimization_rules = {}
def optimize_component(self, component_code: str) -> Dict[str, Any]:
"""优化React组件"""
optimization_result = {
'original_code': component_code,
'optimized_code': component_code,
'optimizations_applied': [],
'performance_improvements': []
}
optimized_code = component_code
optimized_code, optimizations = self._apply_performance_optimizations(optimized_code)
optimization_result['optimizations_applied'].extend(optimizations)
optimized_code, state_optimizations = self._optimize_state_management(optimized_code)
optimization_result['optimizations_applied'].extend(state_optimizations)
optimized_code, render_optimizations = self._optimize_rendering(optimized_code)
optimization_result['optimizations_applied'].extend(render_optimizations)
optimized_code, code_optimizations = self._optimize_code_structure(optimized_code)
optimization_result['optimizations_applied'].extend(code_optimizations)
optimization_result['optimized_code'] = optimized_code
return optimization_result
() -> :
optimizations = []
optimized_code = code
code code:
component_match = re.search(, code)
component_match:
component_name = component_match.group() component_match.group()
optimized_code = optimized_code.replace(
,
)
optimizations.append()
inline_functions = re.findall(, code)
func inline_functions:
optimizations.append()
code code:
useMemo_code =
useState_pos = optimized_code.find()
useState_pos != -:
insert_pos = optimized_code.find(, useState_pos)
optimized_code = optimized_code[:insert_pos] + useMemo_code + optimized_code[insert_pos:]
optimizations.append()
optimized_code, optimizations
() -> :
optimizations = []
optimized_code = code
useState_count = code.count()
useState_count > code:
optimizations.append()
useState_count > :
optimizations.append()
code code:
optimizations.append()
optimized_code, optimizations
() -> :
optimizations = []
optimized_code = code
code code:
optimizations.append()
code code:
optimizations.append()
code:
optimizations.append()
optimized_code, optimizations
() -> :
optimizations = []
optimized_code = code
lines = code.split()
(lines) > :
optimizations.append()
code code:
optimizations.append()
code code:
optimizations.append()
optimized_code, optimizations
:
():
.test_templates = {}
() -> :
component_info = ._extract_component_info(component_code)
test_code = ._generate_test_file(component_info)
test_code
() -> [, ]:
info = {
: ,
: [],
: [],
: []
}
component_match = re.search(, code)
component_match:
info[] = component_match.group() component_match.group() component_match.group()
props_match = re.search(, code, re.DOTALL)
props_match:
props_content = props_match.group()
prop_lines = [line.strip() line props_content.split() line.strip()]
info[] = [line.split()[].replace(, ).strip() line prop_lines]
method_matches = re.findall(, code)
info[] = method_matches
state_matches = re.findall(, code)
info[] = state_matches
info
() -> :
component_name = component_info[]
test_lines = [
,
,
,
,
,
,
,
,
,
]
component_info[]:
test_lines.extend([
,
])
prop component_info[][:]:
test_lines.append()
test_lines.extend([
,
,
,
,
])
component_info[]:
method component_info[][:]:
test_lines.extend([
,
,
,
,
,
,
])
component_info[]:
test_lines.extend([
,
,
,
,
,
,
,
])
test_lines.extend([
,
,
,
,
])
.join(test_lines)
():
()
optimizer = ReactComponentOptimizer()
sample_component =
optimization_result = optimizer.optimize_component(sample_component)
()
()
opt optimization_result[]:
()
()
(optimization_result[])
()
test_generator = ReactComponentTestGenerator()
test_code = test_generator.generate_tests(sample_component)
()
(test_code)
__name__ == :
main()
React组件最佳实践
组件设计原则
- 单一职责: 每个组件只负责一个功能
- 可复用性: 设计通用的组件接口
- 可测试性: 编写易于测试的组件
- 性能优先: 考虑渲染性能优化
- 可维护性: 保持代码清晰易懂
状态管理策略
- 本地状态: 使用useState管理组件内部状态
- 复杂状态: 使用useReducer管理复杂状态逻辑
- 全局状态: 使用Context或状态管理库
- 服务器状态: 使用React Query或SWR
- 表单状态: 使用专门的表单库
性能优化技巧
- React.memo: 避免不必要的重新渲染
- useMemo: 缓存计算结果
- useCallback: 缓存函数引用
- 代码分割: 使用lazy和Suspense
- 虚拟化: 处理大量数据列表
组件通信模式
- Props传递: 父子组件通信
- 回调函数: 子父组件通信
- Context API: 跨层级组件通信
- 状态管理: 全局状态共享
- 事件总线: 兄弟组件通信
相关技能
- component-analyzer - 组件分析器
- form-handling - 表单处理与验证
- performance-optimization - 性能优化
- css-validator - CSS验证器
class
PerformanceOptimization
"""性能优化配置"""
List
str
List
str
bool
bool
bool
class
ReactComponentDesigner
def
__init__
self
self
self
def
design_component
self, spec: ComponentSpec,
state_management: StateManagementType = StateManagementType.LOC_STATE,
performance_config: Optional[PerformanceOptimization] = None
str
"""设计React组件"""
if
type
self
elif
type
self
else
raise
f"不支持的组件类型: {spec.type}"
return
def
_generate_functional_component
self, spec: ComponentSpec,
state_management: StateManagementType,
performance_config: Optional[PerformanceOptimization]
str
"""生成函数组件"""
self
if
self
f"function {spec.name}({{"
if
else
f"function {spec.name}() {{"
self
self
if
self
self
self
self
"}"
if
and
f"export default React.memo({spec.name});"
else
f"export default {spec.name};"
return
'\n'
def
_generate_class_component
self, spec: ComponentSpec,
state_management: StateManagementType,
performance_config: Optional[PerformanceOptimization]
str
"""生成类组件"""
self
if
self
f"class {spec.name} extends React.Component {{"
if
self
self
self
self
"}"
f"export default {spec.name};"
return
'\n'
def
_generate_imports
self, spec: ComponentSpec,
state_management: StateManagementType,
performance_config: Optional[PerformanceOptimization]
str
"""生成导入语句"""
"import React;"
if
"import React, { useContext };"
elif
"import { useSelector, useDispatch } from 'react-redux';"
elif
"import { useStore } from 'zustand';"
if
if
or
"import React, { useMemo, useCallback };"
if
"import React, { lazy, Suspense };"
if
"import { FixedSizeList as List } from 'react-window';"
return
'\n'
def
_generate_props_interface
self, props: List[Dict[str, Any]]
str
"""生成Props接口"""
"interface Props {"
for
in
'name'
'type'
'optional'
False
'default'
None
"?"
if
else
""
f" {prop_name}{optional_mark}: {prop_type};"
if
is
not
None
f" // 默认值: {default_value}"
"}"
return
'\n'
def
_generate_hook_imports
self, state_management: StateManagementType,
performance_config: Optional[PerformanceOptimization]
List
str
"""生成Hook导入"""
" const [count, setCount] = React.useState(0);"
" const [data, setData] = React.useState(null);"
if
" const context = useContext(MyContext);"
elif
" const dispatch = useDispatch();"
" const state = useSelector(state => state.myReducer);"
elif
" const { state, actions } = useStore();"
return
def
_generate_state_definitions
self, state_specs: List[Dict[str, Any]],
state_management: StateManagementType
List
str
"""生成状态定义"""
for
in
'name'
'type'
'initial'
None
if
is
not
None
f" const [{state_name}, set{state_name.capitalize()}] = React.useState({initial_value});"
else
f" const [{state_name}, set{state_name.capitalize()}] = React.useState<{state_type}>();"
return
def
_generate_performance_optimizations
self, config: PerformanceOptimization,
spec: ComponentSpec
List
str
"""生成性能优化代码"""
for
in
f" const memoized{memo_item} = useMemo(() => {{"
f" // 计算{memo_item}的逻辑"
f" return compute{memo_item}();"
f" }}, [/* 依赖项 */]);"
for
in
f" const handle{callback_item} = useCallback(() => {{"
f" // 处理{callback_item}的逻辑"
f" }}, [/* 依赖项 */]);"
return
def
_generate_event_handlers
self, methods: List[Dict[str, Any]]
List
str
"""生成事件处理函数"""
for
in
'name'
'params'
'body'
f"// {method_name}实现逻辑"
", "
f" const {method_name} = ({params_str}) => {{"
f" {method_body}"
f" }};"
return
def
_generate_effects
self, lifecycle: List[str], state: List[Dict[str, Any]],
dependencies: List[str]
List
str
"""生成副作用Hook"""
if
'componentDidMount'
in
or
'useEffect'
in
" React.useEffect(() => {"
" // 组件挂载后的逻辑"
" console.log('组件已挂载');"
" }, []);"
for
in
'name'
f" React.useEffect(() => {{"
f" // {state_name}变化时的逻辑"
f" console.log('{state_name} changed:', {state_name});"
f" }}, [{state_name}]);"
return
def
_generate_render_logic
self, spec: ComponentSpec
List
str
"""生成渲染逻辑"""
" return ("
" <div>"
f" <h1>{spec.name}组件</h1>"
for
in
'name'
f" <div>{{props.{prop_name}}}</div>"
for
in
'name'
f" <div>状态: {{{state_name}}}</div>"
for
in
'name'
f" <button onClick={{{method_name}}}>触发{method_name}</button>"
" </div>"
" );"
return
def
_generate_constructor
self, state_specs: List[Dict[str, Any]]
str
"""生成构造函数"""
" constructor(props) {"
" super(props);"
" this.state = {"
for
in
'name'
'initial'
'null'
f" {state_name}: {initial_value},"
" };"
" }"
return
'\n'
def
_generate_lifecycle_methods
self, lifecycle: List[str], state: List[Dict[str, Any]],
dependencies: List[str]
List
str
"""生成生命周期方法"""
if
'componentDidMount'
in
" componentDidMount() {"
" // 组件挂载后的逻辑"
" console.log('组件已挂载');"
" }"
if
'componentDidUpdate'
in
" componentDidUpdate(prevProps, prevState) {"
" // 组件更新后的逻辑"
" console.log('组件已更新');"
" }"
if
'componentWillUnmount'
in
" componentWillUnmount() {"
" // 组件卸载前的清理逻辑"
" console.log('组件即将卸载');"
" }"
return
def
_generate_class_methods
self, methods: List[Dict[str, Any]]
List
str
"""生成类方法"""
for
in
'name'
'params'
'body'
f"// {method_name}实现逻辑"
", "
f" {method_name}({params_str}) {{"
f" {method_body}"
f" }}"
return
def
_generate_class_render
self, spec: ComponentSpec
str
"""生成类组件render方法"""
" render() {"
" return ("
" <div>"
f" <h1>{spec.name}组件</h1>"
for
in
'name'
f" <div>{{this.props.{prop_name}}}</div>"
for
in
'name'
f" <div>状态: {{this.state.{state_name}}}</div>"
for
in
'name'
f" <button onClick={{this.{method_name}}}>触发{method_name}</button>"
" </div>"
" );"
" }"
return
'\n'
class
ReactComponentAnalyzer
def
__init__
self
self
def
analyze_component
self, component_code: str
Dict
str
Any
"""分析React组件代码"""
'component_type'
self
'complexity_score'
0
'issues'
'recommendations'
'metrics'
'complexity_score'
self
'issues'
self
'recommendations'
self
'issues'
'metrics'
self
return
def
_detect_component_type
self, code: str
str
"""检测组件类型"""
if
'class'
in
and
'extends React.Component'
in
return
'class'
elif
'function'
in
or
'const'
in
and
'=>'
in
return
'functional'
elif
'React.memo'
in
return
'memo'
else
return
'unknown'
def
_calculate_complexity
self, code: str
int
"""计算组件复杂度"""
0
'\n'
len
10
'useState'
'this.state'
2
'const '
'function'
' '
max
' '
for
in
2
return
def
_detect_issues
self, code: str
List
str
"""检测代码问题"""
if
'useState'
in
and
'useMemo'
not
in
and
'useCallback'
not
in
"可能存在不必要的重新渲染,建议使用useMemo或useCallback优化"
if
'useState'
5
"状态过多,建议考虑使用useReducer或状态管理库"
len
'\n'
if
200
"组件过大,建议拆分为更小的组件"
'props.'
if
10
"Props过多,建议使用对象或配置"
if
'onClick={() =>'
in
"存在内联函数,建议使用useCallback优化"
if
'this.state.'
in
and
'='
in
"直接修改state,应该使用setState"
return
def
_generate_recommendations
self, issues: List[str]
List
str
"""生成优化建议"""
for
in
if
'重新渲染'
in
"使用React.memo、useMemo和useCallback优化渲染性能"
elif
'状态过多'
in
"考虑使用useReducer或引入状态管理库如Redux、Zustand"
elif
'组件过大'
in
"将大组件拆分为多个小组件,提高可维护性"
elif
'Props过多'
in
"使用配置对象或Context API减少Props传递"
elif
'内联函数'
in
"将内联函数提取为useCallback或组件方法"
elif
'直接修改state'
in
"使用setState或状态更新函数来修改状态"
return
list
set
def
_calculate_metrics
self, code: str
Dict
str
Any
"""计算代码指标"""
'\n'
'total_lines'
len
'code_lines'
len
for
in
if
and
not
'//'
'comment_lines'
len
for
in
if
'//'
'hooks_used'
'useState'
'useState'
'useEffect'
'useEffect'
'useMemo'
'useMemo'
'useCallback'
'useCallback'
'useContext'
'useContext'
'useReducer'
'useReducer'
'props_count'
'props.'
'state_count'
'useState'
'this.state'
'method_count'
'const '
'function'
return
def
main
print
"=== React组件设计器 ==="
"UserProfile"
type
'name'
'userId'
'type'
'string'
'optional'
False
'name'
'onUpdate'
'type'
'() => void'
'optional'
True
'name'
'theme'
'type'
"'light' | 'dark'"
'optional'
True
'default'
"'light'"
'name'
'user'
'type'
'User | null'
'initial'
'null'
'name'
'loading'
'type'
'boolean'
'initial'
'true'
'name'
'error'
'type'
'string | null'
'initial'
'null'
'name'
'fetchUser'
'params'
'id: string'
'body'
'console.log("获取用户数据");'
'name'
'handleUpdate'
'params'
'body'
'console.log("处理更新");'
'useEffect'
'componentDidMount'
'axios'
'react-query'
'user'
'handleUpdate'
True
False
False
print
"生成的React组件代码:"
print
print
"\n=== 组件分析 ==="
print
"组件分析结果:"
print
f"组件类型: {analysis['component_type']}"
print
f"复杂度评分: {analysis['complexity_score']}"
if
'issues'
print
"\n发现的问题:"
for
in
'issues'
print
f"- {issue}"
if
'recommendations'
print
"\n优化建议:"
for
in
'recommendations'
print
f"- {rec}"
print
"\n代码指标:"
for
in
'metrics'
if
isinstance
dict
print
f"- {metric}:"
for
in
print
f" {k}: {v}"
else
print
f"- {metric}: {value}"
if
'__main__'
def
_apply_performance_optimizations
self, code: str
tuple
"""应用性能优化"""
if
'export default'
in
and
'React.memo'
not
in
r'function (\w+)|const (\w+)'
if
1
or
2
f'export default {component_name};'
f'export default React.memo({component_name});'
"添加React.memo优化"
r'onClick=\{(\(\) => [^}]+)\}'
for
in
"提取内联函数为useCallback"
if
'useState'
in
and
'useMemo'
not
in
"""
// 优化计算密集型操作
const expensiveValue = useMemo(() => {
return computeExpensiveValue(data);
}, [data]);
"""
'useState('
if
1
'\n'
"添加useMemo优化"
return
def
_optimize_state_management
self, code: str
tuple
"""优化状态管理"""
'useState'
if
3
and
'useReducer'
not
in
"建议使用useReducer替代多个useState"
if
2
"考虑合并相关状态为对象"
if
'set'
in
and
'prev'
not
in
"建议使用函数式状态更新"
return
def
_optimize_rendering
self, code: str
tuple
"""优化渲染"""
if
'&&'
in
and
'React.Fragment'
not
in
"考虑使用React.Fragment优化条件渲染"
if
'.map('
in
and
'key='
not
in
"列表渲染缺少key属性"
if
'style={{'
in
"考虑使用CSS类替代内联样式"
return
def
_optimize_code_structure
self, code: str
tuple
"""优化代码结构"""
'\n'
if
len
150
"组件过大,建议拆分"
if
'useEffect'
in
and
'useCustom'
not
in
"考虑提取自定义Hook"
if
'interface'
not
in
and
'type'
not
in
"建议添加TypeScript类型定义"
return
class
ReactComponentTestGenerator
def
__init__
self
self
def
generate_tests
self, component_code: str
str
"""生成组件测试代码"""
self
self
return
def
_extract_component_info
self, code: str
Dict
str
Any
"""提取组件信息"""
'name'
'Component'
'props'
'methods'
'state'
r'function (\w+)|const (\w+)|class (\w+)'
if
'name'
1
or
2
or
3
r'interface Props \{([^}]+)\}'
if
1
for
in
'\n'
if
'props'
':'
0
'?'
''
for
in
r'const (\w+) = \([^)]*\) =>'
'methods'
r'const \[(\w+), set\w+\] = useState'
'state'
return
def
_generate_test_file
self, component_info: Dict[str, Any]
str
"""生成测试文件"""
'name'
"import React from 'react';"
"import { render, screen, fireEvent, waitFor } from '@testing-library/react';"
f"import {component_name} from './{component_name}';"
""
f"describe('{component_name}', () => {{"
" it('应该正确渲染', () => {"
f" render(<{component_name} />);"
f" expect(screen.getByText('{component_name}组件')).toBeInTheDocument();"
" });"
""
if
'props'
f" it('应该正确处理Props', () => {{"
f" const mockProps = {{"
for
in
'props'
3
f" {prop}: 'test-{prop}',"
" };"
f" render(<{component_name} {{...mockProps}} />);"
" // 添加Props相关的断言"
" });"
""
if
'methods'
for
in
'methods'
2
f" it('应该正确处理{method}事件', () => {{"
f" render(<{component_name} />);"
f" const button = screen.getByText('触发{method}');"
" fireEvent.click(button);"
" // 添加事件相关的断言"
" });"
""
if
'state'
" it('应该正确管理状态', async () => {"
f" render(<{component_name} />);"
" // 添加状态相关的测试"
" await waitFor(() => {"
" // 等待状态更新"
" });"
" });"
""
" it('应该处理错误情况', () => {"
f" render(<{component_name} />);"
" // 添加错误处理测试"
" });"
"});"
return
'\n'
def
main
print
"=== React组件优化器 ==="
'''
import React from 'react';
function UserProfile({ userId, onUpdate }) {
const [user, setUser] = React.useState(null);
const [loading, setLoading] = React.useState(true);
const [error, setError] = React.useState(null);
const fetchUser = (id) => {
console.log("获取用户数据");
};
const handleUpdate = () => {
console.log("处理更新");
};
React.useEffect(() => {
fetchUser(userId);
}, [userId]);
return (
<div>
<h1>UserProfile组件</h1>
<div>用户ID: {userId}</div>
<div>状态: {loading ? '加载中...' : '已加载'}</div>
<button onClick={() => handleUpdate()}>触发handleUpdate</button>
</div>
);
}
export default UserProfile;
'''
print
"优化结果:"
print
"应用的优化措施:"
for
in
'optimizations_applied'
print
f"- {opt}"
print
"\n优化后的代码:"
print
'optimized_code'
print
"\n=== 测试代码生成 ==="
print
"生成的测试代码:"
print
if
'__main__'