Проблема:
Я хочу иметь простой логический флаг, который будет true
при открытии модального режима и false
при закрытии.И я хочу, чтобы другие компоненты реагировали реактивно, зависит от этого флага
Я надеюсь, что есть способ сделать это только с реле ( У Apollo есть решение для этого ).Я не хочу подключать редукс MOBX или что-то в этом роде (это просто логический флаг!).
Что у меня уже есть:
Возможно использовать commitLocalUpdate
вЧтобы изменить ваше состояние.Действительно, я смог создать и изменить свой новый флаг следующим образом:
class ModalComponent extends PureComponent {
componentDidMount() {
// Here I either create or update value if it exists
commitLocalUpdate(environment, (store) => {
if (!store.get('isModalOpened')) {
store.create('isModalOpened', 'Boolean').setValue(true);
} else {
store.get('isModalOpened').setValue(true);
}
});
}
componentWillUnmount() {
// Here I mark flag as false
commitLocalUpdate(environment, (store) => {
store.get('isModalOpened').setValue(false);
});
}
render() {
// This is just react component so you have full picture
return ReactDOM.createPortal(
<div
className={ styles.modalContainer }
>
dummy modal
</div>,
document.getElementById('modal'),
);
}
}
Задача:
Как реактивное обновление других компонентов зависит от этого флага? IЯ не могу получить свой флаг следующим образом:
const MyComponent = (props) => {
return (
<QueryRenderer
environment={ environment }
query={ graphql`
query MyComponentQuery {
isModalOpened
}`
} //PROBLEM IS HERE GraphQLParser: Unknown field `isModalOpened` on type `Query`
render={ ({ error, props: data, retry }) => {
return (
<div>
{data.isModalOpened}
<div/>
);
} }
/>);
};
Поскольку компилятор Relay выдает мне ошибку: GraphQLParser: Unknown field 'isModalOpened' on type 'Query'.
И последняя проблема: Как избежать запроса к серверу? Эта информация хранится на стороне клиента, поэтому нет необходимости запрашивать ее.
Я знаю, что есть несколько похожих вопросов, таких как , и , .Но они не задают самую сложную часть реактивного обновления , а ответы устарели.