Повторное получение запросов с любой комбинацией параметров - PullRequest
0 голосов
/ 15 января 2019

Я столкнулся с проблемой при повторном получении запросов после мутации.Если в запросе нет параметров, то это нормально, но если в запросе несколько параметров, и разные страницы используют разные из них.Например, запрос GET_ITEMS принимает параметры: userId, companyId, categoryId.Как я могу сказать Аполлону повторно выполнить все эти запросы с любой комбинацией параметров?

1 Ответ

0 голосов
/ 23 января 2019

Кажется, я не могу сделать это сейчас с клиентом Apollo. Поэтому мне пришлось сохранить параметры всех вызовов GET_ITEMS со всех страниц, а затем перенести сохраненные параметры в метод мутации refetchQueries. Код получился так:

ItemsContext.js

const ItemsContext = React.createContext({
  cachedQueryVars: [],
});

ItemsList.js

...
render() {
...
return <ItemsContext.Consumer>{({cachedQueryVars}) => {
       cachedQueryVars.push(variables);
       return <Query query={GET_ITEMS} variables={variables} >
...

ItemEdit.js

...
render() {
...
return <ItemsContext.Consumer>{({cachedQueryVars}) => 
              <Mutation mutation={UPDATE_ITEM_MUTATION}
                  refetchQueries={({data}) => this.handleRefetchQueries(data.updateItem, cachedQueryVars)}
...
}

handleRefetchQueries(newItem, cachedItemsQueryVars) {
  let result = [];
  let filtered = null;

  if(this.state.oldCategoryId != newItem.category.id) {
    filtered = cachedItemsQueryVars.filter(v => v.categoryId == this.state.oldCategoryId);
    result = this.concatItemQueryVars(result, filtered);
    filtered = cachedItemsQueryVars.filter(v => v.categoryId == newItem.category.id);
    result = this.concatItemQueryVars(result, filtered);
  }
  if(this.state.oldCompanyId != newItem.company.id) {
    filtered = cachedItemsQueryVars.filter(v => v.companyId == this.state.oldCompanyId);
    result = this.concatItemQueryVars(result, filtered);
    filtered = cachedItemsQueryVars.filter(v => v.companyId == newItem.company.id);
    result = this.concatItemQueryVars(result, filtered);
  }
  ...

  return result;
}

concatItemQueryVars(result, filtered) {
  return result.concat(filtered.map(v => ({
    query: GET_ITEMS,
    variables: v
  })));
}
...