Один из способов добиться синхронизации состояний между различными частями вашего приложения - использовать React's Context API .
Общая идея заключается в том, чтобы централизовать общее состояние (т. Е. limitInUse
) в (или около) корневом компоненте вашего приложения через провайдера контекста, а затем обернуть дочерние компоненты, которым необходим доступ к общему состоянию черезсоответствующий контекст потребителя:
1.Создайте контекст для общего состояния
Создайте контекст, который дает нам состояние «поставщик» и состояние «потребитель».Потребитель контекста будет использоваться для доступа и взаимодействия с общим состоянием в приложении:
const IsUseContext = React.createContext();
2.Определите доступ к состоянию для общего состояния в корневом компоненте
Далее определите логику получения / установки для общего состояния limitInUse
.Это должно быть определено в состоянии на (или около) корневом уровне вашего приложения.Здесь я определяю это в корневых компонентах state
объекта:
this.state = {
/* Define initial value for shared limitInUse state */
limitInUse : sessionStorage.getItem('inUse'),
/* Define setter method by which limitInUse state is updated */
setLimitInUse: (inUse) => {
/* Persist data to session storage, and update state to trigger re-render */
sessionStorage.setItem('inUse', `${ inUse }`)
this.setState({ limitInUse })
},
}
3.Визуализация провайдера контекста из корневого компонента
Теперь визуализируйте компонент контекста Provider
на корневом уровне вашего приложения и передайте объект state
с помощью провайдера value
prop.Объект state
теперь будет доступен из любого потребителя контекста, используемого в приложении (см. Ниже):
/* In your app component's render() method, wrap children with context provider */
<IsUseContext.Provider value={ this.state }>
<LimitsIndicator />
<InputComponent />
</IsUseContext.Provider>
4.Обновление общего состояния в дочернем компоненте
Наконец, мы получаем доступ к общим limitInUse
из вложенных дочерних компонентов нашего приложения через потребителя нашего контекста.Обратите внимание, что состояние и метод установки, определенные в объекте, переданном в value
prop нашего провайдера, доступны и доступны:
/* Update shared limitInUse state via context consumer */
return (<IsUseContext.Consumer>
{ ({ setLimitInUse }) => <input onChange={
(event) => setLimitInUse(event.currentTarget.value) } />
}
</IsUseContext.Consumer>)
Отображение общего состояния в дочернем компоненте
/* Access shared limitInUse via context consumer */
return (<IsUseContext.Consumer>
{ ({ limitInUse }) => (<div> {limitInUse} </div>) }
</IsUseContext.Consumer>)
Для полной рабочей демонстрации см. this jsFiddle .Надеюсь, это поможет!