【问题标题】:Pass graphql variable to the Material UI component将 graphql 变量传递给 Material UI 组件
【发布时间】:2021-05-30 19:01:12
【问题描述】:

我正在使用 React Typescript 并有一个自动完成材质 UI 组件。我正在尝试将查询建议放入自动完成组件中。

我的 graphql 查询如下所示:

查询定义:

import gql from 'graphql-tag';
import {useQuery} from 'react-apollo';

const TODOS = gql`
  query todos($id: ID!) {
    todo(id: $id) {
      id
      name
    }
  }
`;

查询初始化:

const { loading, error, data } = useQuery(TODOS, {
  variables: { id }
});

我想创建一个自动完成组件,它将从文本字段组件中获取一个数值并将其传递给自动完成材料 ui 组件?

我的数字组件如下所示:

 <TextField
          id="filled-number"
          label="Number"
          type="number"
          InputLabelProps={{
            shrink: true,
          }}
          variant="filled"
        />

自动完成组件:

<Autocomplete
                        id="combo-box-demo"
                        options={idx.name}
                        getOptionLabel={(option: {name: string}) => option.name}
                        style={{width: 300}}
                        renderInput={params => (
                          <TextField
                            {...params}
                            label="Combo box"
                            variant="outlined"
                          />

所以它应该从数字文本字段组件中设置id,然后将查询传递给自动完成组件?

【问题讨论】:

  • 是否要将查询结果传递给自动完成组件?
  • 是的..我想要自动完成的结果,文本字段组件将通过向查询提供 id 来过滤它

标签: reactjs graphql material-ui apollo


【解决方案1】:

我不知道 idx.name 来自哪里,但它似乎不是一个数组,而 Autocomplete 的属性 options 需要一个数组类型作为值。

您需要将data.todo 传递给Autocomplete 属性options

那么你必须让你的 TextField 组件受状态控制。

代码示例:

const Component = () => {
  const [id, setId] = useState(%INITIAL_VALUE_IF_NEEDED%);
  
  const { data } = useQuery(DATA, {
    variables: { id },
  });

  const handleId = id => setId(id);

  return (
    <Fragment>
     <TextField {...params}
       label="Combo box"
       variant="outlined"
       onChange={handleChange}
     />
     <Autocomplete
       id="combo-box-demo"
       options={data?.todo || []}
       getOptionLabel={(option: {name: string}) => option.name}
       style={{width: 300}}
       renderInput={params => (
         <TextField
           {...params}
           label="Combo box"
           variant="outlined"
         />
       )}
    </Fragment>
  );
}

然后每次在useQuery中更新id你就可以看到选项

【讨论】:

  • 如果我要运行 2 个查询,我该如何使用它?即 2 个文本字段和 2 个自动完成组件
  • 如果您的意思是 data 变量已经声明的问题,您可以为其添加别名。 IE。 { 数据:dataA } 和 { 数据:dataB }
猜你喜欢
  • 2018-11-24
  • 2021-01-23
  • 1970-01-01
  • 2020-10-24
  • 1970-01-01
  • 2020-09-30
  • 1970-01-01
  • 2020-05-05
  • 2019-09-15
相关资源
最近更新 更多