You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React中使用大量Props的组件如何优化?Preset组件优化咨询

优化可复用Preset组件的几点建议

你当前用可复用组件减少重复代码的思路是对的,但还有几个可以优化的地方,能让代码更清晰、易维护且性能更好:


1. 将Preset组件移出Main组件内部

现在你把Preset定义在Main的函数体内,每次Main渲染时都会重新创建这个组件,既浪费性能,也不符合组件拆分的最佳实践。把它单独提出来:

// 单独定义Preset组件
const Preset = ({ preset, quality }) => {
  // 组件逻辑...
};

const Main = () => {
  // Main的逻辑...
};

2. 优化Props结构,避免零散传参

当前Props数量过多(presetName、presetColor、span1...),传参时容易混乱。可以把相关属性整合成对象,让代码更整洁:

比如把预设标题和颜色打包成preset对象,把质量相关的文本打包成quality对象:

// 使用时传参更清晰
<Preset
  preset={{ name: "ÓTIMO", color: "#00FF47" }}
  quality={{
    level: "Ótima",
    desc: "qualidade de aúdio",
    specs: [
      { label: "Exportamos em", value: "320kbps" },
      { label: "Exportamos em", value: "CBR" }
    ]
  }}
/>

3. 提取重复常量,避免硬编码

代码里多次出现#CEB031这个颜色值,可以把它提取成常量,后续修改时只需改一处:

const GOLD_COLOR = "#CEB031";

// 在组件里使用
<span style={{ color: GOLD_COLOR }}>{props.value}</span>

4. 优化文本拼接与JSX结构

现在用{ ${props.text1}}这种写法有点繁琐,可以直接用JSX片段拼接;重复的<br />和文本结构可以用数组循环渲染,减少重复代码:

// 循环渲染规格行
<div className={styles["boxes-box__text"]}>
  <h2>
    <span style={{ color: quality.color || preset.color }}>{quality.level}</span> {quality.desc}
    {quality.specs.map((spec, index) => (
      <React.Fragment key={index}>
        <br />
        {spec.label} <span style={{ color: GOLD_COLOR }}>{spec.value}</span>
      </React.Fragment>
    ))}
  </h2>
</div>

5. 语义化标签调整

一个页面通常只应该有一个<h1>标签,当前Main里有<h1>Bem Vindo</h1>,Preset里又用了<h1>,建议把Preset里的<h1>改成<h3>或其他合适的层级标签,符合HTML语义化规范。


优化后的完整代码

import React from 'react';

// 提取重复颜色常量
const GOLD_COLOR = "#CEB031";

// 单独定义Preset组件
const Preset = ({ preset, quality }) => {
  return (
    <div className={styles["main-boxes__box"]}>
      <h3>
        <span
          className={styles["boxes-box__preset"]}
          style={{ color: preset.color }}
        >
          {preset.name}
        </span>
      </h3>
      <div className={styles["boxes-box__text"]}>
        <h2>
          <span style={{ color: quality.color || preset.color }}>{quality.level}</span> {quality.desc}
          {quality.specs.map((spec, idx) => (
            <React.Fragment key={idx}>
              <br />
              {spec.label} <span style={{ color: GOLD_COLOR }}>{spec.value}</span>
            </React.Fragment>
          ))}
        </h2>
      </div>
    </div>
  );
};

const Main = () => {
  // 把预设数据整理成数组,后续新增预设只需加数组项
  const presetData = [
    {
      preset: { name: "ÓTIMO", color: "#00FF47" },
      quality: {
        level: "Ótima",
        desc: "qualidade de aúdio",
        specs: [
          { label: "Exportamos em", value: "320kbps" },
          { label: "Exportamos em", value: "CBR" }
        ]
      }
    },
    {
      preset: { name: "BOM", color: "#93FFAA" },
      quality: {
        level: "Boa",
        desc: "qualidade de aúdio",
        specs: [
          { label: "Exportamos em", value: "192kbps" },
          { label: "Exportamos em", value: "mp3" }
        ]
      }
    },
    {
      preset: { name: "RUIM", color: "#25AB7B" },
      quality: {
        level: "Baixa",
        desc: "qualidade de aúdio",
        specs: [
          { label: "Exportamos em", value: "64kbps" },
          { label: "Exportamos em", value: "mp3" }
        ]
      }
    }
  ];

  return (
    <Wrapper>
      <div className={styles["main-text"]}>
        <h1>Bem Vindo</h1>
        <div className={styles["main-subtext"]}>
          <h2>
            Para o seu favorito YT<span style={{ color: GOLD_COLOR }}>2</span>MP3
          </h2>
          <Line Class={styles["main-subtext__line"]} />
          <h2>Que tipo de aúdio atende você?</h2>
        </div>
      </div>
      <div className={styles["main-boxes"]}>
        {/* 循环渲染Preset组件,新增预设无需重复写组件标签 */}
        {presetData.map((item, idx) => (
          <Preset key={idx} {...item} />
        ))}
      </div>
      <Music Class={styles.svg}/>
    </Wrapper>
  );
};

内容的提问来源于stack exchange,提问作者user19144150

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 14:15:45