簡體   English   中英

在回調中反應自定義鈎子

[英]React custom hooks in callback

我正在嘗試在回調邏輯中使用我的自定義鈎子,如下所示:

import React, { useEffect, useState } from 'react';
import useDataChange from '../../hooks/useDataChange';


const SomeComponent = () => {
  return (
    <Table
      handleTableChange={data => useDataChange(data)}
    />
  );
};


export default SomeComponent;

我的自定義鈎子(只是為了簡化)看起來像這樣:

const useDataChange = data => {
  console.log(data);
};

export default useDataChange;

簡而言之,當表中的數據發生更改時(即當 Table 組件中的 handleTableChange 被觸發時),應該觸發自定義鈎子。 相反,我得到:

不能在回調中調用 React Hook “useDataChange”。 React Hooks 必須在 React function 組件或自定義 React Hook function react-hooks/rules-of-hooks 中調用

表數據更改時如何使用它?

理解 hooks 的關鍵是從組件中提取出一些 react 代碼。 所以你的第一步是讓它在組件內部工作

const SomeComponent = () => {
  const [data, setData] = useState([])

  return (
    <Table
      handleTableChange={setData}
    />
  );
};

根據您的代碼,我沒有看到您需要掛鈎或副作用的地方。 但是讓我們假設您確實想要運行一些簡單的副作用:

const SomeComponent = () => {
  const [data, setData] = useState([])
  const [modifiedData, setModifiedData] = useState([])

  useEffect(() => {
    //here we're just going to save the current data stream into a new state variable for simplicity
    setModifiedData(data)
  }, [data])

  return (
    <Table
      handleTableChange={setData}
      data={modifiedData}
    />
  );
};

所以現在我們有了一些產生副作用的邏輯。 現在您可以將其提取到自己的鈎子中。

const useModifiedData = (data) => {
  const [modifiedData, setModifiedData] = useState(data)

  useEffect(() => {
    setModifiedData(data)
  }, [data])

  return modifiedData
}

const SomeComponent = () => {
  const [data, setData] = useState([])

  const modifiedData = useModifiedData(data)

  return (
    <Table
      handleTableChange={setData}
      data={modifiedData}
    />
  );
};

在這里,您有一個位於組件邏輯之外的鈎子,因此它現在可以在自己的文件中 go 並在您的項目中使用。

就像它說React Hooks must be called in a React function component or a custom React Hook function react-hooks/rules-of-hooks React 有這個限制,因此它可以跟蹤 state 和效果。 在您的情況下,您可以定義自定義掛鈎以返回 function 執行所需的工作,而不是直接在您的掛鈎中執行。

在這種情況下,您的自定義掛鈎文件將如下所示 -

const useDataChange = () => data => {
    console.log(data);
};

export default useDataChange;

然后在您的組件中,您可以像這樣使用它 -

import React, { useEffect, useState } from 'react';
import useDataChange from '../../hooks/useDataChange';


const SomeComponent = () => {
    const callback = useDataChnage();
    return (
    <Table handleTableChange={callbackdata} />
   );
};

export default SomeComponent;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM