2

我正在使用 react-komposer 包构建一个带有 Meteor 的应用程序。这很简单:有一个顶级组件 ( App ),其中包含一个搜索表单和一个结果列表。该列表通过 komposer 容器 ( AppContainer )提供的 props 获取其条目。在我尝试实施搜索以缩小列表中显示的结果之前,它工作得很好。

这是我开始使用的代码(AppContainer .jsx):

import { Meteor } from 'meteor/meteor';
import { composeWithTracker } from 'react-komposer';
import React, { Component } from 'react';
import Entries from '../api/entries.js';
import App from '../ui/App.jsx';

function composer(props, onData) {
  if (Meteor.subscribe('entries').ready()) {
    const entries = Entries.find({}).fetch();
    onData(null, {entries});
  };
};

export default composeWithTracker(composer)(App);

应用程序只是呈现出整个条目列表。我想要实现的是将查询参数传递给Entries.find({}).fetch();来自App组件的数据(例如通过文本输入捕获)。换句话说:如何将参数从App (子)组件输入到AppContainer中,以便搜索特定条目并最终重新呈现相应的结果?

为了进一步澄清,这里是 App.jsx 的代码:

import React, { Component } from 'react';

export default class App extends Component {
  render() {
    return (
      <div>
        <form>
          <input type="text" placeholder="Search" />
        </form>
        <ul>
          {this.props.entries.map((entry) => (
            <li key={entry._id}>{entry.name}</li>
          ))}
        </ul>
      </div>
    );
  }
}

提前致谢!

4

2 回答 2

2

我打算为此写评论以澄清 nupac 的答案,但字符数量太严格了。

您要查找的示例代码位于 nupac 提供的搜索教程链接中。这是具有相应更改的作曲家函数:

function composer(props, onData) {
  if (Meteor.subscribe('entries', Session.get("searchValues")).ready()) {
    const entries = Entries.find({}).fetch();
    onData(null, {entries});
  };
};

解决方案是会话包。您可能需要将其添加到您的包文件中,并且无需导入即可使用。否则试试import { Session } from 'meteor/session'; 你只需要在提交搜索表单时设置会话。比如这样:

Session.set("searchValues", {
      key: value
});

每次特定会话值更改时,订阅都会自动获取数据。

最后,您将能够访问服务器端发布方法中的值:

Meteor.publish('entries', (query) => {
  if (query) {
    return Entries.find(query);
  } else {
    return Entries.find();
  }
});

希望这可以帮助。如果不是这样,请告诉我。

于 2016-07-13T04:27:06.257 回答
0

您可以采取 2 种方法。

  1. 订阅方式,
  2. Meteor.call 方式,

订阅方式

它涉及您设置从 url 获取的属性。因此,您设置路由以向您的组件发送查询属性。您的组件使用该属性作为参数发送到您的出版物,并且只订阅符合搜索条件的内容。然后将查询放入 fetch 语句并呈现结果。

Meteor.call 方式

忘记订阅并以旧方式进行。将您的查询发送到端点,在本例中为 Meteor 方法,并呈现结果。我更喜欢这种方法有一个原因,$text. Minimongo 不支持$text所以你不能使用$text在客户端搜索东西。相反,您可以使用文本索引和流星方法设置服务器的 mongo 来处理搜索和呈现结果。

看看什么适合您的优先事项。meteor.call 方式需要您做更多的工作以使“搜索结果”可通过 url 共享,但您会获得更丰富的搜索结果。订阅方式更容易实现。

这是流星搜索教程的链接,如果您有兴趣,请阅读$text

于 2016-05-17T09:02:06.510 回答