Session 流星+;React-会话变量的行为不反应

Session 流星+;React-会话变量的行为不反应,session,meteor,reactjs,Session,Meteor,Reactjs,我是这个社区的新成员,但我在上面搜索了一周,看看我的问题以前是否得到了回答,但显然与meteor 1.4和react没有太多关系 所以我正在构建一个应用程序(我是Meteor+React的新手),它读取存储在服务器上的一个巨大的XML文件,然后需要从中提取一些数据,显示它,然后使用在不同页面上获取的数据启动一些其他函数,因此我认为将解析为JSON对象的XML存储到会话变量中是一个好主意,但问题马上就开始了,因为第一次简单的数据提取没有反应性 代码如下: import React, { Compo

我是这个社区的新成员,但我在上面搜索了一周,看看我的问题以前是否得到了回答,但显然与meteor 1.4和react没有太多关系

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

代码如下:

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);
import React,{Component,PropTypes}来自'React';
从“react dom”导入react dom;
从“流星/流星”导入{Meteor};
从“meteor/react meteor数据”导入{createContainer};
FlightPlan=新Mongo.集合(“FlightPlan”);
导出默认类FlightPlanWrapper扩展组件{
建造师(道具){
超级(道具);
}
xmlDemo(){
Meteor.call('xmlDemo',函数(错误,flightPlanXML){
设tempXML=flightPlanXML;
Session.set({
“flightPlanXML”:flightPlanXML
});
});
}
render(){
const flightNumber=Session.get('flightPlanXML')(
{Session.get('flightPlanXML').FlightPlan.FlightInfo.aTCCallsign}
) : '';
返回(
飞行计划
{
Session.get('flightPlanXML')?flightNumber:
点击我
}
);
}
}
导出默认createContainer(()=>{
Meteor.订阅(“飞行计划”);
返回{
“解决方案”:FlightPlan.find().fetch()
};
},FlightPlanWrapper);
因此,我不确定我对系统的理解是否正确,但在这个简化版本的代码中,我想做的是显示按钮或会话变量的内容


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

使用Meteor+React,所有反应性Meteor数据源(如DB collection
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像其他任何DB数据一样使用

按照Cod3Citrus的要求进行澄清


要理解为什么这是必要的,你必须理解反应性和流星反应性是两个不同的东西。React reactivity的工作原理是,当且仅当组件的
道具
状态
发生变化时,其
渲染
功能才会重新运行。Meteor reactivity的工作原理是,当反应性上下文中调用的反应性数据源(如
collection.find
Session.get
)更改值时,该反应性上下文将重新运行。Meteor反应上下文的示例有
Tracker.autorun
和传递给
createContainer
的数据函数。因此,在React reactive
render
功能中放置Meteor reactive数据源(
Session.get
)将不起作用

更新:我试图破坏代码,将航班号输出到一个名为(FlightPlanContent.jsx)的文件和另一个文件(FlightPlanForm.jsx)上的按钮
然后我在(FlightPlanWrapper.jsx)中进行调用,呈现方式如下:
{Session.get('flightPlanXML')?:}
,但结果仍然是一样的:输出不是被动的,它只在我更改页面后才更改(不是刷新,因为它会转储会话变量)。这对我来说很有效@Waiski,你能解释一下为什么这是必要的吗?@Cod3Citrus我用一个小的澄清更新了答案。我希望这件事能澄清:)