React hooks - 当状态更改为相同值时如何强制 useEffect 运行?

2024-03-02

所以我正在构建一个鼓垫类型的应用程序,除了这个之外,几乎所有东西都可以正常工作。

编辑:把整个东西放在codesandbox上,如果有人想看的话:codesandbox.io/s/sleepy-darwin-jc9b5?file=/src/App.js

const [index, setIndex] = useState(0);
const [text, setText] = useState("");
const [theSound] = useSound(drumBank[index].url)   

function playThis(num) {
  setIndex(num)
}

useEffect(()=>{
  if (index !== null) {
    setText(drumBank[index].id);
    theSound(index);
    console.log(index)
  }
}, [index])

当我按下按钮时,索引会更改为与该按钮关联的值,然后 useEffect 挂钩会播放该数组中的声音index。但是,当我多次按下同一个按钮时,它只会播放一次,因为 useState 不会在index更改为相同的值。

我希望能够多次按下同一个按钮并使应用程序重新渲染,因此每次按下按钮时 useEffect 都会运行。谁能帮助我如何做到这一点?


这是我可以从你的沙箱中得到的结果。

  1. 根据每个文档useSound只是一种声音,因此当尝试将索引更新到音库以通过 React 状态使用时,播放的声音将始终至少延迟一个渲染周期。我建议创建一个新的自定义 hook 来封装您的 9 种鼓声。

    useDrumBank使用鼓组数组并将 9 个鼓声音实例化到一个数组中。

    const useDrumBank = (drumbank) => {
      const [drum0] = useSound(drumbank[0].url);
      const [drum1] = useSound(drumbank[1].url);
      const [drum2] = useSound(drumbank[2].url);
      const [drum3] = useSound(drumbank[3].url);
      const [drum4] = useSound(drumbank[4].url);
      const [drum5] = useSound(drumbank[5].url);
      const [drum6] = useSound(drumbank[6].url);
      const [drum7] = useSound(drumbank[7].url);
      const [drum8] = useSound(drumbank[8].url);
    
      return [drum0, drum1, drum2, drum3, drum4, drum5, drum6, drum7, drum8];
    };
    
  2. 更新组件逻辑以传递drumBank数组到新的自定义挂钩。

    const sounds = useDrumBank(drumBank);
    

这是完整的代码:

function App() {
  useEffect(() => {
    document.addEventListener("keypress", key);

    return () => document.removeEventListener("keypress", key);
  }, []);

  const [text, setText] = useState("");
  const sounds = useDrumBank(drumBank);

  function playThis(index) {
    drumBank[index]?.id && setText(drumBank[index].id);
    sounds[index]();
  }

  function key(e) {
    const index = drumBank.findIndex((drum) => drum.keyTrigger === e.key);
    index !== -1 && playThis(index);
  }

  return (
    <div id="drum-machine" className="drumpad-container">
      <div id="display" className="drumpad-display">
        <p>{text}</p>
      </div>
      <button className="drum-pad" id="drum-pad-1" onClick={() => playThis(0)}>
        Q
      </button>
      <button className="drum-pad" id="drum-pad-2" onClick={() => playThis(1)}>
        W
      </button>
      <button className="drum-pad" id="drum-pad-3" onClick={() => playThis(2)}>
        E
      </button>
      <button className="drum-pad" id="drum-pad-4" onClick={() => playThis(3)}>
        A
      </button>
      <button className="drum-pad" id="drum-pad-5" onClick={() => playThis(4)}>
        S
      </button>
      <button className="drum-pad" id="drum-pad-6" onClick={() => playThis(5)}>
        D
      </button>
      <button className="drum-pad" id="drum-pad-7" onClick={() => playThis(6)}>
        Z
      </button>
      <button className="drum-pad" id="drum-pad-8" onClick={() => playThis(7)}>
        X
      </button>
      <button className="drum-pad" id="drum-pad-9" onClick={() => playThis(8)}>
        C
      </button>
    </div>
  );
}

