Reactjs 函数内部redux钩子的替换

Reactjs 函数内部redux钩子的替换,reactjs,react-hooks,Reactjs,React Hooks,我确实需要在下面的函数中有一个全局状态,但我得到了这个错误: 无效的钩子调用。钩子只能在函数组件的主体内部调用 是否有解决方法或其他解决方案 import useVoiceHook from '../../hooks/voicehook'; const Sound = require('react-native-sound'); function PlaySound(name) { const voicehook = useVoiceHook(); const voice = new

我确实需要在下面的函数中有一个全局状态,但我得到了这个错误:
无效的钩子调用。钩子只能在函数组件的主体内部调用

是否有解决方法或其他解决方案

import useVoiceHook from '../../hooks/voicehook';

const Sound = require('react-native-sound');

function PlaySound(name) {
  const voicehook = useVoiceHook();
  const voice = new Sound(name, Sound.MAIN_BUNDLE, async (error) => {
    if (error) {
      console.warn('failed to load the sound', error);
      return;
    }
    if (voicehook.data.lastVoice) {
      voicehook.data.lastVoice.stop();
    }
    voicehook.setVoice(voice);
    voice.play();
  });
}
export default PlaySound;

由于您试图在事件上使用PlaySound函数,它会抛出错误,因为您无法在其中使用钩子。钩子用于功能组件中的顶级函数

有关更多详细信息,请查看

您应该将voicehook值作为参数传递给playSound函数并使用相同的参数

function MyComponent(props) {
   const voicehook = useVoiceHook();
   ...
  
   return (
       <TouchableOpacity style={{backgroundColor: "red", padding: 20}} onPress={()=> {
             PlaySound('click', voicehook)
         }
        }>
         <Text>X</Text>
        </TouchableOpacity>
   )
}


function PlaySound(name, voicehook) {
  const voice = new Sound(name, Sound.MAIN_BUNDLE, async (error) => {
    if (error) {
      console.warn('failed to load the sound', error);
      return;
    }
    if (voicehook.data.lastVoice) {
      voicehook.data.lastVoice.stop();
    }
    voicehook.setVoice(voice);
    voice.play();
  });
}
export default PlaySound;
功能MyComponent(道具){
const voicehook=useVoiceHook();
...
返回(
{
播放声音('点击',voicehook)
}
}>
X
)
}
函数PlaySound(名称、voicehook){
const voice=新声音(名称,Sound.MAIN\u BUNDLE,异步(错误)=>{
如果(错误){
console.warn('加载声音失败',错误);
返回;
}
if(voicehook.data.lastVoice){
voicehook.data.lastVoice.stop();
}
voicehook.setVoice(语音);
声音。播放();
});
}
导出默认播放声音;

PlaySound是如何使用的?在其他函数或类似onPress={()=>PlaySound('click')中@ShubhamKhatriI会研究voiceHook的实现,看看里面有什么神奇的酱汁。“我无法想象为什么一开始播放一个声音就需要成为一个钩子。@马丁,因为我需要在播放一个新的声音时阻止其他声音one@Martin另外,正如标题所说,我正在寻找替代品。如果可以的话,我会首先使用一个组件来代替PlayVoice功能:(您只需要按照我在示例中所示的方式更新实现。在已定义onPress事件处理程序的组件中使用useVoice钩子,并将voiceHook值作为param传递