刷新Web浏览器时Firebase数据无效

时间:2018-05-25 09:06:25

标签: javascript reactjs firebase firebase-realtime-database redux

感谢阅读。

我遇到了React,Redux和Firebase的问题。我使用Redux在React商店中设置Firebase数据。使用组件中的mapStateToProps传递数据。当我链接一个firebase项目并刷新Web浏览器时,数据的道具是未定义的。我想在刷新浏览器时保留firebase数据。

这是我的组件,显示了firebase的数据

 render() {
    return (
      <div>
        <div className="content-container">
          <Header />
          <div className="square-top" />
          <div className="square" />
          <div className="middle-square" />

          <div className="box-content" style={{ marginTop: "20rem" }}>
            <img
              className="img-post"
              src={this.props.posts.image}
              alt=""
            />
            <h1>{this.props.posts.title}</h1>
            <p>{this.props.posts.description}</p>
          </div>
          <div className="box-content" style={{ paddingBottom: "400px" }}>
            <button
              onClick={() => {
                this.props.history.push("/blog");
              }}
              className="btn-primary"
            >
              Volver
            </button>
          </div>
        </div>
        <Footer />
      </div>
    );
  }
}

const mapStateToProps = (state, props) => {
  return {
    posts: state.posts.find(post => post.slug === props.match.params.slug)
  };
};

export default connect(mapStateToProps)(PostItemPage);

动作Redux文件

export const setPosts = posts => ({
  type: "SET_POSTS",
  posts
});

export const startSetPosts = () => {
  return dispatch => {
    return database
      .ref("posts")
      .once("value")
      .then(snapshot => {
        const posts = [];

        snapshot.forEach(childSnapshot => {
          posts.push({
            id: childSnapshot.key,
            ...childSnapshot.val()
          });
        });

        dispatch(setPosts(posts));
      });
  };
};

和商店文件

const composeEnhancers  = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose

export default () => {
  const store = createStore(
    combineReducers({
      filters: filtersReducer,
      questions: questionsReducer,
      posts: postsReducer
    }),
    composeEnhancers(applyMiddleware(thunk))
  );

  return store;
};

2 个答案:

答案 0 :(得分:0)

您还没有真正为任何人提供足够的信息来为您提供完整的答案。

要考虑几点:

  • props.match.params.slug有什么价值?你是否恰当地从父组件传递了这个?
  • 您是否正在使用容器组件的startSetPosts()方法调用componentWillMount()
  • 您是否尝试记录商店中的状态,即在容器组件呈现的位置?毫无疑问,这将帮助您调试出错的地方。

答案 1 :(得分:0)

嗨,查尔斯抱歉,我从React和Firebase开始,我的英语不好。我在我的App.js中调度startSetPosts()。

const jsx = (
  <Provider store={store}>
    <AppRouter />
  </Provider>
);

store.dispatch(startSetPosts());


ReactDOM.render(jsx, document.getElementById("app"));

关于props.match.params.slug我使用mapStateToProps()从父组件传递值。

const mapStateToProps = state => ({
  posts: selectCategory(state.posts, state.filters),
  filters: state.filters.category
});

我使用以下结构从firebase获取数据:

posts{
  -LDCSkdmgh2F3FjmcoSp{
       description:
       image:
       slug:
       title: 
   }
}