繁体   English   中英

React Hook useCallback 缺少依赖项:

[英]React Hook useCallback has a missing dependency:

你好,我得到了这个:

第 82:5 行:React Hook useCallback 缺少依赖项:'product'。 包括它或删除依赖项数组。 如果您只需要“setProduct”调用中的“product”,您还可以执行功能更新“setProduct(p => ...)” react-hooks/exhaustive-deps Line 95:5: React Hook useCallback has a missing dependency : '产品'。 包括它或删除依赖项数组。 如果您只需要“setProduct”调用中的“product”,您还可以执行功能更新“setProduct(p => ...)” react-hooks/exhaustive-deps

这是我的产品状态:

 const [product, setProduct] = useState({
    sku: "",
    description: "",
    unisex: true,
    woman: false,
    man: false,
    styles: [],
    materials: [],
    selectedFilesImages: [],
    selectedFilesVideos: [],
    name: "",
    discountPrice: "",
    categories: [],
    defaultPicture: [],
    shop: 0,
    variants: [],
    price: "",
  });

这是我使用 useCallBack 的两个函数

 const addSelectedFilesImages = useCallback(
    (files) => {
      setProduct({ ...product, selectedFilesImages: files });
      console.log(product.selectedFilesImages);
    },
    [product.selectedFilesImages]
  );

  const addSelectedFilesVideos = useCallback(
    (files) => {
      setProduct({ ...product, selectedFilesVideos: files });
      console.log(product.selectedFilesVideos);
    },
    [product.selectedFilesVideos]
  );

这是我将这些函数传递给的组件

          <div className="col-sm-6">
              <FileManger
                addSelectedFiles={addSelectedFilesImages}
                selectFiles={product.selectedFilesImages}
                acceptFormat="image/*"
                videoOrPics="Drop files here or click to upload."
              />
            </div>
            <div className="col-sm-6">
              <FileManger
                addSelectedFiles={addSelectedFilesVideos}
                selectFiles={product.selectedFilesVideos}
                acceptFormat="video/*"
                videoOrPics="Drop video files here or click to upload."
              />
            </div>

如果每次更新产品时我都将产品置于依赖项中,还会呈现 FileManger ,则 FileManager 基于 product.selectedFilesVideos 或 product.selectedFilesImages

这个 linter 警告在最后为您提供了一个选项——因为您只需要useCallback钩子的setProduct函数内的product状态,您应该使用setProduct的函数语法,该语法将前一个产品作为参数传递。

它应该是这样的:

const addSelectedFilesImages = useCallback((files) => {
  setProduct((prevProduct) => { // pass an inline function to setProduct
    return {...prevProduct, selectedFilesImages: files}
  })
}, [])

暂无
暂无

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

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