#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’)