Apollo 客户端并提前输入
Apollo client and type ahead
目前我有一个 apollo 客户端,它有一个文本框,可以通过预输入格式填充自动完成。我正在使用 react-autosuggest 来填充建议。
在我的代码中,我有一个 HOC,我还触发了重新获取并在文本框 onChange 上设置了变量。
const TypeAheadWithData = graphql(TypeAheadQuery, {
options: ({ name }) => ({ variables: { name } })
})(TypeAhead);
export default TypeAheadWithData;
目前我有两个问题。一个是当我键入信息时,不会获取更新的结果,而是显示先前的预输入结果。例如,如果我有一个字符串 'san' 并且我添加 'sand' 它将显示 'san' 查询的结果。当我重新获取数据时,我无法等待异步数据。本质上是想弄清楚如何等待重新获取异步。或者其他形式的。 Obsservable/Watch 也许可以查询。在这方面的任何指导都会有很大帮助。
function getSuggestionValue(suggestion) {
return suggestion.name;
}
function renderSuggestion(suggestion) {
return (
<span>{suggestion.name}</span>
);
}
class TypeAhead extends React.Component {
constructor() {
super();
this.state = {
value: '',
suggestions: [],
isLoading: false
};
}
componentWillReceiveProps() {
this.setState({
suggestions: this.props.data.characters
});
}
onChange = (event, { newValue }) => {
console.log(newValue);
//this.props.data.variables.name = newValue;
this.props.data.refetch({name: newValue});
this.setState({
value: newValue
});
};
shouldRenderSuggestions(value) {
return value.trim().length > 2;
}
onSuggestionsFetchRequested = ({ value }) => {
//this.props.data.refetch({});
// this.setState({
// suggestions: this.props.data.characters
// });
// this.loadSuggestions(value);
};
onSuggestionsClearRequested = () => {
this.setState({
suggestions: []
});
};
render() {
const { value, suggestions, isLoading } = this.state;
const inputProps = {
placeholder: "Type 'c'",
value,
onChange: this.onChange
};
const status = (isLoading ? 'Loading...' : 'Type to load suggestions');
return (
<div>
<div className="status">
<strong>Status:</strong> {status}
</div>
<Autosuggest
suggestions={suggestions}
onSuggestionsFetchRequested={this.onSuggestionsFetchRequested}
onSuggestionsClearRequested={this.onSuggestionsClearRequested}
getSuggestionValue={getSuggestionValue}
renderSuggestion={renderSuggestion}
shouldRenderSuggestions={this.shouldRenderSuggestions}
inputProps={inputProps} />
</div>
);
}
}
const TypeAheadWithData = graphql(TypeAheadQuery, {
options: ({ name }) => ({ variables: { name } })
})(TypeAhead);
export default TypeAheadWithData;
我遇到的主要问题是正在建议之前加载的建议列表。因为它不等待重新获取,并且在收到一组新的状态时根本不更新状态。
如果您已经从 Apollo 收到作为 props 的建议,则无需使用组件的状态。我会将您的初始状态更改为:
this.state = {
value: '',
isLoading: false
};
然后你可以像这样在渲染中得到你的建议:
const suggestions = this.props.characters || []
查看 react-autosuggest
的文档,我也会将 refetch 调用移至 onSuggestionsFetchRequested
。我想像您一样利用 onChange
也应该可行,但这涵盖了更多我们希望再次获得建议的潜在场景。
onSuggestionsFetchRequested = ({ value }) => {
this.props.data.refetch({name: value});
};
目前我有一个 apollo 客户端,它有一个文本框,可以通过预输入格式填充自动完成。我正在使用 react-autosuggest 来填充建议。
在我的代码中,我有一个 HOC,我还触发了重新获取并在文本框 onChange 上设置了变量。
const TypeAheadWithData = graphql(TypeAheadQuery, {
options: ({ name }) => ({ variables: { name } })
})(TypeAhead);
export default TypeAheadWithData;
目前我有两个问题。一个是当我键入信息时,不会获取更新的结果,而是显示先前的预输入结果。例如,如果我有一个字符串 'san' 并且我添加 'sand' 它将显示 'san' 查询的结果。当我重新获取数据时,我无法等待异步数据。本质上是想弄清楚如何等待重新获取异步。或者其他形式的。 Obsservable/Watch 也许可以查询。在这方面的任何指导都会有很大帮助。
function getSuggestionValue(suggestion) {
return suggestion.name;
}
function renderSuggestion(suggestion) {
return (
<span>{suggestion.name}</span>
);
}
class TypeAhead extends React.Component {
constructor() {
super();
this.state = {
value: '',
suggestions: [],
isLoading: false
};
}
componentWillReceiveProps() {
this.setState({
suggestions: this.props.data.characters
});
}
onChange = (event, { newValue }) => {
console.log(newValue);
//this.props.data.variables.name = newValue;
this.props.data.refetch({name: newValue});
this.setState({
value: newValue
});
};
shouldRenderSuggestions(value) {
return value.trim().length > 2;
}
onSuggestionsFetchRequested = ({ value }) => {
//this.props.data.refetch({});
// this.setState({
// suggestions: this.props.data.characters
// });
// this.loadSuggestions(value);
};
onSuggestionsClearRequested = () => {
this.setState({
suggestions: []
});
};
render() {
const { value, suggestions, isLoading } = this.state;
const inputProps = {
placeholder: "Type 'c'",
value,
onChange: this.onChange
};
const status = (isLoading ? 'Loading...' : 'Type to load suggestions');
return (
<div>
<div className="status">
<strong>Status:</strong> {status}
</div>
<Autosuggest
suggestions={suggestions}
onSuggestionsFetchRequested={this.onSuggestionsFetchRequested}
onSuggestionsClearRequested={this.onSuggestionsClearRequested}
getSuggestionValue={getSuggestionValue}
renderSuggestion={renderSuggestion}
shouldRenderSuggestions={this.shouldRenderSuggestions}
inputProps={inputProps} />
</div>
);
}
}
const TypeAheadWithData = graphql(TypeAheadQuery, {
options: ({ name }) => ({ variables: { name } })
})(TypeAhead);
export default TypeAheadWithData;
我遇到的主要问题是正在建议之前加载的建议列表。因为它不等待重新获取,并且在收到一组新的状态时根本不更新状态。
如果您已经从 Apollo 收到作为 props 的建议,则无需使用组件的状态。我会将您的初始状态更改为:
this.state = {
value: '',
isLoading: false
};
然后你可以像这样在渲染中得到你的建议:
const suggestions = this.props.characters || []
查看 react-autosuggest
的文档,我也会将 refetch 调用移至 onSuggestionsFetchRequested
。我想像您一样利用 onChange
也应该可行,但这涵盖了更多我们希望再次获得建议的潜在场景。
onSuggestionsFetchRequested = ({ value }) => {
this.props.data.refetch({name: value});
};