【问题标题】:React Context API + hook反应上下文 API + 钩子
【发布时间】:2020-11-01 19:17:50
【问题描述】:

我对 Context API 比较陌生。因此,基本上,当我按下 ButtonComponent 中的 Button 时,我希望 ButtonComponent 中的所有内容也会在 ImageComponent 中消失,但是当我单击 Button 时,什么也没有发生。我有点坚持这一点,如果可能的话,如果有人帮助我,我将非常感激。提前致谢!

//HiddenContext
import React from "react";
export const HiddenContext = React.createContext(false);

function HiddenProvider({ children }) {
  const [hideButton, setHideButton] = React.useState(false);

  function handleClick() {
    setHideButton(true);
  }

  return (
    <HiddenContext.Provider value={{ hideButton, handleClick }}>
      {children}
    </HiddenContext.Provider>
  );
}


// App Component/Parent
import React, { useState } from 'react';
import './App.css';
export const HiddenContext = React.createContext(false);
function HiddenProvider({ children }) {
  const [hideButton, setHideButton] = React.useState(false);

  function handleClick() {
    setHideButton(true);
  }

  return (
    <HiddenContext.Provider value={{ hideButton, handleClick }}>
      {children}
    </HiddenContext.Provider>
  );
}

 function App() {
  const { hideButton } = React.useContext(HiddenContext);
  return (
    <HiddenProvider>
      <div className="App">
        <ImageComponent hideButton={hideButton} /> 
      </div>
    </HiddenProvider>
  );
}


//ButtonComponent
import React, {useState,ReactFragment} from 'react'
import { HiddenContext, } from './HiddenContext';
function ButtonComponent() {
  const { hideButton, handleClick } = React.useContext(HiddenContext);

  return (
    <React.Fragment>
      {!hideButton && (
        <li>
          <img className="image" src="./icons" alt="" />
          <Button
            onClick={handleClick}
            variant="outlined"
            className="button__rightpage"
          >
            Hide
          </Button>
          <caption className="text"> Hide</caption>
        </li>
      )}
    </React.Fragment>
  );
}

// ImageComponent
import React, {useState, ReactFragment} from 'react'
import { HiddenContext, } from './HiddenContext';
const ImageComponent = () => {
  const { hideButton } = React.useContext(HiddenContext);
  return (
    <div>
      {!hideButton && (
        <React.Fragment>
          <img src="icons/icon.png" alt="" />
          <caption>Image </caption>
        </React.Fragment>
      )}
    </div>
  );
};

【问题讨论】:

    标签: javascript reactjs redux react-redux


    【解决方案1】:

    我们在这里创建了 2 个上下文 - 而不是 1 个

    我制作了一个代码发送框供我们查看修复。

    https://codesandbox.io/s/focused-night-i95fr

    我们应该只创建一次上下文,用提供者包装 App 组件,我们可以像你在任何我们想要的地方一样使用这个上下文

    而且相对于初学者来说,从你的代码看来你明白自己在做什么

    关于您的评论 - 附上图片

    【讨论】:

    • Button 组件在其他地方呈现在侧边栏中,它在应用程序中呈现,我忘记放入代码中。无论如何我从应用程序中删除上下文它要求我导入隐藏提供程序我这样做(从“./HiddenContext”导入HiddenProvider;)然后它给了我这个错误(尝试导入错误:'./HiddenContext'不包含默认导出(导入为“HiddenProvider”
    • 所以你需要像在代码发送框中一样添加默认导出
    • 这太可怕了,但是当我单击按钮时仍然没有任何反应。谢谢你试过我现在要睡觉了。
    • 是的,也许你累了,明天看看codesandbox :)
    • 它一直工作到明天现在我得到了错误(无效的钩子调用。钩子只能在函数组件的主体内调用。这可能由于以下原因之一发生:1.您可能有React 和渲染器的版本不匹配(例如 React DOM) 2. 你可能违反了 Hooks 规则 3. 你可能在同一个应用程序中拥有多个 React 副本
    【解决方案2】:

    您正在尝试访问提供程序之外的上下文值(在App 中)。 尝试将其从 App 中删除,如下所示:

     function App() {
       return (
         <HiddenProvider>
           <div className="App">
               <ImageComponent  /> 
           </div>
         </HiddenProvider>
       );
    }
    

    【讨论】:

    • 我从应用程序中删除了 HiddenProvider,它要求我导入 HiddenProvider。我像这样导入 Provider(从“./HiddenContext”导入 HiddenProvider;)然后它给了我这个错误(尝试导入错误: './HiddenContext' 不包含默认导出(导入为 'HiddenProvider')
    猜你喜欢
    • 1970-01-01
    • 2021-08-07
    • 1970-01-01
    • 2021-10-26
    • 2019-11-23
    • 1970-01-01
    • 2019-08-03
    • 2019-04-19
    • 1970-01-01
    相关资源
    最近更新 更多