Выборка на реакции / редукса не работает должным образом
Я новичок в реакции, и пытаюсь сделать свой первый проект, используя такие функции: реагировать, редукс, реагировать маршрутизатор, редукс-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);