Это приложение звучит как идеальный вариант использования «Подъем состояния вверх», то есть удержание основного состояния в родительском компоненте. Затем вы просто передаете обработчики (чтобы изменить родительское состояние) компоненту A (он становится обработчиком onClick кнопки), а затем передаете состояние, которое вы хотите показать компоненту B.
Когда вы нажимаете кнопку setState вызывается в родительском компоненте, который автоматически повторно отображает все дочерние элементы, чьи реквизиты меняются (включая компонент B).
Вот более подробная информация: https://reactjs.org/docs/lifting-state-up.html
РЕДАКТИРОВАТЬ: ответ ниже напомнил мне, что я, вероятно, должен добавить некоторый код для иллюстрации - но я сделал несколько изменений, которые упрощают вещи.
import React, {useState} from "react":
import A from "...";
import B from "...";
const App = () => {
const [show, setShow] = useState(false);
function handleToggle() {
// Decouple the implementation of the parent state change from the child
// Pass a function to change the state (async/batching reasons)
setShow(show => !show);
}
return (
<div>
<A show={show} onToggle={handleToggle} />
<B show={show} onToggle={handleToggle} />
</div>
)
}
const A = ({show, onToggle}) => (
<div>
<p>show: {show}</p>
<button onClick={onToggle}>
toggle
</button>
</div>
)
const B = ({show, onToggle}) => (
<div>
<p>show: {show}</p>
<button onClick={onToggle}>
toggle
</button>
</div>
)
Так что в основном нам все равно, как состояние у родителя это изменилось. Мы просто знаем, что при нажатии кнопки в дочернем компоненте мы хотим вызвать это изменение. Поэтому все, что нам действительно нужно сделать, - это вызвать функцию, переданную через реквизит - нам не нужно передавать никаких параметров.
Затем родитель будет обрабатывать любые щелчки внутри функции handleToggle
, и вы можете изменить эту реализацию в будущем, чтобы ребенок ничего не знал. Возможно, вы захотите перейти на использование mobx для обработки состояния или запустить другой код перед окончательным изменением состояния. Так как оба развязаны, у вас все хорошо! Я также настроил setShow
для использования функции (преимущества описаны здесь: https://reactjs.org/docs/state-and-lifecycle.html#state -updates-may-be-be-asynchronous ).