【问题标题】:Error: React Hook useEffect has a missing dependency. Does anyone have a solution?错误:React Hook useEffect 缺少依赖项。有没有人有办法解决吗?
【发布时间】:2022-11-13 17:07:28
【问题描述】:

我已经创建了一个音乐播放器作为我正在处理的项目的一部分,但我有这个错误。有没有人有办法解决吗?

[eslint] src\components\MusicPlayer.jsx 第 48:9 行:React Hook useEffect 缺少依赖项:'togglePlay'。要么包含它,要么移除依赖数组 react-hooks/exhaustive-deps

我已经为这个例子缩短了代码。任何帮助,将不胜感激!

import React, { useState, useEffect, useRef } from 'react'


function MusicPlayer({songs}) {

      //Test 
const songFiles = songs.map(song => song.songFile)

    //Hooks
    const audioPlayer = useRef()

    //State
    const [index, setIndex] = useState(0);
    const { songClicked} = useContext(songContext)
    // setSongClicked
    const [currentSong, setCurrentSong] = useState(songClicked);
    const [isPlaying, setisPlaying] = useState(false);
    const [volume, setVolume] = useState(30);
    const [mute, setMute] = useState(false);


     useEffect(() => {
        setCurrentSong(songClicked)
        
         if (songClicked) {
             audioPlayer.current.play()
         }
        
         if (songClicked) {
             togglePlay()
         }

     }, [songClicked])
 

    useEffect(() => {
        if(audioPlayer) {
            audioPlayer.current.volume = volume / 100;
        }
    }, [volume]);


    function togglePlay() {
        if(!isPlaying) {
            audioPlayer.current.play()
        } else {
            audioPlayer.current.pause()
        }
        setisPlaying(isPlaying => !isPlaying)
    }

【问题讨论】:

  • 您只需添加 // eslint-disable-next-line react-hooks/exhaustive-deps 即可禁用该 lint。
  • 我在哪里添加它?什么线?
  • 就在依赖数组的上方。
  • @BikasLin 请避免建议其他人禁用 eslint。它的警告和错误大多是正确的。

标签: javascript reactjs


【解决方案1】:

useEffect 缺少依赖项。有没有人有办法解决吗?

我想这个错误说明了一切。只需将togglePlay 包含在依赖useEffect 的数组。

useEffect(() => {
   if (currentSong !== songClicked) {
     setCurrentSong(songClicked)
   }
    
}, [songClicked, togglePlay]);
           //    ^^^^^^^^^

还要确保用useCallback 包裹你的togglePlay,保持渲染之间的函数引用。否则,你可能会得到一个无穷环形。

const togglePlay = useCallback(() => {
   ...
}, []);

【讨论】:

  • 嘿,谢谢你的回复!即使我将函数包装在 useCallback 中,它也会启动一个无限循环
  • 我的播放和暂停按钮闪烁得非常快。我认为它改变了从玩的状态!玩
  • @Gavin-walsh songClicked 是什么?它是一个字符串吗?
  • @Gavin-walsh 是的,但是 songClicked 是什么类型的变量?
  • @Gavin-walsh 也许只是检查当前歌曲是否等于存储在状态中的歌曲就足够了?我更新了我的答案,检查 useEffect。
猜你喜欢
  • 1970-01-01
  • 2021-02-23
  • 2021-06-24
  • 2020-03-27
  • 2019-10-24
  • 2020-10-26
  • 2020-04-05
  • 2020-03-07
  • 2020-02-25
相关资源
最近更新 更多