感谢阅读。
我遇到了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;
};
答案 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:
}
}