React-Select 与 React-Apollo 不工作
React-Select with React-Apollo does not work
我们正在使用 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",
"react-select": "^2.1.0"
感谢您的宝贵时间。
我收到一封电子邮件,要求我回答这个问题。让我想起了XKCD的这部漫画:
我不记得我实施的确切解决方案,所以我为此设置了一个完整的示例。
只要您在输入框中输入 4 个或更多字符(您应该输入艺术家姓名。试试 vinci
?),此应用(下面的代码片段)就会启动搜索。这是代码:
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 it is a working example. I have deployed the app here: https://apollo-select.naishe.in/,可以玩一下吗?
另一种选择是使用 client
手动执行 graphql 查询,该 client
通过用 withApollo
.
包装基本组件而暴露出来
在下面的例子中,我们有,
- 呈现 AsyncSelect
react-select
组件的 BaseComponnent
loadOptionsIndexes
通过 client
执行异步 graphql 获取
- BaseComponent.propTypes 描述了所需的
client
prop
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);
抱歉,如果这个例子有点不对劲 - 复制并粘贴我的工作而不是继续前进而不回馈。
我们正在使用 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",
"react-select": "^2.1.0"
感谢您的宝贵时间。
我收到一封电子邮件,要求我回答这个问题。让我想起了XKCD的这部漫画:
我不记得我实施的确切解决方案,所以我为此设置了一个完整的示例。
只要您在输入框中输入 4 个或更多字符(您应该输入艺术家姓名。试试 vinci
?),此应用(下面的代码片段)就会启动搜索。这是代码:
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 it is a working example. I have deployed the app here: https://apollo-select.naishe.in/,可以玩一下吗?
另一种选择是使用 client
手动执行 graphql 查询,该 client
通过用 withApollo
.
在下面的例子中,我们有,
- 呈现 AsyncSelect
react-select
组件的 BaseComponnent loadOptionsIndexes
通过client
执行异步 graphql 获取
- BaseComponent.propTypes 描述了所需的
client
prop 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);
抱歉,如果这个例子有点不对劲 - 复制并粘贴我的工作而不是继续前进而不回馈。