Как использовать дочерний массив в React

Мое намерение состоит в том, чтобы создать страницу компонента поиска, имеющую форму и таблицу, которые могут различаться по полям и результатам.

Давайте предположим, что компонент получает пару дочерних элементов:

const SearchPage = ({title}) => {
    function handleSubmit() {...}
    
    return (
        <div>
            <div className = "form">
                {chindren[0]}
            </div>
            
            <div className = "table">
                {children[1]}
            </div>
        </div>
    )
}

и теперь используя этот компонент:

const MyPage = () => {
    return (
        <SearchPage title = "Search for fruits">
            <form onSubmit = {handleSubmit}>   <!--this is children[0]-->
                <input useSomethingFromSearchPageHere></input>
                ....
            </form>
            
            <table>                         <!--this is children[1]-->
                ....
            </table>
        </SearchPage>
    )
}

Как получить доступ к переменным и методам SearchPage из дочерних фрагментов? Это правильный способ сделать это?

Рассмотрите возможность использования реквизита, а не детей. Полагаться на порядок детей хрупко и, скорее всего, сломается.

evolutionxbox 20.08.2024 12:54

Есть класс React.Children с некоторыми статическими методами act.dev/reference/react/Children

Teneff 20.08.2024 12:57

@evolutionxbox, как?

Beetlejuice 20.08.2024 13:36
Поведение ключевого слова "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
72
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Как насчет использования реквизита? Я знаю, что это противоречит вопросу, но это лучший способ сделать это. Я также добавил типы для ясности, но, пожалуйста, опустите их, если не используете машинописный текст.

interface SearchPageProps {
  title: string;
  generateForm: (event: React.FormEvent) => React.ReactNode;
  table: React.ReactNode;
}

export const SearchPage: React.FC<SearchPageProps> = ({ title, form, table }) => {
  const handleSubmit = (event: React.FormEvent) => {
  }

  return (
    <div>
      <h1>{title}</h1>
      <div className = "form">
        {generateForm(handleSubmit)}
      </div>

      <div className = "table">
        {table}
      </div>
    </div>
  );
};

const MyPage = () => {
  return (
    <SearchPage
      title = "Search Page"
      generateForm = {(event) => <input useSomethingFromSearchPageHere></input>}
      table = {<table></table>}
    />
  );
};

Как поддержка «формы» может получить доступ к методу «handleSubmit»?

Beetlejuice 20.08.2024 14:22

1 минута на рефакторинг

Ben 20.08.2024 14:28

как насчет вышесказанного? @Битлджус

Ben 20.08.2024 14:31

Я не уверен, где в вашем примере находится определение <form>.

Beetlejuice 20.08.2024 14:46
Ответ принят как подходящий

Чтобы достичь своей цели — получить доступ к переменным и методам SearchPage из дочерних компонентов, вы можете использовать контекстную систему React.

Сначала определите новый контекст, который будет использоваться для передачи метода handleSubmit и любых других необходимых данных или методов.

import React, { createContext, useContext, useCallback } from 'react';
// Create the context
const SearchPageContext = createContext();
// Custom hook to use the context
export const useSearchPage = () => useContext(SearchPageContext);

Обновите компонент SearchPage, чтобы использовать SearchPageContext.Provider для передачи метода handleSubmit и любого другого необходимого состояния или функций.

const SearchPage = ({ title, children }) => {

 const handleSubmit = useCallback((event) => {
     event.preventDefault();
     // Your submit logic here
 }, []);

// The value object includes everything you want to expose to children
const value = { handleSubmit };

return (
    <SearchPageContext.Provider value = {value}>
        <div>
            <div className = "form">
                {children[0]}
            </div>
            
            <div className = "table">
                {children[1]}
            </div>
        </div>
    </SearchPageContext.Provider>
  );
};

В ваших дочерних компонентах (например, в форме внутри MyPage) вы теперь можете использовать хук useSearchPage для доступа к handleSubmit и любым другим данным или методам, которые вы предоставили.

const MyPage = () => {
const { handleSubmit } = useSearchPage(); // Use the custom hook to access context

return (
    <SearchPage title = "Search for fruits">
        <form onSubmit = {handleSubmit}>
            <input placeholder = "Search..." />
            {/* other form elements */}
        </form>
        
        <table>
            {/* table contents */}
        </table>
    </SearchPage>
 );
};

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