【问题标题】:Adding Routes to a React/Firebase app向 React/Firebase 应用添加路由
【发布时间】:2017-01-17 18:58:09
【问题描述】:

刚开始将 React 路由添加到 React/firebase 应用程序。我有这段代码来读取数据,

const fb = firebase  
.initializeApp(config)
.database()
.ref();

fb.on('value', snapshot => {  
  const store = snapshot.val();
  ReactDOM.render(
       <App {...store} />
    ,
    document.getElementById('root')
  );
});

这工作正常,应用程序实时更新。 然后我开始玩Router,

ReactDOM.render(
   <Router>
    <Route path="/" component={App {...store}} />
  </Router>
   ,
  document.getElementById('root')
);

但是 {...store} 给出了一个错误,意外的标记。我应该将 Firebase 代码从树的下方移到 App 组件中还是有其他方法?

【问题讨论】:

    标签: reactjs firebase firebase-realtime-database


    【解决方案1】:

    呃,component= 不会拿你在ReactDOM.render() 那里的那个东西

    正如你现在所拥有的那样:商店将是未定义的......所以设置:

    let store = {} // at the top

    您的实际组件/类在哪里定义? 你也不应该根据 Firebase 出现的时间来创建渲染,你应该先渲染,然后当 firebase 出现时你可以更新状态。

    因此,这里有很多需要修复的地方,然后才能正常工作。

    这是我的 index.js:

    还要注意 store 是 configureStore 的结果(我假设你想使用 Redux,因为你有一个 store)...

    import 'babel-polyfill'
    import React from 'react'
    import { render } from 'react-dom'
    import Root from './root/containers/Root'
    import './index.css'
    import configureStore from './root/store'
    import { syncHistoryWithStore } from 'react-router-redux'
    import { browserHistory } from 'react-router'
    
    const store = configureStore()
    const history = syncHistoryWithStore(browserHistory, store)
    
    
    render(
      <Root store={store} history={history} />,
      document.getElementById('root')
    );
    

    我的商店:

    import { createStore, applyMiddleware } from 'redux'
    import thunkMiddleware from 'redux-thunk'
    import createLogger from 'redux-logger'
    import reducer from '../reducers'
    import { database, initializeApp } from 'firebase'
    import { firebaseConfig } from '../constants'
    initializeApp(firebaseConfig)
    export const rootRef = database().ref().child('/react')
    export const dateRef = rootRef.child('/date')
    
    export default function configureStore(preloadedState){
      const store = createStore(
        reducer,
        preloadedState,
        applyMiddleware(thunkMiddleware, createLogger())
      )
      return store
    }
    

    还有我的根:

    import React, { Component, PropTypes } from 'react'
    import { Provider } from 'react-redux'
    import routes from './routes'
    import { Router, } from 'react-router'
    
    class Root extends Component {
      render() {
        const { store, history } = this.props
        return (
          <Provider store={store}>
            <Router history={history} routes={routes} />
          </Provider>
        )
      }
    }
    
    Root.propTypes = {
      store: PropTypes.object.isRequired,
      history: PropTypes.object.isRequired
    }
    

    最简单的入门版本:

    import React, { Component } from 'react'
    import { firebaseConfig } from '../constants' //this is a must otherwise you have multiple versions of firebase running around...
    initializeApp(firebaseConfig)
    export const rootRef = database().ref().child('/root')
    
    class App extends Component {
    componentDidMount(){
        initializeApp(firebaseConfig)
        this.state = {store: {}}
    
        rootRef.on('value', snapshot => {
           this.setState({store: snapshot.val()});
        }
    
    }
    render(){
    let { store } = this.state
    let childrenWithProps = React.Children
    .map(this.props.children, function(child) {
            return React.cloneElement(child, { store: store });
    });
    
    
    return <div>
    {JSON.stringify(store)}
    {childrenWithProps}
    </div>
    }
    
    }
    const Routes = (<Route component={App}><Route component={Comp1} path='/earg'/><Route component={Comp2} path='/earg'/></Route>)
    
    render(Routes, document.getElementById('root'))
    

    这是很多代码,您还需要更多代码才能完成...我可能会推荐一个教程...

    【讨论】:

    • 是的,只是在这里学习。代码被错误地剪切和粘贴。第一个版本运行良好,但我同意你关于渲染顺序的观点。我的问题更多是在哪里引用商店。
    • 我是否正确,您的意思是从 react-redux /redux 的 Provider 商店存储?或者你说的 store 是什么意思,你只想在没有 Redux 的情况下将所有数据存储在一个名为 store 的对象中?
    • 是的,在开始学习 redux 之前,我只是在使用 Firebase 进行快速测试。在这种情况下,“store”指的是 firebase 数据库。数据在添加路线之前实时传输。
    • 好的,所以你应该可以通过 this.props.store 访问商店中的东西,但你会发现 firebase 并没有真正以方便的方式组织东西以便直接使用。 .. 如果你不使用 redux 只是想要一些快速的东西,我会在 componentDidMount(){ const fb = firebase .initializeApp(config) .database() .ref(); fb.on('value', snapshot =&gt; { this.setState({store: snapshot.val()}) }); } 内部做一些事情
    • 听起来合乎逻辑。那将在较低的 App 组件中,所以不能跨路由共享......?我认为以后离开路线学习会更容易。谢谢。
    【解决方案2】:

    最后,为了一个快速的解决方案,我使用了一个匿名函数来包装组件,

       <Route path="/" component={() => (<App {...store} />)} />
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-11
      • 1970-01-01
      • 2017-09-08
      • 2017-05-08
      • 2017-04-26
      • 1970-01-01
      相关资源
      最近更新 更多