Как сохранить состояние React New Context API при маршрутизации между компонентами?

Резюме:

1) Знаете ли вы, как сохранить состояние провайдера контекста, когда он монтируется / размонтируется с помощью маршрутизации? 2) Или вы знаете хорошо поддерживаемую реализацию Flux, которая поддерживает несколько отдельных хранилищ?

В деталях:

Помимо собственного состояния компонентов React, я до сих пор использовал в основном redux. Помимо того, что мне не нравится идея глобального управления каждым состоянием, даже если это может быть актуально только для поддерева, это также становится проблемой для моего нового проекта.

Мы хотим динамически загружать компоненты и добавлять их через маршрутизацию в приложение. Чтобы иметь возможность иметь компоненты, готовые к подключению и воспроизведению, мы хотим, чтобы они заботились о своем собственном состоянии (сохраняли его, запрашивали его с сервера, предоставляли стратегию для его изменения).

Я читал о том, как динамически добавлять редукторы в глобальное хранилище с помощью redux, но на самом деле я считаю, что подход Reacts Context API намного лучше, когда я могу инкапсулировать какое-то состояние в Provider и использовать его там, где мне это нужно.

Единственная проблема, с которой я сталкиваюсь, заключается в том, что Provider и Consumer являются компонентами React, поэтому, если они являются частью компонента, который монтируется и размонтируется посредством маршрутизации, состояние, которое могло быть создано или получено однажды, исчезнет.

Мне кажется, что нет никакого способа решить это, кроме временного сохранения состояния в локальном хранилище или на сервере. Если есть, дайте мне знать !!!

Если лучшего решения не найти:

Я также подумал о более оригинальной реализации Flux, которая допускала бы несколько хранилищ, которые можно было бы инкапсулировать с помощью соответствующего поддерева компонентов. Но на самом деле я не нашел никакой хорошо поддерживаемой реализации Flux, кроме Redux. Mobx является исключением, но я действительно предпочитаю редукторное решение Redux наблюдаемому решению Mobx. Итак, опять же, если вы знаете, что реализация Flux с несколькими хранилищами поддерживается в хорошем состоянии, пожалуйста, дайте мне знать !!!

Я был бы очень рад некоторым отзывам и надеюсь, что вы укажете мне направление, которое более удовлетворительно, чем динамический редюсер Redux или временно сохраняющееся состояние контекста.

Заранее большое спасибо!

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
5
0
2 609
2

Ответы 2

Итак, я нашел способ обойти проблему с Context (первый вопрос): я сохраняю состояние компонента Provider в переменной. Таким образом, когда этот компонент монтируется снова, он использует «постоянное» состояние в качестве начального значения для своего состояния.

let persistedState = {};
const Context = React.createContext();

export class Provider extends React.PureComponent {

  state = { ...persistedState };

  updateState = (nextState) => this.setState(nextState, () => {
    persistedState = {...this.state};
  });

  render() {
    return (
      <Context.Provider value = {this.state}>
        {this.props.children}
      </Context.Provider>
    );
  }
}

Извините, что это довольно поздний ответ

Вы используете React Router?

Состояние должно сохраняться, и оно не должно очищаться от правильной навигации. Не должно быть перезагрузки страницы, так как это приведет к сбросу состояния.

Вот пример:

import { Router as RootRouter } from 'react-router-dom';
import Router from './routes/Router';

const App = () => {
    return (
        <MyContext value = {useReducer(myReducer, initialState)}>
            <RootRouter history = {browserHistory}>
                <Router />
            </RootRouter>
        </AuthContext>
    );
}
import About from '../components/About';

const Router = () => {
    return (
        <Switch>
            <Route exact path='/about' component = {About}></Route>
        </Switch>
}

На вашем основном домашнем компоненте вы должны использовать Link или Navlink для «переключения» между компонентами. Следовательно, у вас будет что-то вроде ...

import { Link } from 'react-router-dom';

<Link to = "/about">About</Link>

Это переместит вас на страницу about, на которой вы все еще можете получить доступ к стадии контекста, где ничего не очищается.

Есть ли способ использовать постоянное состояние при использовании атрибута target = "_blank" с тегом Link. Я могу использовать постоянное состояние без атрибута target, но при добавлении атрибута оно отображается как пустое. Мне тоже нужен атрибут, так как мне нужно открыть следующую страницу в новой вкладке.

Arpit 01.03.2021 17:42

@Arpit Если вы открываете новую вкладку, она всегда будет очищать состояние. Вы хотите, чтобы состояние сохранялось. Лучший способ сделать это - сохранить его в локальном хранилище, а затем прочитать из него и использовать все, что вы читаете из локального хранилища, в качестве текущего состояния.

Owen 04.04.2021 17:46

Другие вопросы по теме