【问题标题】:Trying to play with collections using Meteor and React尝试使用 Meteor 和 React 玩集合
【发布时间】:2017-07-16 17:11:23
【问题描述】:

我正在研究 Meteor 和 React,我正在创建一个允许用户创建消息的小应用程序。很简单...但我无法摆脱加入集合。

我正在使用的是 publish-composite 来帮助我完成肮脏的工作,但我迷路了......

这是目前为止的代码:

messages.js:

import { Meteor } from 'meteor/meteor';
import { publishComposite } from 'meteor/reywood:publish-composite';

export const Messages = new Mongo.Collection('messages');

if (Meteor.isServer) {
  publishComposite('messages', {
    find() {
      return Messages.find({}, {
        sort: { createdAt: -1 }
      });
    },
    children: [
      {
        find(message) {
          return Meteor.users.find(
            { _id: message._author }
          );
        }
      }
    ]
  });
}

在我的 React 组件中,我创建了这个:

componentDidMount() {
    this.messagesTracker = Tracker.autorun(() => {
      Meteor.subscribe('messages');
      const messages = Messages.find({}, {
        sort: { createdAt: -1 }
      }).fetch();
      console.log(messages);
      this.setState({ messages });
    });
  }

在 publish-composite 的文档中,我看到它使用 Template.topTenPosts.helpers 来获取数据,但我不知道如何使用 React 来模拟...

日志显示的只是没有任何用户信息的消息数据:

Object
createdAt:Sat Jul 15 2017 18:17:13 GMT+0200 (CEST)
message:"A message..."
_author:"6M8wNbt4Ff2YTN99u"
_id:"2gL2xKbWnduYqTHXk" 

我怎样才能摆脱它?干杯

【问题讨论】:

    标签: mongodb reactjs meteor


    【解决方案1】:

    publish-composite 不做真正的 join - 它返回来自多个集合的所有相关文档。您仍然需要在客户端显示相关信息。在您的情况下,您正在显示 messages,但您还需要显示 author 信息。您的 React 组件必须访问这两个集合才能显示来自每个集合的文档。

    开始于:

    componentDidMount() {
      this.messagesTracker = Tracker.autorun(() => {
        Meteor.subscribe('messages');
          const messages = Messages.find({}, {
            sort: { createdAt: -1 }
          }).fetch();
          const authors = Authors.find({}).fetch;
          this.setState({ messages, authors });
        });
      }
    

    现在您的组件可以访问处于其状态的消息和(相关)作者。如果您显示您的渲染代码,那么我可以通过如何将各个部分放在您的布局中来扩充这个答案。

    【讨论】:

    • 感谢您的回答。按照这种方法,我没有收到包含有关作者的“填充”信息的集合,但我仍然必须遍历作者才能为每条消息获取正确的作者姓名。实际上,我正在尝试perak:joins 看看它是否像我预期的那样运作良好。万一我会尝试你的方法。谢谢。
    • 你是对的——它不做传统的连接,它只是确保所有需要的数据最终都在客户端上。然后由您在渲染中将其组合在一起。
    【解决方案2】:

    解决方案

    perak:joins是我用来让它正常工作的包,它非常好用:

    messages.js:

    [...]
    export const Messages = new Mongo.Collection('messages');
    
    Messages.join(Meteor.users, '_author', 'author', ['profile']);
    
    if (Meteor.isServer) {
      Meteor.publish('messages', function() {
        return Messages.find({}, {
          sort: { createdAt: -1 }
        });
      });
    }
    [...]
    

    componentDidMount 没有变化,messages 的结果是预期的结果,其中一个名为 author 的新字段由 profile 对象填充。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-08
      • 1970-01-01
      • 1970-01-01
      • 2016-02-07
      • 1970-01-01
      • 2018-07-27
      • 1970-01-01
      相关资源
      最近更新 更多