Реагировать на контекстный API перехват

#javascript #reactjs #redux #react-redux

#javascript #reactjs #сокращение #реагировать-redux

Вопрос:

Я довольно новичок в Context API. Итак, я хочу, чтобы при нажатии на кнопку в ButtonComponent все в ButtonComponent также исчезало в ImageComponent, но когда я нажимаю на кнопку, ничего не происходит. Я как бы застрял в этом, я был бы очень благодарен, если бы кто-нибудь помог мне, если это возможно. Заранее спасибо!

 //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 amp;amp; (
        <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 amp;amp; (
        <React.Fragment>
          <img src="icons/icon.png" alt="" />
          <caption>Image </caption>
        </React.Fragment>
      )}
    </div>
  );
};
  

Ответ №1:

Мы создали здесь 2 контекста вместо 1

Я создаю codesendbox, чтобы мы могли увидеть исправление.

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

Мы должны создать контекст только один раз, чтобы обернуть компонент приложения поставщиком, и мы можем использовать этот контекст, как вы, везде, где мы хотим

И относительно новичка, из вашего кода кажется, что вы понимаете, что делаете

о вашем комментарии — прикрепил картинку

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

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

1. Компонент кнопки отображается в другом месте на боковой панели, которая отображается в приложении, которое я забыл вставить в код. В любом случае я удаляю контекст из приложения, он просит меня импортировать скрытого поставщика, я делаю это следующим образом (импорт HiddenProvider из «./ HiddenContext»;), А затем выдает мне эту ошибку (ошибка при попытке импорта: ‘./ HiddenContext’ не содержит экспорта по умолчанию (импортируется как ‘HiddenProvider’

2. итак, вам нужно добавить экспорт по умолчанию, как в codesendbox

3. Это ужасно, но при нажатии на кнопку ничего не происходит. Спасибо, чувак, ты пытался, я сейчас буду спать.

4. Да, может быть, ты устал, посмотри на codesandbox завтра 🙂

5. Он проснулся до завтра, теперь я получил ошибку (недопустимый вызов перехвата. Перехваты могут вызываться только внутри тела функционального компонента. Это может произойти по одной из следующих причин: 1. Возможно, у вас разные версии React и средства визуализации (например, React DOM) 2. Возможно, вы нарушаете правила перехватов 3. У вас может быть более одной копии React в одном приложении

Ответ №2:

Вы пытаетесь получить доступ к значению контекста вне поставщика (в App ). Попробуйте удалить это из App , например, так:

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

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

1. Я удаляю HiddenProvider из приложения, и он просит меня импортировать HiddenProvider. Я импортирую поставщика следующим образом (импортирую HiddenProvider из «./ HiddenContext»;), А затем он выдает мне эту ошибку (ошибка при попытке импорта: ‘./ HiddenContext’ не содержит экспорта по умолчанию (импортируется как ‘HiddenProvider’)