为什么 findOne() 在 withTracker() 部分不起作用,但它在 render() 方法中起作用?

Why findOne() doesn't work in withTracker() section but it does work in render() method?

Meteor 和 React。我正在尝试订阅 mongo 的两个集合,并使用特定文档将其传递给组件。如果我尝试获取 whitTracker () 部分中的文档,它似乎会在同步文档和 returns 无限期之前搜索它。但是,如果我在渲染部分执行此操作,在确保 isLoading 为 false 之后,它就可以工作了。从我订阅的集合中查找数据的正确位置在哪里?

这(在 withTracker 部分进行查询)不起作用:laLoca 和 laLoca1 将未定义。

    render() {
        if (this.props.isLoading) {
          return <LoaderExampleText />;
        }        

        return (<MyMap laLoca={this.props.laLoca} />);
      }
    }

    export default withTracker(() => {
      const handles = [
        Meteor.subscribe("wells"),
        Meteor.subscribe("locaciones"),
        Meteor.subscribe("Drylocationlast")
      ];
      const isLoading = handles.some(handle => !handle.ready());
      const laLoca1 = Drylocationlast.findOne({ codigo: "dl" });
      const laLoca = Locaciones.findOne(laLoca1.dryLocationId);

      return {
        laLoca:laLoca,
        wells: Wells.find().fetch(),
        isLoading: isLoading
      };
    })(WellHome);

但是这个(在 render 方法中进行查询)确实有效:

    render() {
        if (this.props.isLoading) {
          return <LoaderExampleText />;
        }
        const laLoca1 = Drylocationlast.findOne({ codigo: "dl" });
        const laLoca = Locaciones.findOne(laLoca1.dryLocationId);

        return (<MyMap laLoca={laLoca} />);
      }
    }

    export default withTracker(() => {
      const handles = [
        Meteor.subscribe("wells"),
        Meteor.subscribe("locaciones"),
        Meteor.subscribe("Drylocationlast")
      ];
      const isLoading = handles.some(handle => !handle.ready());

      return {
        wells: Wells.find().fetch(),
        isLoading: isLoading
      };
    })(WellHome);

如果 laLoca1 未定义,laLoca1.dryLocationId 将崩溃(您在控制台中看到错误,对吧?),我想跟踪将无法正确设置。

当你输入:

const laLoca1 = Drylocationlast.findOne({ codigo: "dl" });
const laLoca = Locaciones.findOne(laLoca1.dryLocationId);

render() 确认订阅已准备就绪后,它们将永远不会未定义,它会起作用。

我认为最理想的是,render()不应该负责获取数据,只负责可视化。在 withTracker() 你可以这样做:

const isLoading = handles.some(handle => !handle.ready());

if(isLoading){
  return {
    laLoca: null,
    wells: null,
    isLoading: true
  };
}else{
  const laLoca1 = Drylocationlast.findOne({ codigo: "dl" });
  const laLoca = Locaciones.findOne(laLoca1.dryLocationId);
  return {
    laLoca: laLoca,
    wells: Wells.find().fetch(),
    isLoading: false
  };
}