yaNastia
@yaNastia

Как использовать один и тот же объект но с разными свойствами в разных компонентах?

Привет, я на момент инициализации приложения меняю реальный apolloClient на фиктивный, что бы вместо запросов на сервер отдавать фиктивные данные. Все работает правильно, но появилась проблема, в некоторых компонентах есть одна и та же переменная metric в которую присваиваются разные значения, (поменять название переменой в компонентах нельзя) вопрос в том как использовать эту переменную для разных компонентов сохраняя уникальность свойств?

Пример данных, которые приходят с сервера в разных запросах, для разных компонентов:
для одного компонента: {metric: {id: 1, something: "meow"}}
Для другого: {metric: {id: 2, entities: 50}}

И вот, я не могу создать две переменных metricлибо объединить данные в одну переменную metricпотому что данные в компонентах будут не корректны.

Место где отдаю свою мокапы
import {
    metric
} from "./mockedData"

export const mocks = {
    Query: () => ({
        metric // здесь отдаю фиктивные данные в подменный apolloClient 
    })
}


место где я создаю фиктивный apolloClient (чисто для полноты картины)
import ApolloClient from "apollo-client"
import {
    makeExecutableSchema,
    addMockFunctionsToSchema,
} from "graphql-tools"
import { graphql, print } from "graphql"
import { InMemoryCache } from "apollo-cache-inmemory"
import { ApolloLink, Observable } from "apollo-link"

// simulate loading
function delay(ms) {
    return new Promise((resolve) => {
        setTimeout(() => {
            resolve()
        }, ms)
    })
}

function createLink(schema, mocks) {
    const delayMs = 1000
    return new ApolloLink(operation => new Observable((observer) => {
        const { query, operationName, variables } = operation
        delay(delayMs)
            .then(() => graphql(
                schema,
                print(query),
                {},
                {},
                variables,
                operationName
            ))
            .then(() => {
                // inject mocked data here
                observer.next({ data: mocks.Query() })
                observer.complete()
            })
            .catch(observer.error.bind(observer))
    }))
}

export function createMockedClient({
    typeDefs,
    mocks,
}) {
    const schema = makeExecutableSchema({ typeDefs })

    const mockOptions = {
        schema,
        mocks,
    }

    addMockFunctionsToSchema(mockOptions)

    const cache = new InMemoryCache()

    return new ApolloClient({
        cache,
        link: ApolloLink.from([
            createLink(schema, mocks),
        ]),
        connectToDevTools: true,
    })
}


Помогите пожалуйста =^.^=
  • Вопрос задан
  • 173 просмотра
Пригласить эксперта
Ответы на вопрос 1
Fi1osof
@Fi1osof
JS fullstack developer
Для полноты картины надо было еще схему вашего компонента приложить.

Если в вашей схеме что-то типа такого:
type Metric {
  id: Int!
  something: String
}

и хотите, чтобы он мог корректно возвращать entities: 50, то самое правильное это добавить это свойство в саму модель.

type Metric {
  id: Int!
  """ Боевая переменная """
  something: String

  """ Для тестов """
  entities: Int
}


То есть у вас и та и другая переменная в схеме есть, передавать можно любое свойство, при этом поля не обязательные, так что если не будет получено, то ничего страшного.

Это по сути единственный наиболее удобный путь для этого.

Если у вас ситуация сложнее (в боевом режиме значительно больше полей и вы не хотите все поля перечислять), то для малозначительных моделей вы и вовсе можете задать тип JSON.
Если вы используете Apollo-Server, вот их официальная инструкция: https://www.apollographql.com/docs/graphql-tools/s...
Тогда у вас объект может вообще любой набор валидных свойств иметь. Но не советую с этим увлекаться, это часто приводит к хаосу.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы