Выборка на реакции / редукса не работает должным образом

Я новичок в реакции, и пытаюсь сделать свой первый проект, используя такие функции: реагировать, редукс, реагировать маршрутизатор, редукс-thunk. Я получаю данные из URL с помощью JSON. Он отлично работает на мощных ПК, на плетеных он не будет работать, потому что, как я понимаю, он начинает извлекать, затем пытается отрисовать компоненты без данных, и только потом он получает данные из URL... Также тот же результат, который я получаю, когда я обновляю innerpage, он будет пытаться визуализировать компоненты до того, как получит данные.

Итак, создание магазина:

const middleware = [routerMiddleware(hashHistory)];

const store = createStore( combineReducers({
    reducers:reducers,
    routing:routerReducer
}),compose(applyMiddleware(...middleware, thunk), 
          window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__()));

const history = syncHistoryWithStore(hashHistory, store);

Тогда вот мой провайдер:

ReactDOM.render(
    <Provider store={store}>
    <Router history={history}>     
      <Route path="/" component={withTransition(App)}>
        <IndexRoute component={Projects} />
        <Route path="project/:id/" component={SingleProject}>
        </Route>
      </Route>
    </Router>
    </ Provider>,
    document.getElementsByClassName('root')[0]
)

Я собираю данные таким образом:

function fetchProjRequest(){
  return {
    type: "FETCH_PROJ_REQUEST"
  }
}

function fetchProjSuccess(payload) {
  return {
    type: "FETCH_PROJ_SUCCESS",
    payload
  } 
}

function fetchProjError() {
  return {
    type: "FETCH_PROJ_ERROR"
  }
}

function fetchProj() {
  const URL = "http://****.com/data/proj";
  return fetch(URL, { method: 'GET'})
     .then( response => Promise.all([response, response.json()]));
}

class App extends Component{

  constructor(props){
    super(props);
    this.props.fetchProjWithRedux();

  }


  render(){
    return (
     <div className={styles.app}>
       <Logo />
        <TagFilter />
        <div className={styles.content}>
          {this.props.children}
        </div>
      </div>
    )
  }
}

function mapStateToProps(state){
  return {
    proj: state.proj
  }
}

export default connect(
  state => ({
    proj: state.reducers.projects.proj
  }),
  dispatch =>({
    fetchProjWithRedux: () => {
      fetchProj().then(([response, json]) =>{
        if(response.status === 200){
          dispatch(fetchProjSuccess(json))
        }
        else{
          dispatch(fetchProjError())
        }
      })
    },
  })
)(App);

Было бы здорово, если бы кто-то из вас сказал мне, что я был неправ:(Это очень важно для меня!

1 ответ

Решение

Вот суть того, что позаботится о том, что вам нужно.

Не забудьте ввести isDataLoaded boolean подпереть в своем редукторе и сделать это true когда FETCH_PROJ_SUCCESS называется. Надеюсь, поможет.

Некоторые изменения в вашем коде:

import dataLoader from './dataLoader';

const AppWithLoader = dataLoader(App);

export default connect(
  state => ({
    isDataLoaded: state.proj.isDataLoaded,
    proj: state.reducers.projects.proj
  }),
  dispatch =>({
    dispatchGetData: () => {
      fetchProj().then(([response, json]) =>{
        if(response.status === 200){
          dispatch(fetchProjSuccess(json))
        }
        else{
          dispatch(fetchProjError())
        }
      })
    },
  })
)(AppWithLoader);
Другие вопросы по тегам