私は現在 Meteor + React + MongoDB + FlowRouter を使用しています。選択したコースを mycourses に追加したかったのです。
Course.jsx でデータを正常にアップサートして MyCourse に移動しますが、2 回レンダリングされる理由がわかりません。最初はデータがコンソールに正しく出力されましたが、2 回目はデータ find() が空でした[]。
[ { _id: '3nHTJb9gjNWi2JqZL', user_id: 123, course_id: [ 1, 2 ] } ]
client/components/Course.jsx
Course = React.createClass({
mixins: [ReactMeteorData],
propTypes: {
courseId: React.PropTypes.number.isRequired,
},
getMeteorData () {
return {
currentUser : Meteor.user(),
courseDetail: AllCoursesCol.findOne({
id: this.props.courseId
})
}
},
onPressGetGames(e)
{
e.preventDefault()
if (this.data.currentUser)
{
Meteor.call("addToMyCourses", this.props.courseId, (error) => {
if (error) {
console.log("Update Course Failed")
}
else {
console.log("Update Course Success")
}
})
FlowRouter.go("MyCourses")
}
else
{
FlowRouter.go("Login")
}
},
render() {
return (
<div className="container-fluid">
<div className="row">
<div className="col-sm-8">
<div className="embed-responsive embed-responsive-16by9">
<iframe className="embed-responsive-item" src="https://www.youtube.com/embed/x0nfdbx0Wls" allowFullScreen></iframe>
</div>
</div>
<div className="col-sm-4">
<button btn btn-success onClick={this.onPressGetGames}> Get Games </button>
</div>
</div>
<div className="row">
<h1 className="display-5"> Course Description </h1>
<p> {this.data.courseDetail.long_des} </p>
</div>
</div>
)
}
})
クライアント/コンポーネント/MyCourses.jsx
MyCourses = React.createClass({
mixins: [ReactMeteorData],
getMeteorData () {
return {
myCoursesId: MyCoursesCol.findOne({user_id: Meteor.userId()})
}
},
render() {
let displayMyCourses
if (this.data.myCoursesId)
{
displayMyCourses = (
<div className="card-columns">
{
this.data.myCoursesId.map((id) => {
console.log(id)
var course = AllCoursesCol.findOne({id: id})
console.log(course)
return (
<MyCourseCard key={course.id} courseId={course.id} title={course.title} shortDes={course.short_des}/>
)
})
}
</div>
)
}
else
{
displayMyCourses = (
<h5 className="text-xs-center"> You have no course. Go to Browse Course and get some courses. </h5>
)
}
return (
<div className="container-fluid">
{displayMyCourses}
</div>
)
}
})
lib/Router.jsx
FlowRouter.route("/browsecourses/:courseId", {
name: "Course",
action (params) {
renderMainLayoutWith(<Course courseId={parseInt(params.courseId)}/>)
}
})
FlowRouter.route("/mycourses", {
name: "MyCourses",
subscriptions: function() {
this.register("myCourses", Meteor.subscribe("myCourses"))
},
action (params) {
renderMainLayoutWith(<MyCourses/>)
}
})
サーバー/publish.jsx
Meteor.publish("myCourses", () => {
if (!this.userId) {
throw new Meteor.Error("not-authorized")
}
var data = MyCoursesCol.find({user_id: this.userId})
return data
})