Как запустить дочерние функции с помощью родительской кнопки в React?

У меня есть родительский компонент под названием SettingsPage, и на этой странице может быть один из нескольких дочерних компонентов в зависимости от того, что такое tab.

Вот упрощенный пример моей текущей страницы:

const SettingsPage = () => {
  const [tab, setTab] = useState('user');

  return (
    <div className = "settings-page">
      <div className = "content">
        {tab === 'user' && <UserSettings />}
        {tab === 'feed' && <FeedSettings />}
        {tab === 'privacy' && <PrivacySettings />}
      </div>
      <footer>
        { /* how do I trigger onSave function of the child components? */ }
        <button className = "btn btn-save">Save</button>
      </footer>
    </div>
  )
}

/* userSettings.jsx */
const UserSettings = () => {
  const onSave = () => console.info('user settings saved');
  return (
    <div>User Settings</div>
  )
};

/* feedSettings.jsx */
const FeedSettings = () => {
  const onSave = () => console.info('feed settings saved');
  return (
    <div>Feed Settings</div>
  )
};

/* privacySettings.jsx */
const PrivacySettings = () => {
  const onSave = () => console.info('privacy settings saved');
  return (
    <div>Privacy Settings</div>
  )
};

В нижнем колонтитуле родительского компонента у меня есть кнопка сохранения, при нажатии на которую должна запускаться функция onSave соответствующего дочернего компонента. Я не хочу помещать логику сохранения в родительский компонент, поскольку все изменения происходят в дочернем компоненте.

Как правильно это сделать?

Вытащите логику сохранения из компонентов, и тогда вы сможете звонить, когда захотите. Например. Создайте функцию saveFeed, а затем назначьте ее своей кнопке, и тогда вы также сможете вызвать родительский элемент.

Keith 01.03.2024 09:19

Да, правильный способ - поднять свое состояние. В противном случае вы можете использовать пример useImperativeHandle() -

Nick Parsons 01.03.2024 09:21

Полностью повторяя эти комментарии, принятый ответ работает, но это не «простой» способ отреагировать. Это трудный путь, это перевернутая реакция. Родители не должны «запускать» функции у детей (в большинстве случаев). Если вы начнете помещать состояние в эти дочерние компоненты, это будет становиться все сложнее и сложнее. Альтернативой передаче всех вещей родительскому элементу является простое перемещение кнопки JSX в каждого из дочерних элементов. Осмысление того, как React хочет, чтобы вы писали код, одновременно сложно и важно для написания хорошего кода React.

Adam Jenkins 01.03.2024 11:58
Поведение ключевого слова "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
3
304
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
  1. Определите пересылаемую ссылку для каждого дочернего компонента.
  2. Используйте useImperativeHandle в дочерних компонентах.
  3. Управляйте ссылками в родительском компоненте.

Пользовательские настройки.js:

import React, { useImperativeHandle, forwardRef } from 'react';

const UserSettings = forwardRef((props, ref) => {
  const onSave = () => console.info('user settings saved');
  
  // This will expose the onSave method to the parent component via ref
  useImperativeHandle(ref, () => ({
    onSave
  }));

  return <div>User Settings</div>;
});

НастройкиПейдж.js:

import React, { useState, useRef } from 'react';
import UserSettings from './UserSettings'; // Import your components
import FeedSettings from './FeedSettings';
import PrivacySettings from './PrivacySettings';

const SettingsPage = () => {
  const [tab, setTab] = useState('user');
  const activeComponentRef = useRef(null);

  const onSaveClick = () => {
    if (activeComponentRef.current) {
      activeComponentRef.current.onSave();
    }
  };

  return (
    <div className = "settings-page">
      <div className = "content">
        {tab === 'user' && <UserSettings ref = {activeComponentRef} />}
        {tab === 'feed' && <FeedSettings ref = {activeComponentRef} />}
        {tab === 'privacy' && <PrivacySettings ref = {activeComponentRef} />}
      </div>
      <footer>
        <button className = "btn btn-save" onClick = {onSaveClick}>Save</button>
      </footer>
    </div>
  );
};

Спасибо, это именно то, что я искал! Хотя синтаксис немного неясен, но я думаю, это просто особенность React.

Hao Wu 01.03.2024 09:53

Пожалуйста, рад, что смог помочь. Ха-ха, реакция — это весело, когда дело касается синтаксиса.

YUSOF KHAN 01.03.2024 10:01

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

Реализация окна поиска мест в ReactJS
Next.js 14: Необнаруженная ошибка: инвариантный ожидаемый маршрутизатор приложений должен быть установлен для моего веб-приложения реагирования 18
Реагировать на проблему собственного календаря при использовании его в представлении и настройке его в соответствии с высотой и шириной представления
Какой репозиторий отвечает за написание этого сообщения об ошибке?
Ошибка типа: невозможно прочитать свойства неопределенного значения (чтение «документа») с помощью jquery
Внутренний сервер VPS работает по протоколу http вместо https
Framer не видит существующий пакет npm
Токен доступа, полученный с помощью потока входа в систему с кодом авторизации и областью действия «drive.file», позже используется для выбора файла, а на сервере возвращается «объект не найден»
Я хочу реализовать кнопку «Загрузить больше» на моем следующем сайте JS
Прокрутите до элемента из другого компонента React Typescript