【发布时间】:2021-06-08 03:21:18
【问题描述】:
所以我正在构建一个鼓垫类型的应用程序,除了这个之外,几乎所有东西都可以正常工作。
编辑:如果有人想看看,请将整个内容放在代码和框上: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 不会重新渲染应用程序。
我希望能够多次按下同一个按钮并让应用重新渲染,因此每次按下按钮时都会运行 useEffect。谁能帮我怎么做?
【问题讨论】:
-
我发现这个自定义的按键挂钩可能对你有帮助 useKeyPress
-
为什么要为此使用
useEffect钩子,而不仅仅是将keyPress 事件侦听器回调与要传递给theSound的特定索引值相关联?也许我在这个最小的例子中遗漏了一些上下文?useEffect旨在在依赖项更改时运行效果,而不是在发生异步事件时运行。它似乎不是这项工作的正确工具。 -
@DrewReese 是对的,为什么在
useEffect对您没有任何好处时使用它。只需在一个回调中包装所有playThis就足够了。 -
@DrewReese 一开始我试过了,把所有东西都放在 playThis() 中,但是 useSound 是一个自定义钩子,不能放在普通函数中。这就是为什么我将它设置为在 index 而不是 num 播放声音。如果我把它放在 playThis 中的当前形式,它会滞后并在前一个索引处播放声音,因为状态是异步的。
-
您不需要将
useSound放在任何回调中,并且除了明显的挂钩原因之外,但theSound可以。我认为 React ref 可以帮助你。您是否有能力创建一个 running 代码框,该代码大部分都在工作?我有一个想法,但我不确定text状态或drumBank在哪里发挥作用。
标签: javascript reactjs react-hooks use-effect use-state