Использование перехватчика мутации для обновления данных на сервере Graphql

На самом деле я новичок в React Native. В моем недавнем проекте я столкнулся с проблемой при использовании хука useMutation для обновления данных на моем сервере. Я прикрепил файл, в котором я его использую.

Для справки прикрепил скриншот детской площадки.

Примечание: - Я не получаю сообщения об ошибке, и значения не обновляются на сервере. Если я нажму на кнопку. Не требуется повторно загружать его и отображать информацию с помощью запроса, достаточно просто обновления.

Структура мутации:

структура мутации.

Запрос graphql отправлен:

запрос graphql отправлен

import React, { Component,useState } from 'react';
import { View, Text, StyleSheet, Dimensions,ScrollView,AsyncStorage,TouchableHighlight,Alert,KeyboardAvoidingView} from 'react-native';
import TopHeader from '../../Header/TopHeader';
import { gql } from 'apollo-boost';
import Input from '../../SignIn/Input';

import { ScreenLoader } from '../../Loader';
import { useMutation } from '@apollo/react-hooks';


export const UPDATE_USER_DETAILS = gql`
mutation UpdateUser($input: AccountInput!){
  accountUpdate(input: $input){
    accountErrors{
      message
    }
    user{
      id
      email
      firstName
      lastName
    }
  }
}
`;

const getToken = async () => {
  const token = await AsyncStorage.getItem('token');
  console.log("Token = "+token);
  return token;
}

function UpdateUserComponent({ firstname,lastname }) {

  const [newfirstName, setNewfirstName] = useState(firstname);
  const [newlastName, setNewlastName] = useState(lastname);

  var token = getToken();
  console.log("Inside Update User Component");

  const [updateUser,{loading,data,error}] = useMutation(UPDATE_USER_DETAILS,{
    headers: {
      Authorization: token ? `Bearer ${token}` : ''}
    })
  if (loading) return <ScreenLoader/>
  if (error){
    console.log(error);
    return <Text>Error...</Text>
  } 
 
  console.log(data);

  return (
    <KeyboardAvoidingView style={styles.container} behavior='padding' enabled>
      <ScrollView>
      <View style={{ paddingTop: 36 }}>
        <Input type="text" value={newfirstName} onChange={e => setNewfirstName(e.target.value)} />
      <View style={{ paddingTop: 10 }}>
        <Input type="text" value={newlastName} onChange={e => setNewlastName(e.target.value)}/>
      </View>
      <TouchableHighlight underlayColor='#fff' onPress={() => updateUser({ variables: { "input": {"firstName": newfirstName,"lastName": newlastName }} })} >
        <View style={{ paddingTop: 50 }}>
          <View style={styles.buttonLayout}>
            <Text style={styles.buttonText}>Save Changes</Text>
          </View>
        </View>
      </TouchableHighlight>
      </View>
      </ScrollView>
    </KeyboardAvoidingView>
  )
}



const width = Dimensions.get('window').width;

class AccountSettings extends Component {

  render() {

    return (
      <View style={{ flex: 1 }}>
        <TopHeader text='Account Settings'/>
        <UpdateUserComponent/>
      </View>
    );
  }
}



const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'flex-start',
    alignItems: 'center',
    paddingTop: 20,
},
buttonLayout: {
    backgroundColor: '#C5C5C5',
    width: width * 85 / 100,
    height: 45,
    justifyContent: 'center',
    alignItems: 'center',
    borderRadius: 20,
},
buttonText: {
    color: '#919191',
    fontSize: 14

},
  

})


export default AccountSettings;

Обновление:

Возникла ошибка при получении значений из элементов ввода формы. Если я присваиваю значения напрямую, они обновляются. Например: - если я использую этот оператор при нажатии кнопки, данные обновляются на сервере.

onPress={() => UpdateUser({ variables: { "input": {"firstName": "Prabhu","lastName": "Visu" }} }) }

Пожалуйста, помогите мне решить эту проблему, чтобы она работала динамически. Спасибо .!


person Prabu visu    schedule 07.01.2020    source источник
comment
Вы видите, что запрос graphql выходит на вкладке сети в ваших инструментах разработчика? Здесь проще всего отследить, действительно ли происходит запрос? При нажатии на TouchableHighlight вы должны увидеть, что там появляется запрос с именем graphql. В противном случае запрос даже не запускается.   -  person NewVigilante    schedule 07.01.2020
comment
Как я могу его найти, на самом деле я использую Expo для запуска приложения   -  person Prabu visu    schedule 07.01.2020
comment
Я не совсем уверен в Expo, так как я не использовал его, но подозреваю, что вы можете просто использовать свои браузерные инструменты Dev Tools во время работы Expo. Щелкните правой кнопкой мыши страницу где-нибудь, и на ней должно быть написано «Проверить элемент» или «Проверить» или что-то подобное. Это откроет новое окно, где вы должны увидеть вкладку Сеть, которая покажет вам все запросы, которые происходят.   -  person NewVigilante    schedule 07.01.2020
comment
Да, когда я нажимаю кнопку, отправляется запрос graphql. Я добавил изображение для вашей справки.   -  person Prabu visu    schedule 07.01.2020
comment
Когда вы нажимаете на этот конкретный запрос, у вас будет доступ для просмотра фактического ответа. Там вы сможете увидеть, все ли правильно или нет. Если нет, это даст вам какое-то объяснение того, чего не хватает. Изображение взято из запроса, а не из фактической мутации, которую вы пытаетесь запустить.   -  person NewVigilante    schedule 07.01.2020
comment
допустимы ли заголовки для useMutation? обычно, когда мы хотим интегрировать это поведение, оно определяется в определении клиента.   -  person Franrey Saycon    schedule 07.01.2020


Ответы (1)


Заменить это:

  *onChange={e => setNewfirstName(e.target.value)}*

С этим:

  *onChangeText={text => setNewfirstName(text)}*

Будет работать.!

person Prabu visu    schedule 07.01.2020