【发布时间】:2016-09-21 17:13:46
【问题描述】:
又是一天又是一个麻烦。我有两个集合:假设Items 和Reviews,项目由管理员创建,任何人都可以发表评论(无需登录)。我在提交表单以供审核时遇到问题。我将尽量使以下代码保持清晰,解释它现在是如何工作的以及它应该如何工作。开始吧。
首先,我有一个用于单个项目的组件,其中包含一个人可以写评论的表单(每个项目都有一个表单):
import React, {Component, PropTypes} from 'react';
import ReviewForm from './ReviewForm.jsx';
import {Items} from '../../api/collections/items.js';
import {Reviews} from '../../api/collections/reviews.js';
export default class Item extends Component {
render() {
return (
<div className="container">
<div className="row">
<p>{this.props.item.itemName}</p>
</div>
<div className="row"
<p>{this.props.item.itemDesc}</p>
</div>
</div>
<div className="row">
<form onSubmit={this.props.leaveData}>
<div className="row">
<div className="input-field col s6">
<input placeholder="Name" id="review_body" type="text" />
</div>
</div>
<button type="submit">Send Review</button>
</div>
</form>
</div>
)
}
}
Item.propTypes = {
item PropTypes.object.isRequired,
leaveData: PropTypes.func.isRequired,
};
正如您所见,没有什么特别的(尽管项目的属性类型很完美),我有一个 leaveData 函数,我用它来访问 ItemsList 组件中的这个组件:
从'react'导入反应,{组件,PropTypes};
从 'meteor/react-meteor-data' 导入 { createContainer };
从'./Item.jsx'导入项目;
从'../../api/collections/items.js'导入{Items};
从'../../api/collections/reviews.js'导入{评论};
class ItemssList extends Component {
handleSubmit(event) {
event.preventDefault();
const reviewBody = $('#review_body').val();
Reviews.insert({
reviewBody,
createdAt: new Date(),
});
}
renderItems() {
return this.props.items.map((item) => (
<Item key={item._id} item={item} leaveData={this.handleSubmit} />
));
}
render() {
return (
<div className="row">
{this.renderItems()}
</div>
)
}
}
ItemsList.propTypes = {
items: PropTypes.array.isRequired,
}
export default createContainer(() => {
return {
items: Items.find({}).fetch(),
};
}, ItemsList);
所以代码非常简单,我使用几乎相同的代码在管理页面上创建一个新项目,唯一的区别是管理页面只有一个表单,但我希望每个项目对象都有一个审查表单。可能是我弄乱了ID,但不确定。现在它工作正常,但只有当我为第一个项目提交评论时,对于其他项目,此表单提交一个空文档,我只是不知道这种行为的原因是什么。希望听到任何建议来帮助我完成这个乍看之下微不足道的任务!
`
【问题讨论】:
-
嗯,我想我知道我做错了什么。如果每个项目都显示绝对正确,因为我定义了一个唯一的 ID,我是否应该为每个表单组件做同样的事情?今天晚些时候会试一试。