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

React中如何精简onClick触发speak-tts朗读的重复代码?

精简实现方案

原有代码存在不少冗余逻辑,可以从以下几个方向优化:

  • 固定不变的单词文本不需要用useState存储,静态值直接定义常量即可
  • 每次组件渲染都新建Speech实例、重复执行初始化逻辑,会造成性能浪费,实例只需要初始化一次
  • 三个逻辑完全一致的点击处理函数可以合并,甚至可以直接写在行内消除函数定义
  • 重复的DOM结构可以通过数组遍历渲染,不用重复编写几乎完全一致的标签块

精简后代码

import React, { useMemo } from "react";
import Speech from "speak-tts";

// 静态单词列表提为组件外常量,组件重渲染不会重复创建
const WORD_LIST = ["apple", "banana", "carrot"];

function Alphabet() {
  // 语音实例仅初始化一次,避免重复创建导致的异常和性能损耗
  const speech = useMemo(() => {
    const instance = new Speech();
    instance.init({
      lang: "en-US",
      rate: 0.4,
    }).then(data => {
      console.log("Speech is ready, voices are available", data);
    }).catch(e => {
      console.error("An error occured while initializing : ", e);
    });
    return instance;
  }, []);

  return (
    <>
      {WORD_LIST.map(word => {
        const displayWord = word.charAt(0).toUpperCase() + word.slice(1);
        return (
          <React.Fragment key={word}>
            <h2>{displayWord}</h2>
            <button
              value={displayWord}
              onClick={() => speech.speak({ text: word })}
              alt="click here for pronounciation"
              className="buttonSound"
            >
              🔊
            </button>
          </React.Fragment>
        )
      })}
    </>
  );
}

export default Alphabet;

优化收益

  • 后续新增单词只需要往WORD_LIST数组添加对应字符串即可,不需要额外修改状态、新增点击函数、编写重复DOM
  • 语音实例仅初始化一次,不会出现重复初始化导致的多次叠加播报、控制台冗余报错问题
  • 代码量缩减近50%,没有重复逻辑,后续维护修改只需要改一处配置即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 06:15:38