从redux中访问服务器道具

Access server props from within redux?

本文关键字:服务器 访问 redux      更新时间:2024-02-08

我正在尝试使用reduxreact-enginereact-router

我的问题是react-engine提供了一个来自服务器的props对象。如何从ProvidedApp中访问这些道具?

ProvidedApp.js

import React from 'react'
import { connect, Provider } from 'react-redux'
import App from './app'
import { mapStateToProps, mapDispatchToProps, store } from './redux-stuff'
// Connected Component
let ConnectedApp = connect(
  mapStateToProps,
  mapDispatchToProps
)(App)
let ProvidedApp = () => (
  <Provider store={store}>
    <ConnectedApp/>
  </Provider>
)
export default ProvidedApp

Routes.js

import React from 'react'
import { Router, Route } from 'react-router'
import Layout from './views/Layout'
import App from './views/ProvidedApp'
module.exports = (
  <Router>
    <Route path='/' component={Layout}>
      <Route path='/app' component={App} />
      <Route path='/app/dev' component={App} />
    </Route>
  </Router>
)

我还认为我的配置有点不稳定,我无法让Provider以任何其他方式工作。如果有办法让Provider包裹Router,我很想让它发挥作用。


以下是当我将Provider移动到Router 上方时的一些代码

ConnectedApp.js

import React from 'react'
import { connect, Provider } from 'react-redux'
import App from './app'
import { mapStateToProps, mapDispatchToProps} from './redux-stuff'
let ConnectedApp = connect(
  mapStateToProps,
  mapDispatchToProps
)(App)
export default ConnectedApp

Routes.js

import React from 'react'
import { Provider } from 'react-redux'
import { Router, Route } from 'react-router'
import { store } from './redux-stuff'
import Layout from './views/Layout'
import App from './views/ConnectedApp'
module.exports = (
  <Provider store={store}>
    <Router>
      <Route path='/' component={Layout}>
        <Route path='/app' component={App} />
      </Route>
    </Router>
  </Provider>
)

我得到这个错误:

Could not find "store" in either the context or props of "Connect(App)". Either wrap the root component in a <Provider>, or explicitly pass "store" as a prop to "Connect(App)".


更新

我发现我可以从ProvidedApp中的第一个示例中的代码访问。但我不知道该怎么把它传给Redux。

let ProvidedApp = (props) => {
  console.log(props)
  return (
    <Provider store={store}>
      <ConnectedApp/>
    </Provider>
  )
}

似乎我需要包装reducerstore,并将ServerProps传递到默认状态,如下所示。

let getDefaultState = (serverProps) => {
  return {
    'appName': serverProps.appName 
  }
}
let getReducer = (serverProps) => {
  let defaultState = getDefaultState(serverProps)
  return (state = defaultState, action) => {
  }
}
let getStore = (serverProps) => {
  let reducer = getReducer(serverProps)
  return store = createStore(reducer)
}
let ConnectedApp = connect(
  mapStateToProps,
  mapDispatchToProps
)(App)
let ProvidedApp = (serverProps) => {
  return (
    <Provider store={getStore(serverProps)}>
      <ConnectedApp/>
    </Provider>
  )
}

这太难看了:/