Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ajax 在react/redux上提取未正常工作_Ajax_Reactjs_Redux_Fetch_Thunk - Fatal编程技术网

Ajax 在react/redux上提取未正常工作

Ajax 在react/redux上提取未正常工作,ajax,reactjs,redux,fetch,thunk,Ajax,Reactjs,Redux,Fetch,Thunk,我是react的新手,尝试使用以下功能创建我的第一个项目:react、redux、react路由器、redux thunk。我使用json从url获取数据。它在powerfull pc上运行良好,在wicker上它将不工作,因为在我了解的情况下,它开始抓取,然后它尝试渲染没有数据的组件,然后它才从url获取数据。。。同样的结果,当我刷新innerpage时,它将尝试在获取数据之前呈现组件 下面是创建商店的步骤: const middleware = [routerMiddleware(hashH

我是react的新手,尝试使用以下功能创建我的第一个项目:react、redux、react路由器、redux thunk。我使用json从url获取数据。它在powerfull pc上运行良好,在wicker上它将不工作,因为在我了解的情况下,它开始抓取,然后它尝试渲染没有数据的组件,然后它才从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);
如果你们中有人告诉我我错了,那就太好了:这对我来说非常重要

是hoc的要点,它能满足您的需要

确保在减速器中引入isDataLoaded boolean prop,并在调用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);

它应该是这样工作的,因为抓取是异步的。引入一个isLoading布尔值,当您得到响应时,它将变为false。当其为true时,渲染加载程序或其他内容,而不是component@JohnnyKlironomos你有没有看到过这样的实例,如果能在现实中看到这个,那就太好了?你可能还想看看redux的异步中间件,比如。@MichaelPeyper谢谢你,但我已经在使用它了,但它没有帮助…嗯,有趣的模块。我不知道这样的存在。现在我已经找到了解决办法,但在将来,我想我会用它!非常感谢。