我们正在使用react-select并在用户输入时获取项目。我无法使其与react-apollo一起使用。
有人可以帮我提供指导吗?
这是我失败的尝试:
class PatientSearchByPhone extends Component {
updateProp = mobile => {
if (mobile.length < 10) return;
this.props.data.refetch({ input: { mobile } });
};
render() {
console.log(this.props.data);
return <AsyncSelect cacheOptions loadOptions={this.updateProp} />;
}
}
const FETCH_PATIENT = gql`
query Patient($input: PatientSearchInput) {
getPatients(input: $input) {
id
first_name
}
}
`;
export default graphql(FETCH_PATIENT, {
options: ({ mobile }) => ({ variables: { input: { mobile } } })
})(PatientSearchByPhone);
版本:
“ react-apollo”:“ ^ 2.1.11”,
“反应选择”:“ ^ 2.1.0”
感谢您的时间。
答案 0 :(得分:2)
我收到一封电子邮件,要求回答此问题,这提醒我:
我不记得我实施的确切解决方案,因此我为此设置了一个完整的示例。在输入框中输入4个字符或更多字符后,该应用即会开始搜索。
代码如下:
import React, { useState } from "react";
import "./App.css";
import AsyncSelect from "react-select/async";
import ApolloClient, { gql } from "apollo-boost";
const client = new ApolloClient({
uri: "https://metaphysics-production.artsy.net"
});
const fetchArtists = async (input: string, cb: any) => {
if (input && input.trim().length < 4) {
return [];
}
const res = await client.query({
query: gql`
query {
match_artist(term: "${input}") {
name
imageUrl
}
}
`
});
if (res.data && res.data.match_artist) {
return res.data.match_artist.map(
(a: { name: string; imageUrl: string }) => ({
label: a.name,
value: a.imageUrl
})
);
}
return [];
};
const App: React.FC = () => {
const [artist, setArtist] = useState({
label: "No Name",
value: "https://dummyimage.com/200x200/000/fff&text=No+Artist"
});
return (
<div className="App">
<header className="App-header">
<h4>Search artists and their image (type 4 char or more)</h4>
<AsyncSelect
loadOptions={fetchArtists}
onChange={(opt: any) => setArtist(opt)}
placeholder="Search an Artist"
className="select"
/>
<div>
<img alt={artist.label} src={artist.value} className="aimage" />
</div>
</header>
</div>
);
};
export default App;
您可以克隆https://github.com/naishe/react-select-apollo,这是一个有效的示例。我已经在以下位置部署了该应用:https://apollo-select.naishe.in/,可能会玩一些吗?
答案 1 :(得分:0)
另一种选择是使用client
手动执行graphql查询,该查询通过用withApollo
包装基本组件来公开。
在下面的示例中,我们有
react-select
组件的BaseComponnent loadOptionsIndexes
通过client
执行异步graphql提取client
属性withApollo
包装基本组件,以提供我们将在react应用程序中其他地方使用的实际组件。const BaseComponent = (props) => {
const loadOptionsIndexes = (inputValue) => {
let graphqlQueryExpression = {
query: QUERY_INDEXES,
variables: {
name: inputValue
}
}
const transformDataIntoValueLabel = (data) => {
return data.indexes.indexes.map(ix => { return { value: ix.id, label: ix.name }})
}
return new Promise(resolve => {
props.client.query(graphqlQueryExpression).then(response => {
resolve(transformDataIntoValueLabel(response.data))
})
});
}
return (
<>
<div className="chart-buttons-default">
<div className="select-index-input" style={{width: 400, display: "inline-block"}}>
<AsyncSelect
isMulti={true}
cacheOptions={true}
defaultOptions={true}
loadOptions={loadOptionsIndexes} />
</div>
</div>
</>
)
}
BaseComponent.propTypes = {
client: PropTypes.any,
}
const ComplementComponent = withApollo(BaseComponent);
很抱歉,如果示例有点过时-复制并粘贴我以前的工作,而不是继续前进而没有回馈。