Как вызвать функцию в другом компоненте из другого компонента в реакции js?

У меня есть два файла 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;

Загрузка.js используется только для отображения модального окна?

Rohan Agarwal 10.05.2022 17:29

Не совсем. Он также имеет больше функций.

Abhishek Yadav 10.05.2022 17:30

просто поднимите состояние или используйте контекст или используйте какой-либо инструмент управления состоянием (redux, mobx) reactjs.org/docs/lifting-state-up.htmlreactjs.org/docs/context.html

I-vasilich-I 10.05.2022 17:32

Вы не можете вызывать const [opened, setOpened] = useState(false); извне компонента, это будет означать, что он будет создан только один раз, независимо от того, сколько компонентов Upload вы создаете но это не разрешено. Это должно быть в самой функции.

Juan Mendes 10.05.2022 17:33

Хорошо, спасибо, я должен попробовать другой способ.

Abhishek Yadav 10.05.2022 17:38
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
5
48
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чтобы повторить комментарий @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 />
    </>
  );
};

(обратите внимание, убедитесь, что вы добавили импорт)

Другие вопросы по теме