使用React-Apollo的React-Select不起作用

时间:2018-10-08 04:32:00

标签: reactjs graphql apollo react-apollo react-select

我们正在使用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”

感谢您的时间。

2 个答案:

答案 0 :(得分:2)

我收到一封电子邮件,要求回答此问题,这提醒我:

enter image description here

我不记得我实施的确切解决方案,因此我为此设置了一个完整的示例。在输入框中输入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包装基本组件来公开。

在下面的示例中,我们有

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

很抱歉,如果示例有点过时-复制并粘贴我以前的工作,而不是继续前进而没有回馈。