Компонент не перерисовывается при изменении контекста - PullRequest
0 голосов
/ 27 мая 2020

Я играл с api контекста реакции, и я просто не понимаю, почему он не работает.

У меня есть компонент с контейнером, который должен отображаться или скрываться в зависимости от оценщика, хранящегося в контекст.

Это компонент:

import React, { useContext } from 'react';
import ResultsContext from '../../context/results/resultsContext';

const ResultsPanelContainer = () => {
  const resultsContext = useContext(ResultsContext);
  const { showResults } = resultsContext;

  console.log('showResults in ResultsPanelConatiner: ', showResults);
  return (
    <div
      className='container-fluid panel'
      style={{ display: showResults ? 'block' : 'none' }}
    >
      <div className='container'>
        <div className='row'>
          <div className='col'>
            <h1 className='display-4'>Results.Panel.js</h1>
          </div>
        </div>
      </div>
    </div>
  );
};

export default ResultsPanelContainer;

Для полноты контекст разделен на три части: вызов самого контекста, файл состояния и редуктор. Они отображаются ниже:

resultsContext. js

import { createContext } from 'react';
const resultsContext = createContext();
export default resultsContext;

ResultsState. js

import React, { useReducer } from 'react';

// import axios from 'axios';
import ResultsContext from './resultsContext';
import ResultsReducer from './resultsReducer';

import { UPDATE_SHOW_RESULTS } from '../types';

const ResultsState = (props) => {
  const initialState = {
    showResults: false,
  };

  const [state, dispatch] = useReducer(ResultsReducer, initialState);

  const updateShowResults = (data) => {
    console.log('updateShowResults - ', data);
    dispatch({
      type: UPDATE_SHOW_RESULTS,
      payload: data,
    });
  };

  return (
    <ResultsContext.Provider
      value={{
        showResults: state.showResults,
        updateShowResults,
      }}
    >
      {props.children}
    </ResultsContext.Provider>
  );
};

export default ResultsState;

resultsReducer. js

import { UPDATE_SHOW_RESULTS } from '../types';

export default (state, action) => {
  switch (action.type) {

    case UPDATE_SHOW_RESULTS:
      return {
        ...state,
        showResults: action.payload,
      };

    default:
      return state;
  }
};

Изменение запускается нажатием кнопки в отдельном компоненте, и этот вызывает обновление в контексте, как показано, когда вы регистрируете его в консоли. Однако компонент не перерисовывается.

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

Я упускаю что-то явно очевидное?

Заранее спасибо. Стеф

1 Ответ

0 голосов
/ 27 мая 2020

Забудьте о вышесказанном ... Я идиот - заключил две отдельные части приложения в два отдельных экземпляра ResultsState, которые не взаимодействовали. Сделал это:

const App = () => {
  return (
    <Fragment>
      <UsedDataState>
        <Header />
      </UsedDataState>
      <main>
        <ExportPanelContainer />
        <ResultsState>
          <SendQueryState>
            <OrQueryState>
              <AndQueryState>
                <QueryPanelContainer />
              </AndQueryState>
            </OrQueryState>
          </SendQueryState>
         </ResultsState>
         <ResultsState>
          <ResultsPanelContainer />
        </ResultsState>
      </main>
    </Fragment>
  );
};

Вместо этого:

const App = () => {
  return (
    <Fragment>
      <UsedDataState>
        <Header />
      </UsedDataState>
      <main>
        <ExportPanelContainer />
        <ResultsState>
          <SendQueryState>
            <OrQueryState>
              <AndQueryState>
                <QueryPanelContainer />
              </AndQueryState>
            </OrQueryState>
          </SendQueryState>
          <ResultsPanelContainer />
        </ResultsState>
      </main>
    </Fragment>
  );
};

Надеюсь, это будет полезно для кого-то еще ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...