У меня есть два файла header.js и upload.js. В upload.js у меня есть всплывающее окно, которое должно открываться, когда я нажимаю кнопку загрузки в header.js.
Итак, в основном я хочу вызвать функцию setOpened, присутствующую в upload.js, из header.js.
заголовок.js
import React from 'react'
const Header = () => {
return (
<div>
<Link
data-bs-toggle = "modal"
onClick = {() => setOpened(true)}
role = "button"
>Upload</Link>
</div>
)
}
export default Header
загрузить.js
import React from 'react'
const [opened, setOpened] = useState(false);
const Upload = () => {
return (
<div>
<Modal
opened = {opened}
onClose = {() => setOpened(false)}
title = "Introduce yourself!"
>
{/* Modal content */}
</Modal>
</div>
)
}
export default Upload
В App.js
import Header from './component/Header';
import Footer from './component/Footer';
import Upload from './component/Upload';
function App() {
return (
<Header/>
<Routes>
<Route path = "/upload" element = {<Upload/>}/>
</Routes>
<Footer/>
);
}
export default App;
Не совсем. Он также имеет больше функций.
просто поднимите состояние или используйте контекст или используйте какой-либо инструмент управления состоянием (redux, mobx) reactjs.org/docs/lifting-state-up.htmlreactjs.org/docs/context.html
Вы не можете вызывать const [opened, setOpened] = useState(false); извне компонента, это будет означать, что он будет создан только один раз, независимо от того, сколько компонентов Upload вы создаете но это не разрешено. Это должно быть в самой функции.
Хорошо, спасибо, я должен попробовать другой способ.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Чтобы повторить комментарий @I-vasilich-I о подъем состояния вверх, вы должны переместить свое модальное открытое состояние на более высокий уровень (например, в App) и передать это состояние каждому дочернему элементу, который в нем нуждается.
Например
const Header = ({ openModal }) => (
<div>
<Link data-bs-toggle = "modal" onClick = {openModal} role = "button">
Upload
</Link>
</div>
);
const Upload = ({ opened, closeModal }) => (
<div>
<Modal opened = {opened} onClose = {closeModal} title = "Introduce yourself!">
{/* Modal content */}
</Modal>
</div>
);
const App = () => {
const [opened, setOpened] = useState(false);
return (
<>
<Header openModal = {() => setOpened(true)} />
<Routes>
<Route path = "/upload" element = {<Upload opened = {opened} closeModal = {() => setOpened(false)} />} />
</Routes>
<Footer />
</>
);
};
(обратите внимание, убедитесь, что вы добавили импорт)
Загрузка.js используется только для отображения модального окна?