Demo

使用说明

加载后立即没有声音 https://www.npmjs.com/package/use-sound#no-sounds-immediately-after-load

为了用户的利益,浏览器不允许网站发出声音 直到用户与它们交互(例如,通过单击 某物)。在用户单击、敲击或点击之前不会产生声音 触发某事。

让按键持续工作似乎是一个问题,我并没有立即想到解决方案,但至少在这一点上按钮点击工作并且声音同步播放。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

React hooks - 当状态更改为相同值时如何强制 useEffect 运行? 的相关文章

  • 使用referrer javascript从google获取查询参数

    是否可以从google搜索中获取查询参数 IE 如果有人用谷歌搜索自行车 网址就会变成 https www google es search q bicycles 如果您随后进入搜索结果并且有人点击您的页面 您将无法看到带有 documen
  • 计算 HH:MM:SS 中两个日期之间的时间差 javascript

    我用 JavaScript 创建了一个计时器应用程序 首先 它使用当前的 UTC 日期来初始化计时器并提供一些参考 这是代码 on timer function e var self this if e target hasClass pt
  • 将nodejs Express静态请求重定向到https

    我需要将所有 http 请求重定向到 https 包括对静态文件的请求 My code app use express static dirname public app get function req res if req secure
  • JSX 支持哪些 ES6 功能?

    我在用着与 JSX 进行反应 with 反应工具 https www npmjs com package react tools将 JSX 代码编译为 JavaScript JSX 支持哪些 ES6 功能harmony选项已启用 感谢康加克
  • 将相同的多个对象推送到多个数组中

    这是后续使3个数组相互对应 第一个是对象名称 https stackoverflow com questions 57564488 make 3 arrays correspond to each other with the first
  • Safari 不触发表单提交

    对于一个项目 我有两个选择表单字段 它们通过 jquery 触发器 提交 发送 这在 Firefox 和 Chrome 中运行良好 但在 Safari 中没有任何反应 这是 HTML 代码
  • (IE 特定)如何确定输入的文本是否比输入元素的宽度长

    这是所有版本 IE 特有的问题 在所有其他浏览器中 当文本溢出时 输入元素的scrollWidth 大于输入元素的clientWidth 有没有办法确定IE中输入字段中的文本超出了输入元素宽度的键 下面是一个检查 clientWidth 与
  • 图表js不显示

    我正在尝试使用 Charts js 创建一个简单的折线图 当我运行下面的代码时 没有出现图表 我究竟做错了什么 我正在关注这个教程http www chartjs org docs latest getting started http w
  • 如何将毫秒转换为可读的日期?

    下列 new Date 1324339200000 toUTCString Outputs Tue 20 Dec 2011 00 00 00 GMT 我需要它返回Dec 20 除了我可以使用的更好的方法之外toUTCString 我正在寻找
  • 将表单传递给 AngularJS 组件进行验证

    我正在将旧代码库迁移到 AngularJS 1 5 所推广的新组件架构 我在对较大的表单执行此操作时遇到了问题 传统上 我会附加表单验证 如下所示
  • 优化重叠矩形的绘制

    我有很多矩形 有些与其他矩形重叠 每个矩形都有一个绝对 z 顺序和一个colour 每个 矩形 实际上是粒子效果 网格或纹理的轴对齐边界框 并且可能是半透明的 但只要您不尝试剔除其他矩形后面的矩形 就更容易抽象地思考彩色矩形 所以我将在问题
  • 如何使用 RSpec 测试 javascript 重定向?

    我正在使用 xhr post 与控制器交互 并且我期待重定向 在 js erb 中 我有 window location href address 手动测试 浏览器会正确重定向 我如何使用 RSpec 测试它 response should
  • 如何在 Ionic 2 中动态创建具有特定类的模式?

    嗨 我已经被一个问题困扰好几天了 到目前为止还没有研究证明足够 我正在尝试在 Ionic 2 中创建一个具有特定类 或 id 的简单模式 我需要这样简单的东西
  • 如何使用谷歌地图检测一个点是否在多边形内部?

    我想检测到google maps LatLng是在一个里面google maps Polygon 我怎样才能做到这一点 Cheers 你可以使用这个谷歌地图V3 google maps geometry poly containsLocat
  • 如何为多个元素添加Class?

    我正在使用这段 javascript 向多个元素添加一个类 我试图引用多个 div 并向它们添加类 它只适用于第一个 JavaScript
  • 使用 ngx-translate 时更改 URL

    当有人使用 ngx translate 单击所选语言时 我尝试更改 URL 我想我应该通过订阅语言更改事件然后修改当前的 url 以反映所选的语言来做到这一点 因为我是新手 所以我不确定是否需要服务来做到这一点 或者可能是另一种解决方法 我
  • 如何在 Vue.js 2 中使用事件总线通过自定义事件传递数据

    我在用着Vue js 2 5 x 在我的玩具项目中 我实现了一个事件总线 类似于所示的here https alligator io vuejs global event bus 事件总线在 Vue 原型中全局注册为 eventBus 然后
  • 为什么react中的组件需要大写? [复制]

    这个问题在这里已经有答案了 因此 当您声明一个组件以小写首字母进行反应时 它不会显示 也不会引发错误 当您将组件名称大写时 它确实有效 这样的实现是怎样的呢 为了避免与现有的 html 元素发生冲突 还是这是一个错误 var test Re
  • jQuery.ajax() 记录 HTTP 请求

    我有一个发送 HTTP POST 请求的函数 我想记录它以进行调试 这是函数 function serverRequest URL DATA callback ajax url URL type POST dataType text con
  • 通过排列四个给定数字找到最大可能时间 HH:MM

    我最近为了工作晋升而参加了编码测试 这是我真正遇到的任务之一 我想知道什么是最好的方法来做到这一点 我使用了大量的 if 和 if else 这不是最干净的解决方案 但完成了工作 我被问到的问题是 将 4 个数字格式化为 24 小时时间 0

