useEffect () TypeError: e не является функцией - PullRequest
0 голосов
/ 14 июля 2020

Я получаю TypeError: e is not a function

в MessagePort. C .port1.onmessage (response.production.min. js: 24)

по причинам, которые я не понимаю в useEffect (). Я понимаю, что это, вероятно, неясная проблема, связанная с моей кодовой базой, поскольку я не могу воспроизвести в codeandbox, но решил, что все равно выброшу это. блок

useEffect(() => {if (someVar) console.log('asdf')}, [button])

Ответы [ 3 ]

2 голосов
/ 14 июля 2020

Мое первое предположение состоит в том, что вы на самом деле не собираетесь возвращаться из useEffect, но неправильно использовали сокращенный синтаксис и не осознавали, что он использует неявный возврат ( читайте здесь о стрелочные функции и неявный возврат).

Функция, возвращаемая из useEffect, будет выполняться как очистка (как указано в комментариях). То, что вы возвращаете из эффекта, будет зависеть от условия, но ни в том, ни в другом случае он не вернет функцию. Если someVar является ложным, он вернет someVar. Если someVar истинно, он вернет значение console.log(), которое равно undefined.

См. Ниже, что происходит, когда useEffect возвращает false (нажмите кнопку «размонтировать», чтобы увидеть эффект).

const {useState, useEffect} = React;

const Example = () => {
  const [toggle, setToggle] = useState(true);
   
   return (
    <div>
      {toggle ? <Child /> : null}
      <button onClick={() => setToggle(!toggle)}>unmount</button>
    </div>)
}
const Child = () => {
   useEffect(() => false);
   
   return <span />
}


ReactDOM.render(<Example />, 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>

Вы всегда должны использовать длинную стрелку в форме стрелки при использовании эффекта, если только вы не собираетесь передавать его только для очистки.

0 голосов
/ 14 июля 2020

Я переопределил response-dom и реагирую на пакеты разработки, и вот мы. Я возвращал логическое значение в fn, предоставленном для useEffect. коды и ящик

введите описание изображения здесь

0 голосов
/ 14 июля 2020

useEffect ожидает возврата функции очистки, альтернативы жизненному циклу componentWillUnmount (), но это необязательно. Таким образом, возникает ошибка, потому что someVar && console.log('asdf') не является функцией.

useEffect(() => {
  if (someVar) console.log('asdf');

  return () => {
    // do something while leaving this component.
  };
}, [button)

https://reactjs.org/docs/hooks-reference.html#useeffect

...