Я работаю в существующей кодовой базе, которая использует комбинацию React, Meteor и response-meteor-data.
Все шло относительно хорошо, пока я не попытался внедрить функцию поиска с помощью withTracker, React Select, и функциональность подписки Meteor.
import { CollectionAPI } from '../arbitrary_meteormongo_collection';
export const WriteableConnectionToCollection = withTracker(props => {
let connection = Meteor.subscribe('COLLECTION_NAME.searchByName', SEARCH_TEXT_HERE);
let isLoading = connection.ready();
return {
...props,
isLoading: isLoading,
collection: CollectionAPI.find().fetch()
}
})(PRESENTATIONAL_COMPONENT);
Я погуглил и увидел, что распространенным решением для получения данных в Meteor.subscribe является использование таких вещей, как параметры URL, хотя, поскольку я работаю в существующей кодовой базе, это изменение также необходимо будет реализовать в разных местах.
Другой способ, который я нашел, - передать значение поля ввода родительскому компоненту, отслеживая состояние поля ввода в состоянии родительского компонента, хотя это явно нарушает принцип разделения задач:
Родительский компонент
export const ParentComponent = React.createClass({
getInitialState() {
return {
inputFieldValue: undefined
}
},
onChange(change) {
this.setState(inputFieldValue);
},
render() {
return (
<Search
onChange={this.onChange}
inputFieldValue={this.state.inputFieldValue}
/>
}
}
withTracker HOC
import { CollectionAPI } from '../arbitrary_meteormongo_collection';
export const WriteableConnectionToCollection = withTracker(props => {
let connection = Meteor.subscribe('COLLECTION_NAME.searchByName', this.props.inputFieldValue);
let isLoading = connection.ready();
return {
...props,
isLoading: isLoading,
collection: CollectionAPI.find().fetch()
}
});
Компонент InputField
import { WriteableConnectionToCollection } from './connections/writeableconnection.js';
const InputFieldComponent = React.createClass({
render() {
<InputField
onInputChange={this.props.onChange}
/>
}
}
export default WritableConnectionToCollection(InputFieldComponent);
Это единственный способ сделать что-то с этой конкретной комбинацией пакета/фреймворка или есть более простой способ, которого я просто не вижу?
withTracker
. Вы уже пробовали это? Я думаю, что это должно сработать, так как все реактивные источники данных в withTracker должны вызывать повторный запуск функции. - person Christian Fritz   schedule 15.08.2018