Почему подключенный компонент react-redux работает не как обычная функция, а как дочерний компонент react?

#javascript #reactjs #redux #react-redux

#javascript #reactjs #redux #react-redux

Вопрос:

Я пытаюсь создать внешний функциональный компонент, которому не нужно возвращать какой-либо JSX, а просто нужно отправить некоторое внутреннее состояние React в хранилище Redux. Чтобы сохранить App.js чистоту, я пытался сделать это во внешнем файле. По какой-то причине приведенный ниже код, где ChromeStoreToReduxStore отображается как дочерний компонент, не выдает ошибку.

ChromeStoreToReduxStore.js

 import { connect } from 'react-redux';
import * as actions from '../popupRedux/actions'

function ChromeStoreToReduxStore (props) {
  console.log(props)

  return null
}

export default connect(null, actions)(ChromeStoreToReduxStore);

  

App.js

 function App (props) {

  //state to keep track of local chrome store
  const [chromeStore, updateChromeStore] = useState({})

  ...
  console.log(ChromeStoreToReduxStore)

 ...
  return (
    <div className="App">
      <ChromeStoreToReduxStore chromeStore = {chromeStore} />
    </div>
  );
}

export default App
  

Однако вызов компонента, App.js как показано ниже, выдает следующую ошибку: TypeError: ChromeStoreToReduxStore is not a function

 //whenever local store state changes send to redux store
  useEffect(() => {
    ChromeStoreToReduxStore(chromeStore);
  }, [chromeStore])

  

console.log Ниже показано, что это, по-видимому, памятка react. Кто-нибудь может объяснить, почему я не могу вызвать эту функцию, завернутую в connect обычную функцию, и почему она, похоже, должна отображаться как дочерняя функция React?

Я знаю, что мог бы просто подключиться к хранилищу внутри App.js , но хотел бы знать, почему вышеуказанное не работает.

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

Комментарии:

1. функция connect из react-redux — это СПЕЦИАЛЬНАЯ функция, которая обертывает вашу функцию в компоненте класса для обеспечения дополнительной функциональности, что делает ее больше не функцией, а классом.

2. @JacobSmit ах, хорошо. Так что, я думаю, это означает, что его просто нужно будет поместить в мой оператор return и отобразить, как любой другой компонент класса?

3. Или создайте перехват, затем добавьте перехват к компоненту и получите оба: перехват для вызова из любого функционального компонента или компонент ChromeToReduxStore, который вы можете добавить к любому рендерингу

4. что вы подразумеваете под добавлением хука? Как бы я вызвал перехват react из другого компонента? Не могли бы вы привести очень простой пример того, как я мог бы это сделать?

5. Это действительно грубый пример того, что я пытался сказать: https://stackblitz.com/edit/react-ts-h53s7z?file=index.tsx