Ответы пользователя по тегу React
  • Как в React написать mutation и query на сервер GraphQL?

    Fi1osof
    @Fi1osof
    JS fullstack developer
    Нина, во-первых, у вас неправильно написана мутация, чисто синтаксически.
    У вас написано
    const mutation = `
    mutation createUser($firstName: String,$secondName: String, $email: String,$password:String){
      createUser(firstName: $firstName,secondName:$secondName,email:$email, password:$password){ 
       signup(   
          firstName
          secondName
          email
          password   
          )
      }
    }`;


    а должно быть
    const mutation = `
    mutation createUser(
      $firstName: String
      $secondName: String
      $email: String
      $password: String
    ) {
      signup(
        firstName: $firstName
        secondName: $secondName
        email: $email
        password: $password
      )
    }
    `;


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

    Но даже в этом случае у вас не пройдет запрос, так как в схеме у вас некоторые параметры указаны как обязательные, а вы в своем запросе их не указали обязательными. Вот смотрите схему:
    type Mutation {
      signup(
        firstName: String!
        secondName: String!
        email: String!
        password: String!
      ): String
      // ...
    }

    У вас здесь все параметры обязательные, то есть ваш запрос должен выглядеть так:
    const mutation = `
    mutation createUser(
      $firstName: String!
      $secondName: String!
      $email: String!
      $password: String!
    ) {
      signup(
        firstName: $firstName
        secondName: $secondName
        email: $email
        password: $password
      )
    }
    `;


    В целом же, судя по тому, что у вас ошибка возникает в .mjs - файлах, она возникает не на стороне фронта, а уже на стороне АПИ-сервера, так что сам механизм у вас вроде как реализован. Но сама тема слишком объемная, чтобы в одном комменте можно было бы ее раскрыть. Попробуйте посмотреть вот это видео: https://www.youtube.com/watch?v=69e-omuXdIw
    Оно объемное, но зато раскрывает все уровни реализации GraphQL-API.
    Ответ написан
    2 комментария
  • Как использовать 2 useQuery в одном файле?

    Fi1osof
    @Fi1osof
    JS fullstack developer
    Вероятный ответ.
    Ответ написан
    Комментировать
  • Как через graphql узнать путь к файлу?

    Fi1osof
    @Fi1osof
    JS fullstack developer
    Но зачем это делать через граф? Обычно на сайтах используют типа react-router-dom, и с его же помощью определяют какая сейчас страница и активной делать ссылку или нет.
    В нем специально есть NavLink. Он сам становится активным, когда совпадает. Остается только класс активной ссылки указать. https://reactrouter.com/web/api/NavLink
    Ответ написан
    Комментировать
  • Почему при попытке обновить state из useEffect он не обновляется?

    Fi1osof
    @Fi1osof
    JS fullstack developer
    Никита, вы зря засунули setTabsFields внутрь цикла map. setTabsFields - это синхронная функция. При каждом выполнении цикла map и вызове setTabsFields у вас let obj = {...tabsFields} не является новым объектом с актуальным состоянием tabsFields. В вашем случае это всегда новый объект, но с одними и теми же данными, которые были в tabsFields на момент выполнения цикла.
    Сделайте примерно так:
    useEffect(() => {
    
            // const obj = {...tabsFields}
            // Сдесь скорее всего всегда пустой объект начальный должен быть, иначе в нем могут остаться уже неактуальные данные.
            const obj = {}
    
            if (data !== undefined) {
                // перебираю массив контактных лиц
                data.org.contactPersons.map(i => {
                    const ID = nanoid(8) // использую либу nanoid для генерации ID
    
                    obj[i._id + '~' + ID + '^name'] = i.name 
                    i.phone.map((j, idx) => {
                        obj[i._id + '~' + ID + '^phone-' + idx] = j
                    })
    
                    i.eMail.map((j, idx) => {
                        obj[i._id + '~' + ID + '^eMail-' + idx] = j
                    })
                })
            }
    
             // Устанавливаем конечный набор полей в стейт
             setTabsFields(obj)
    
        }, [data])
    Ответ написан
    Комментировать
  • Почему выполняется запрос при повторной отрисовке компонентов?

    Fi1osof
    @Fi1osof
    JS fullstack developer
    Вряд ли здесь бага графа.

    Скорее всего у вас где-то логическая ошибка. Почему так говорю? Потому что вы в data?.login != null используете != (не строгое сравнение). Старайтесь максимально использовать нестрогое сравнение, иначе вы привыкаете к неточностям. Если вы в данном случае хотите явно сравнивать нестрого, тогда хотя бы пишите if(!data?.login). Хотя это тоже не строгое сравнение, но так более принято.

    Во-вторых, у вас
    if (data?.login != null) {
    onAuth(data.login)
    }
    выполняется при каждом рендеринге. Так как у вас в этот момент логин не пустой, у вас каждый раз срабатывает метод onAuth. Идите посмотрите что в нем.

    В-третьих, посмотрите конфиг созданного аполло-клиента, может вы в нем прописали по-умолчанию fetchPolicy: 'network-only' или типа того.
    Ответ написан