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.

包装基本组件而暴露出来

在下面的例子中,我们有,

  1. 呈现 AsyncSelect react-select 组件的 BaseComponnent
  2. loadOptionsIndexes 通过 client
  3. 执行异步 graphql 获取
  4. BaseComponent.propTypes 描述了所需的 client prop
  5. 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);

抱歉,如果这个例子有点不对劲 - 复制并粘贴我的工作而不是继续前进而不回馈。