[英]undefined is not an object (evaluating 'event.target.name')
因此,我嘗試使用 react native 和 graphql apollo 進行身份驗證,但我遇到了一些問題。 當我嘗試在名稱 textinput 上鍵入時會彈出此錯誤。
登錄.js
// ... other imports
import { useMutation } from '@apollo/client';
import { useForm } from '../constants/hooks';
const { onChange, onSubmit, values } = useForm(loginUserCallback, {
name: '',
password: '',
});
const [loginUser, { loading }] = useMutation(mutationData.LOGIN_USER, {
update(_, { data: { login: userData } }) {
// context.login(userData);
navigation.replace('Navigator'); // router.push("/");
// toast.success(`Logged In Successfully`, { autoClose: 800 });
},
onError(err) {
console.log(err.graphQLErrors[0].extensions.errors);
},
variables: values,
});
function loginUserCallback() {
loginUser();
}
return (
<View>
<TextInput
value={values.name}
name="name"
onChangeText={onChange}
placeholder="Enter User Name"
/>
<TextInput
value={values.password}
name="password"
onChangeText={onChange}
placeholder="Enter Password"
/>
<TouchableOpacity onPress={onSubmit}>
<Text>SIGN IN</Text>
</TouchableOpacity>
</View>
);
鈎子.js
import { useState } from 'react';
export const useForm = (callback, initialState = {}) => {
const [values, setValues] = useState(initialState);
const onChange = (event) => {
setValues({ ...values, [event.target.name]: event.target.value });
};
const onSubmit = (event) => {
event.preventDefault();
callback();
};
return {
onChange,
onSubmit,
values,
};
};
突變數據.js
import { gql } from '@apollo/client';
// =============
// Auth
// =============
const LOGIN_USER = gql`
mutation login($name: String!, $password: String!) {
login(name: $name, password: $password) {
id
email
username
createdAt
token
}
}
`;
const REGISTER_USER = gql`
mutation register(
$username: String!
$email: String!
$password: String!
$confirmPassword: String!
) {
register(
registerInput: {
username: $username
email: $email
password: $password
confirmPassword: $confirmPassword
}
) {
id
email
username
createdAt
token
}
}
`;
export default {
LOGIN_USER,
REGISTER_USER,
};
額外信息:
如果我錯過了任何細節,我知道這是一個沒有信息的帖子,請在評論中告訴我,我會盡力提供這些信息,也是的,我嘗試了幾個小時來解決這個錯誤。
好的,我想我已經解決了你的問題
一個問題是,@Appfred 指出的onChangeText
返回值而不是事件
第二個問題是TextInput
沒有名稱道具,因此它忽略了您傳遞的那個
您可以通過一些調整來解決您的問題。
在您的自定義掛鈎中,您需要像這樣更改onChange
簽名
const onChange = (name, value) => {
setValues({ ...values, [name]: value });
};
你需要以這種方式修改你的表格
<View>
<TextInput
value={values.name}
onChangeText={value => onChange('name', value)}
placeholder="Enter User Name"
/>
<TextInput
value={values.password}
onChangeText={value => onChange('password', value)}
placeholder="Enter Password"
/>
<TouchableOpacity onPress={onSubmit}>
<Text>SIGN IN</Text>
</TouchableOpacity>
</View>
或者,如果您更喜歡咖喱 function 方法,您可以這樣做
const onChange = name => value => {
setValues({ ...values, [name]: value });
};
接着
<View>
<TextInput
value={values.name}
onChangeText={ onChange('name') }
placeholder="Enter User Name"
/>
<TextInput
value={values.password}
onChangeText={ onChange('password') }
placeholder="Enter Password"
/>
<TouchableOpacity onPress={onSubmit}>
<Text>SIGN IN</Text>
</TouchableOpacity>
</View>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.