简体   繁体   English

我的应用程序的“React Hook useEffect 缺少依赖项”警告

[英]My App's "React Hook useEffect has a missing dependency" warning

I have a simple app for searching a db of Albums by artist.我有一个简单的应用程序,用于按艺术家搜索专辑数据库。
Three components: App, AlbumList, AlbumSearch.三个组件:App、AlbumList、AlbumSearch。

The App component defines getAlbumsByArtist to fetch and update albums, and passes albums as prop to AlbumList. App 组件定义了getAlbumsByArtist来获取和更新专辑,并将专辑作为 prop 传递给 AlbumList。

App defines getAlbumsByArtist to pass as prop to AlbumSearch.应用程序定义了getAlbumsByArtist作为道具传递给 AlbumSearch。 In AlbumSearch, when the artist is changed, I useEffect to call getAlbumsByArtist .在 AlbumSearch 中,当艺术家更改时,我使用 Effect 调用getAlbumsByArtist

The app works, but in AlbumSearch I get a warning of React Hook useEffect has a missing dependency: 'getAlbumsByArtist'.该应用程序有效,但在 AlbumSearch 中我收到一条警告,提示 React Hook useEffect 缺少依赖项:'getAlbumsByArtist'。

How can I refactor to fix this warning?如何重构以修复此警告?

import React, { useState, useEffect } from "react";

function App() {
  const [albums, setAlbums] = useState(false);

  useEffect(() => {
    getAlbums();
  }, []);

  function getAlbums() {
    fetch("http://localhost:3001")
      .then((response) => response.json())
      .then((data) => setAlbums(data));
  }

  function getAlbumsByArtist(artist) {
    fetch(`"http://localhost:3001"/albums?artist=${artist}`)
      .then((response) => response.json())
      .then((data) => setAlbums(data));
  }

  return (
    <div>
      <h2>Albums</h2>
      <AlbumSearch getAlbumsByArtist={getAlbumsByArtist} />
      <AlbumList albums={albums} />
    </div>
  );
}

function AlbumSearch({ getAlbumsByArtist }) {
  const [artist, setArtist] = useState("");

  useEffect(() => {
    getAlbumsByArtist(artist);
  }, [artist]);

  const handleArtist = (e) => {
    e.preventDefault();
    setArtist(e.target.value);
  };

  return (
    <div className={`album-search ${showSearchClass}`}>
      <div>
        <label>Artist contains: </label>
        <input
          id="searchArtist"
          type="text"
          value={artist}
          onChange={handleArtist}
        />
      </div>
    </div>
  );
}

function AlbumList({ albums }) {
  return (
    <div>
      <header>
        <div>Id</div> <div>Artist</div> <div>Title</div>{" "}
      </header>
      <div>
        {albums &&
          albums.map((album) => {
            return (
              <div key={album.id}>
                <div>{album.id}</div>
                <div>{album.artist}</div>
                <div>{album.title}</div>
              </div>
            );
          })}
      </div>
    </div>
  );
}

As react will guarantee that a setState() function will never change, you can simply add the getAlbumsByArtist function to your useEffect() dependencies to get the same result.由于 react 将保证setState()函数永远不会改变,您只需将getAlbumsByArtist函数添加到useEffect()依赖项即可获得相同的结果。

useEffect(() => {
    getAlbumsByArtist(artist);
  }, [getAlbumsByArtist, artist]);

Another way would be to simply irgnore the warning by:另一种方法是通过以下方式简单地忽略警告:

useEffect(() => {
   getAlbumsByArtist(artist);
}, [getAlbumsByArtist, artist]); // eslint-disable-line react-hooks/exhaustive-deps

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM