#reactjs
#reactjs
Вопрос:
привет, я изучаю react, какой может быть лучший способ передать значение состояния из searchFrom.js для searchHistory.js
src
-Component
-Header.js
-SearchFrom.js
-SearchHistory.js
In Header.js
import Navbar from "./Navbar";
import SearchFrom from "./SearchFrom";
function Header() {
return (
<div className="header__wrapper"&&t;
<Navbar /&&t;
<SearchFrom /&&t;
</div&&t;
);
}
export default Header;
и я хочу, чтобы значение из SearchFrom.js для SearchHistory.js
Комментарии:
1. вы можете использовать context api, который сделает его доступным глобально, реквизиты передаются от родительского компонента к дочернему, в этом случае вы делаете наоборот.
2. Привет @Dipesh, тебе следует более подробно ознакомиться со строками кода. Итак, не могли бы вы, пожалуйста, обновить сообщение более подробным кодом.
Ответ №1:
Для этого конкретного варианта использования вы можете повысить свое состояние до непосредственного общего родительского компонента, то есть компонента приложения. В этом случае будет небольшая prop-drillin&
ошибка. Но если состояние совместно используется несколькими компонентами и если эти компоненты не имеют прямого отношения, то я бы предложил использовать Context
или некоторые сторонние библиотеки, такие как redux
.
Если вы просто повышаете состояние, вы можете сделать следующее
//App.js
const [state, setState] = useState({});
return(
<Header setState={setState} .../&&t;
< SearchHistory data={state} .../&&t;
)
//Header.js
...
return(
< SearchFrom setState={props.setState}&&t;
)
...
//SearchFrom.js
...
//some lo&ic to setState from here via props.setState()
...
//SearchHistory.js
//Use state here via `props.data`
Вы можете прочитать больше о контексте и повышающем состоянии.
Ответ №2:
Пара вещей, которые вы можете сделать:
1. Самый простой способ: это легче понять на паре примеров. Укажите свое состояние в SearchHistory или другом родительском компоненте:
const [searchState, setSearchState ]= useState("");
Создайте обработчик для изменения состояния:
const searchHandler = (val) =&&t; {setSearchState(val)}
Передайте его любому дочернему компоненту, к которому вы хотите получить доступ в родительском состоянии:
<SearchHistory&&t;
<SearchFrom searchHandler={searchHandler}/&&t;
</SearchHistory&&t;
Внутри дочернего компонента вы можете вызвать:
props.searchHandler("new search state")
2.Контекстный API
Это похоже на наличие контейнера, и внутри этого контейнера каждый компонент может получить доступ к состоянию других компонентов, используя «контекст».
подробнее читайте в react docs
3.Redux
Это самый продвинутый (и, возможно, лучший способ изменить ваше состояние). Вероятно, вам следует перейти на redux после того, как вы освоитесь с react, вы можете ожидать, что освоите его как минимум через неделю. Вы можете использовать первые два метода при запуске, а когда будете готовы, перейти к redux.
Краткое объяснение redux: Redux — это менеджер состояний. Вы не должны изменять состояние других компонентов в react.(если вы это сделаете, вы не сможете отслеживать, что изменило состояние ваших компонентов, поэтому это ничем не отличается от прямого изменения html с помощью jquery, вы теряете большинство преимуществ react) С помощью диспетчера состояний каждый компонент может изменять состояние, но они делают это с помощью действий. Когда вы хотите изменить состояние, вы отправляете действие, ваше действие попадает в функцию, называемую reducer, эта функция определяет, что делать с действием. Если вы не уверены, что произошло с состоянием ваших компонентов, вы можете просто просмотреть историю действий и посмотреть, какое действие обновило состояние.
Примечание: Как и в ответе Pramod, я согласен, что если вы не собираетесь делать какие-либо необычные вещи, продолжайте сверлить реквизиты.