随机推荐

  • Volley 加上列表适配器中的 OutOfMemoryError

    我在用凌空加 https github com DWorkS VolleyPlus图书馆 我正在展示ListView图像和文本视图没有错误 但是当我在这个列表视图中上下滚动很多时间时 它得到OutOfMemoryError并使应用程序崩溃
  • R Roxygen 链接到父函数

    考虑一个基础包XYZ 别人写的 有一个函数ABC 我想扩展功能ABC通过以下方法在我的新 不是 XYZ 包中 ABC lt function INSERT EXTRA WORK CALL THE BASE METHOD XYZ ABC 现在
  • 如何将控制器包含在 Ruby on Rails gem 中?

    我正在尝试为一个开源项目做出贡献 我需要一个控制器来处理几个需要提交的表单 我在 gem 内的一个目录中创建了这些控制器 名为app controllers gemname my controller rb 但是 当我尝试访问控制器时 它似
  • Mac中如何获取usb设备的设备描述符和配置描述符?

    I have minimum exposure to xcode and I Okit framework I have seen device descriptor and configuration descriptor of a us
  • 使用 PhantomJS 设置远程调试

    我正在尝试使用 PhantomJS 设置远程调试 但运气不佳 我正在按照以下说明进行操作https github com ariya phantomjs wiki Troubleshooting https github com ariya
  • r、ggplot2、形状/颜色。它们之间有什么区别?

    set seed 123 library data table library ggplot2 dat data table data frame a rnorm 12 b rnorm 12 c rep c 1 2 6 d rep c 1
  • 如何对实例创建进行单元测试?

    我有一个Carpenter类 它的工作使用Lathe and a Wood object class Carpenter function Work tool new Lathe material new Wood tool gt Appl
  • 红帽的订阅管理器如何工作?

    红帽subscription manager是一个从命令行注册 附加和删除订阅的工具 如果我理解正确的话 该工具会连接到客户门户以检索证书 然后 这些证书可用于从 Red Hat 存储库下载 yum 软件包等 Sources https l
  • 我的 Beaker、WSGI、Apache2、Python 有什么问题吗?

    好的 我的代码如下 我正在使用 apache2 mod wsgi beaker python def application environ start response session environ beaker session if
  • 删除行后数据库大小不变

    我有 2 个数据库 我从其中删除了特定表中的行 以减少数据库的大小 删除后大小为DB mdf不会改变 我还尝试重建索引并使用cleantable 但没有效果 ALTER INDEX ALL ON dbo Tablename REBUILD
  • Jetpack Compose Surface 单击波纹未根据形状进行剪裁?

    我有 3 个表面 如 gif 所示 当我单击波纹效果传播时 无需考虑表面的形状 哪些是用创建的 Composable fun SurfaceClickPropagationExample Provides a Context that ca
  • Perl-我在寻找什么功能?将多个规则分配给指定结果

    我在脑海中概念化了一个函数 我想象它存在 但如果它存在 我不知道它的名字 因此很难用谷歌搜索 假设我想定义两个结果 我将称之为Pass and Fail 我想要几个不同的规则适用于这两种结果 因此 为了清楚起见 希望如此 假设我有一个文件
  • 在 Three.js 中,Alpha 通道工作不一致

    我正在用 Three js 构建一个 剪纸 世界 我的所有模型都是简单的 平面 我使用带有 Alpha 通道的 PNG 来对它们进行纹理处理 以将平面修剪成更令人愉悦的形状 奇怪的是 根据飞机的位置和相机的位置 透明度不可预测地出现和消失
  • 检查数据帧是否包含任何空值

    我有一个数据框 需要查看它是否包含空值 关于同一主题的帖子有很多 但几乎所有帖子都使用count行动或show方法 count在我的例子中 由于数据量很大 操作的成本非常高 同样对于show method 有没有一种方法可以让 Spark
  • 在类中使用 PDO [重复]

    这个问题在这里已经有答案了 我有一些类执行一些 MySQL 查询和准备好的语句 然而 我不知道如何将我的 PDO 对象合并到这些类中 例如 我想做这样的事情 不幸的是 它不起作用 谁能建议一种优雅的方法来做到这一点 谢谢你的时间 抱歉 我是
  • 动态组装scrapy GET请求字符串

    我一直在使用 firebug 并且有以下字典来查询 api url htp my url aspx top querystring dbkey x1 stype id s 27 headers accept text html applic
  • qt webengine将javascript输出重定向到GUI

    我有一个可以查看页面的应用程序QWebEngineView小部件如何将我的 javascript 控制台日志重定向到我的 GUI 它当前显示在我的调试输出中 您必须子类化 QWebEnginePage 才能覆盖 javaScriptCons
  • 使用immulator时在android studio中使用protocol=http/1.1、code=200在Retrofit中获取F响应

    我正在从 Nodejs 本地服务器调用 API API正在调用 但Retrofit的respose body中没有数据 代码 200 和消息 OK 我收到以下回复 Response protocol http 1 1 code 200 me
  • FlexSlider 2 标题在 chrome 上闪烁

    我在 chrome 上的标题有些闪烁 http tyni cc flexsliderissue http tyni cc flexsliderissue在野生动物园中一切都运行良好 任何人都知道出了什么问题吗 谢谢 丹尼尔 我经常使用 Fl
  • React hooks - 当状态更改为相同值时如何强制 useEffect 运行?

    所以我正在构建一个鼓垫类型的应用程序 除了这个之外 几乎所有东西都可以正常工作 编辑 把整个东西放在codesandbox上 如果有人想看的话 codesandbox io s sleepy darwin jc9b5 file src Ap