React:使用 Refs 修复缺少的依赖警告 useEffect

Posted

技术标签:

【中文标题】React:使用 Refs 修复缺少的依赖警告 useEffect【英文标题】:React: Fix missing dependency warning useEffect with Refs 【发布时间】:2020-11-24 11:24:45 【问题描述】:

我有一个功能组件,如果我在调用 API 时遇到错误,我想打开一个显示该错误的模态。决定此模式是否打开的属性使用上下文 API 存储。 所以我在组件中有这段代码:

  const modalContext = useContext(ModalContext);

  useEffect(() => 
    if (error !== "") 
      modalContext.showModal();
    
  , [error]);

但我有这个警告:

React Hook useEffect 缺少一个依赖项:'modalContext'。要么包含它,要么移除依赖数组 react-hooks/exhaustive-deps

我读到要解决这个问题,我可以使用 refs,所以我更改了代码,现在我有了:

  const modalContextRef = React.useRef(false);
  modalContextRef.current = useContext(ModalContext);

  useEffect(() => 
    if (error !== "") 
      modalContextRef.current.showModal();
    
  , [error]);

我想知道这是否是正确的做法,或者这是一种不好的做法。

谢谢!

【问题讨论】:

这取决于showModal 是什么以及是否可以有stale closure showModal 是一个改变“isModalOpen”布尔值的函数。这是我保存在上下文 API 中的变量。我想使用上下文 API 来看看它如何与这个有模式的例子一起工作,而不是在几个组件中传递变量“isModalOpen” 【参考方案1】:

也许以下对你有用:

const ModalContext = React.createContext();
const ModalProvider = ( children ) => 
  const [isModalOpen, setIsModalOpen] = React.useState(
    false
  );
  //show modal never changes because using useCallback
  const showModal = React.useCallback(
    () => setIsModalOpen(true),
    []
  );
  return (
    <ModalContext.Provider
      value=
        isModalOpen,
        showModal,
      
    >
      children
    </ModalContext.Provider>
  );
;
const Modal = () => 
  const  isModalOpen  = React.useContext(ModalContext);
  return isModalOpen ? 'modal shows' : null;
;
const App = () => 
  const [error, setError] = React.useState('');
  const  showModal  = React.useContext(ModalContext);

  React.useEffect(() => 
    if (error !== '') 
      showModal();
    
  , [error, showModal]);
  return (
    <div>
      <button onClick=() => setError('error')>
        set error
      </button>
      <Modal />
    </div>
  );
;

ReactDOM.render(
  <ModalProvider>
    <App />
  </ModalProvider>,
  document.getElementById('root')
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.4/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.4/umd/react-dom.production.min.js"></script>
<div id="root"></div>

【讨论】:

是的,这行得通!它帮助我以更有效的方式重新构建我的代码,并且这些回调不需要设置依赖项“modalContext”,只需设置函数“showModal”。多亏了这一点,当我隐藏模态时,React 不会执行 useEffect 再次显示模态。谢谢!【参考方案2】:

您可以尝试将 modalContext 添加到其依赖项中。

useEffect(() => 
  if (error !== "") 
    modalContext.showModal();
  
, [error, modalContext]);

【讨论】:

当然应该。试一试 是这样吗? modalContext .showModal(); modalContex.showModal(); 之间有一个空格 抱歉,这只是一个印刷错误。我会改正的。 以循环结束,因为我显示模态,然后单击关闭按钮的模态,但反应检测到该依赖项的变化并在 useEffect 中执行该代码,当用户再次显示模态关闭它。 哦。那是因为我没有看到你的完整代码 Encarna。您可以设置一个额外的状态来控制模式何时显示并出现错误。

以上是关于React:使用 Refs 修复缺少的依赖警告 useEffect的主要内容,如果未能解决你的问题,请参考以下文章

如何绕过 React 的 useEffect() “缺少依赖项”警告?

如何解决此警告:“React Hook useEffect 缺少依赖项:'history'”?

我收到一个奇怪的警告“React hook useEffect 缺少依赖项”

如何修复 React Redux 和 React Hook useEffect 缺少依赖项:'dispatch'

反应:在有效的时间间隔内缺少依赖警告

React Hook useEffect缺少依赖项。包括它们或删除依赖项数组