【问题标题】:React useState() & useContext() - TypeError: setState is not a function - What am I doing wrong?React useState() & useContext() - TypeError: setState is not a function - 我做错了什么?
【发布时间】:2020-08-15 19:07:24
【问题描述】:

我有一些 React 功能组件,我想分享一个状态。在此示例中,两个切换按钮将有条件地显示/隐藏搜索栏和导航栏。

--基于接受的答案的解决方案,位于底部--

我对@9​​87654321@ 完全陌生,我一直在控制台中遇到以下错误: Uncaught TypeError: setSearchbarToggle is not a function 这适用于两个按钮。

下面我有一个过滤的示例代码。这只是我在一个文件中使用状态的示例。在现实生活中,我会在多个功能组件中重用状态。

这是我的header.js

import React, { useState, useContext } from "react"
import "./header.sass"
import { Context } from "./HeaderContext"

export const Header = () => {

  const headerContext = useContext(Context)
  const { navbarToggle, setNavbarToggle, searchbarToggle, setSearchbarToggle } = headerContext

  return (
    <React.Fragment>
      <div className={"sticky-top"}>

        <button onClick={ () => setNavbarToggle( !navbarToggle )}> Toggle Menu </button>
        <button onClick={ () => setSearchbarToggle( !searchbarToggle )}> Toggle Search </button>

        {navbarToggle && <h3>Menu is showing</h3>}
        {searchbarToggle && <h3>Searchbar is showing</h3>}

      </div>
    </React.Fragment>
  )
}
export default Header

这是我的HeaderContext.jsx

import React, { createContext, useState } from "react";
import PropTypes from "prop-types";

export const Context = createContext({});

export const Provider = props => {
  const {
    navbarToggle: initialNavBarToggle,
    searchbarToggle: initialSarchbarToggle,
    children
  } = props;
  
  const [navbarToggle, setNavbarToggle] = useState(initialNavBarToggle);
  const [searchbarToggle, setSearchbarToggle] = useState(initialSarchbarToggle);

  const headerContext = {
    navbarToggle, setNavbarToggle,
    searchbarToggle, setSearchbarToggle
  };

  return <Context.Provider value={headerContext}>{children}</Context.Provider>;
};

export const { Consumer } = Context;

Provider.propTypes = {
  navbarToggle: PropTypes.bool,
  searchbarToggle: PropTypes.bool
};

Provider.defaultProps = {
  navbarToggle: false,
  searchbarToggle: false
};

希望你能给我一些启示

--编辑--

这是我基于接受的答案的代码。

import React, { useContext } from "react"
import { Provider,Context } from "./HeaderContext"

export const HeaderWithContext= () => {

  const headerContext = useContext(Context)
  const { navbarToggle, setNavbarToggle, searchbarToggle, setSearchbarToggle } = headerContext

  return (
    <React.Fragment>
      <div className={"sticky-top"}>

        <button onClick={ () => setNavbarToggle( !navbarToggle )}> Toggle Menu </button>
        <button onClick={ () => setSearchbarToggle( !searchbarToggle )}> Toggle Search </button>

        {navbarToggle && <h3>Menu is showing</h3>}
        {searchbarToggle && <h3>Searchbar is showing</h3>}

      </div>
    </React.Fragment>
  )
}

export const Header = () => {
  return (
    <Provider>
      <HeaderWithContext/>
    </Provider>
  )
};

【问题讨论】:

  • 父组件之一,例如应用程序,必须import { Provider } from "./HeaderContext" 并用&lt;Provider&gt;&lt;Header /&gt;&lt;/Provider&gt; 包装标题(或其祖先组件之一)...你这样做了吗?
  • @Aprillion,不,我没有。让我检查一下。我马上回来
  • 哦,这比预期的要快。它就像你解释的那样工作。您能否将此作为答案,以便我接受? :) 另外,你知道我在哪里可以找到更好的读物吗?
  • 我在答案中添加了一个文档链接 - 同一页面上有示例;)

标签: reactjs react-native react-hooks react-state


【解决方案1】:

其中一个父组件,例如应用程序,必须用Context.Provider 包装标头(或其祖先组件之一):

import { Provider } from "./HeaderContext"
...
<Provider>
  <Header />
</Provider>  

【讨论】:

  • 谢谢,如前所述。它就像一个魅力。伙计,我是在绕圈子吗
猜你喜欢
  • 2021-11-19
  • 1970-01-01
  • 2019-04-05
  • 1970-01-01
  • 1970-01-01
  • 2023-02-17
  • 1970-01-01
  • 2021-10-26
  • 1970-01-01
相关资源
最近更新 更多