【发布时间】:2016-08-26 10:18:00
【问题描述】:
我正在使用 Flux + React Router + Firebase 创建一个基本博客。我在尝试获取单个博客文章来呈现时遇到了麻烦。当我单击单个帖子的链接时,我尝试从所有帖子列表中过滤掉所有其他帖子,并仅显示我的 firebase 数据库中的单个帖子。
我尝试通过将 firebase 条目的键与 url 参数匹配来做到这一点,例如 if (this.props.routeParams.key===key) 。我真的不知道我必须做些什么才能做到这一点。欢迎任何建议。
下面是 Blogger.jsx,我允许用户创建博客文章的页面,然后在博客文章下方,我显示所有博客文章的标题列表。
import AltContainer from 'alt-container';
import React from 'react';
import { Link } from 'react-router';
import List from './List.jsx'
import Firebase from 'firebase'
import BlogStore from '../stores/BlogStore'
import BlogActions from '../actions/BlogActions';
const rootURL = 'https://incandescent-fire-6143.firebaseio.com/';
export default class Blogger extends React.Component {
constructor(props) {
super(props);
BlogStore.getState();
BlogStore.mountFirebase();
{console.log(this.props.location.query)}
};
componentDidMount() {
BlogStore.listen((state) => {
this.setState(state)
})
this.firebaseRef = new Firebase(rootURL + 'items/');
}
componentWillMount() {
BlogStore.unlisten((state) => {
this.setState(state)
})
}
renderList = (key) => {
return (
<Link to={`blogshow/${key}`}> <List key={key} blog={this.state.blog[key]} /> </Link>
)
}
handleInputChange = () => {
BlogStore.setState({
title: this.refs.title.value,
text: this.refs.text.value});
}
handleClick = () => {
BlogStore.handleClick();
}
render() {
return (
<div>
<div className="row panel panel-default">
<div className="col-md-8 col-md-offset-2">
<h2>
Create a New Blog Post
</h2>
</div>
</div>
<h2>Blog Title</h2>
<div className="input-group">
<input
ref="title"
value={BlogStore.state.title}
onChange = {this.handleInputChange}
type="text"
className="form-control"/>
<span className="input-group-btn">
</span>
</div>
<h2>Blog Entry</h2>
<div className="input-group">
<textarea
ref="text"
value={BlogStore.state.text}
onChange = {this.handleInputChange}
type="text"
className="form-control"/>
</div>
<div className="blog-submit input-group-btn">
<button onClick={this.handleClick}
className="btn btn-default" type="button">
Publish Blog Post
</button>
</div>
{/*<List blog={this.state.blog} />*/}
{Object.keys(BlogStore.state.blog)
.map(this.renderList)}
</div>
);
}
}
当用户单击指向单个博客文章的链接时,他们应该被传送到仅显示该单个博客文章的页面。我称这个组件为 BlogShow。我无法让 BlogShow 呈现,因为我不断收到错误
invariant.js?4599:45 未捕获的不变违规:BlogShow.render():A 必须返回有效的 React 元素(或 null)。您可能已经返回 未定义、数组或其他一些无效对象。
这是 BlogShow.jsx:
import AltContainer from 'alt-container';
import React from 'react';
import { Link } from 'react-router';
import Blogger from './Blogger'
import List from './List'
const rootURL = 'https://incandescent-fire-6143.firebaseio.com/';
import BlogStore from '../stores/BlogStore'
import BlogActions from '../actions/BlogActions';
export default class BlogShow extends React.Component {
constructor(props) {
super(props);
{console.log(this.props.routeParams.key)}
this.filterList = this.filterList.bind(this);
}
filterList(key) {
if (this.props.routeParams.key===key) {
return (<List key={key} blog={BlogStore.state.blog[key]} />)
}
}
render() {
<div> {Object.keys(BlogStore.state.blog).map(this.filterList)} </div>
}
}
【问题讨论】:
-
您应该使用
.filter()而不是.map()。否则它们将被设置为undefined,而不是从数组中删除。 -
我该怎么做?你能举个例子说明一下吗?
-
我把它改成了这个,现在仍然很幸运:{Object.keys(BlogStore.state.blog).filter(this.filterList)}
标签: javascript reactjs firebase react-router