我是该社区的新手,但我一直在该社区上搜索一个星期,以查看我的问题是否曾经得到回答,但显然与反应的 meteor 1.4无关。
因此,我正在构建一个应用程序(我是Meteor + React的新手),该应用程序读取存储在服务器上的巨大XML文件,然后需要从中提取一些数据,进行显示,然后使用获取的数据启动其他一些功能。在不同的页面上,所以我认为将解析为JSON对象的XML存储到 session 变量中是个好主意,但是由于第一个简单的数据提取没有反应性,因此立即开始出现问题。
这是代码:
import React, { Component, PropTypes } from 'react';
import ReactDOM from 'react-dom';
import { Meteor } from 'meteor/meteor';
import { createContainer } from 'meteor/react-meteor-data';
FlightPlan = new Mongo.Collection("flightPlan");
export default class FlightPlanWrapper extends Component {
constructor(props) {
super(props);
}
xmlDemo(){
Meteor.call('xmlDemo',function(error,flightPlanXML){
let tempXML = flightPlanXML;
Session.set({
'flightPlanXML': flightPlanXML
});
});
}
render() {
const flightNumber = Session.get('flightPlanXML') ? (
<span className="flightNumber">{Session.get('flightPlanXML').FlightPlan.FlightInfo.aTCCallsign}</span>
) : '';
return (
<div id='flightPlan' className='contentWrapper'>
<h2>
Flight Plan
</h2>
{
Session.get('flightPlanXML') ? flightNumber :
<div>
<button onClick={this.xmlDemo.bind(this)}>click me</button>
</div>
}
</div>
);
}
}
export default createContainer (() => {
Meteor.subscribe('flightPlan');
return {
'resolutions': FlightPlan.find().fetch()
};
}, FlightPlanWrapper);
因此,我不确定我对系统的理解是否正确,但是在此简化版本的代码中,我想显示的是按钮还是该 session 变量的内容。
请注意,单击按钮后更改页面,然后返回同一页面时,内容将正确更新。
最佳答案
使用Meteor + React,所有反应式Meteor数据源(例如DB集合find
调用和Session.get
)都必须位于createContainer
内。因此,您需要这样做:
export default createContainer (() => {
Meteor.subscribe('flightPlan');
return {
'resolutions': FlightPlan.find().fetch(),
flightPlan: Session.get('flightPlanXML')
};
}, FlightPlanWrapper);
然后,您可以在render函数中使用
this.props.fightPlan
。请注意,这在某种意义上不是被动的,如果您的XML文件的内容在服务器上更改,则更改不会反映在UI中。如果这是您想要的,我建议您在服务器上编写一个脚本,该脚本从XML提取数据并将其写入Mongo数据库,以便Meteor像其他任何DB数据一样使用。
根据Cod3Citrus的要求进行澄清
要了解为什么这样做是必要的,您必须了解React反应性和Meteor反应性是两件事。 React反应性的工作原理是,仅当组件的
props
或state
更改时,它的render
函数才重新运行。 meteor 反应性的工作原理是,当在反应性上下文中调用的反应性数据源(例如collection.find
或Session.get
)更改值时,将重新运行此反应性上下文。 meteor 反应上下文的示例是Tracker.autorun
和传递给createContainer
的数据函数。因此,将Meteor反应性数据源(Session.get
)放置在React-active render
函数中将不会起作用。