Meteor + React - 会话变量不具有反应性

时间:2016-08-06 16:52:57

标签: session meteor reactjs

我是社区的新手,但我一直在寻找一周,看看我的问题是否得到了回答,但显然没有多少与流星1.4的反应有关。

所以我正在构建一个应用程序(我是Meteor + React的新手),它读取存储在服务器上的巨大XML文件,然后需要从中提取一些数据,显示它然后启动一些在不同页面上获取数据的其他函数因此我认为将解析为JSON对象的XML存储到会话变量中是一个好主意,但随后第一个简单数据提取没有反应性行为就会立即出现问题。

这是代码:

ApplicationFragments.this

所以我不确定我对系统的理解是否正确,但我想在这个简化版本的代码中做的是显示按钮或该会话变量的内容。 / p>

请注意,当我点击按钮后更改页面然后我回到同一页面时,内容会正确更新。

1 个答案:

答案 0 :(得分:10)

使用Meteor + React,所有响应式Meteor数据源(例如数据库集合find调用和Session.get)都必须在createContainer之内。所以你需要这样做:

export default createContainer (() => {
  Meteor.subscribe('flightPlan');
  return {
    'resolutions': FlightPlan.find().fetch(),
    flightPlan: Session.get('flightPlanXML')
  };
}, FlightPlanWrapper);

然后你可以在渲染函数中使用this.props.fightPlan

请注意,如果XML文件的内容在服务器上发生更改,则此操作不会反映,更改不会反映在UI中。如果这是您想要的,我建议您在服务器上编写一个脚本,从XML中提取数据并将其写入Mongo数据库,以便像其他任何数据库数据一样使用Meteor。

按照Cod3Citrus的要求澄清

要理解为什么这是必要的,你必须明白React反应性和Meteor反应性是两回事。反应的反应性起作用,以便当且仅当组件的propsstate发生变化时,重新运行其render函数。流星反应性的工作原理是,当一个反应数据源,例如collection.findSession.get,在被动上下文中被称为 时会改变值,反应上下文重新运行。流星反应上下文的示例是Tracker.autorun,数据函数传递给createContainer。因此,将反应活跃的数据源(Session.get)置于React-reactive render函数中将无法正常工作