Мое намерение состоит в том, чтобы создать страницу компонента поиска, имеющую форму и таблицу, которые могут различаться по полям и результатам.
Давайте предположим, что компонент получает пару дочерних элементов:
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 из дочерних фрагментов? Это правильный способ сделать это?
Есть класс React.Children с некоторыми статическими методами act.dev/reference/react/Children
@evolutionxbox, как?
Как насчет использования реквизита? Я знаю, что это противоречит вопросу, но это лучший способ сделать это. Я также добавил типы для ясности, но, пожалуйста, опустите их, если не используете машинописный текст.
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»?
1 минута на рефакторинг
как насчет вышесказанного? @Битлджус
Я не уверен, где в вашем примере находится определение <form>.
Чтобы достичь своей цели — получить доступ к переменным и методам 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>
);
};
Рассмотрите возможность использования реквизита, а не детей. Полагаться на порядок детей хрупко и, скорее всего, сломается.