Instagramクローンエンコーディング14日目-App
17643 ワード
#9.4 React Hook Forms on Native
ローカルにフォームがなくてもいいです.
userEffectを使用してregisterを登録し、onChangeTextを使用してValueを設定します.//Login.js
export default function Login({ navigation }) {
const { register, handleSubmit, setValue } = useForm();
const onValid = (data) => {
console.log(data);
};
useEffect(() => {
register("username");
register("password");
}, [register]);
return (
<AuthLayout>
<TextInput
placeholder="Username"
returnKeyType="next"
autoCapitalize="none"
placeholderTextColor={"rgba(255, 255, 255, 0.6)"}
onSubmitEditing={() => onNext(passwordRef)}
onChangeText={(text) => setValue("username", text)}
/>
<TextInput
ref={passwordRef}
placeholder="Password"
secureTextEntry
returnKeyType="done"
lastOne={true}
onSubmitEditing={handleSubmit(onValid)}
placeholderTextColor={"rgba(255, 255, 255, 0.6)"}
onChangeText={(text) => setValue("password", text)}
/>
<AuthButton
text="Log In"
disabled={false}
onPress={handleSubmit(onValid)}
/>
</AuthLayout>
);
}
#9.5 Navigate with param
navigationの内蔵navigation関数はparamと一緒にスキップできます.//CreateAccount.js
export default function CreateAccount({ navigation }) {
const { register, handleSubmit, setValue, getValues } = useForm();
const onCompleted = (data) => {
const { createAccount: { ok } } = data;
const { username, password } = getValues();
if (ok) {
navigation.navigate("Login", {
username,
password,
});
}
};
受信時にuseFormを介してルーティングされたparamを受信する.//Login.js
export default function Login({ route: { params } }) {
const { register, handleSubmit, setValue, formState, watch } = useForm({
defaultValues: {
password: params?.password,
username: params?.username,
}
});
#9.6 AsyncStorage
ログインすると、複数セットを使用して同期ストレージに格納されます.
Web上でlocalStorageから直接取得するため、isLogedInValerの作成時にlocalStorage値として、reac-nativeは非同期受信として、最初にfalseに設定し、ロード時に値をチェックします//apollo.js
import { ApolloClient, InMemoryCache, makeVar } from "@apollo/client";
import AsyncStorage from "@react-native-async-storage/async-storage";
export const isLoggedInVar = makeVar(false);
export const tokenVar = makeVar("");
export const logUserIn = async (token) => {
await AsyncStorage.multiSet([["token", JSON.stringify(token)], ["loggedIn", JSON.stringify("yes")],]);
isLoggedInVar(true);
tokenVar(token);
};
アプリケーションの最初の実行とロード時にトークンを確認します.//App.js
const preload = async () => {
const token = await AsyncStorage.getItem("token");
if (token) {
isLoggedInVar(true);
tokenVar(token);
}
return preloadAssets();
};
Reference
この問題について(Instagramクローンエンコーディング14日目-App), 我々は、より多くの情報をここで見つけました
https://velog.io/@pjoon357/인스타그램-클론코딩-14일차-App
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
//Login.js
export default function Login({ navigation }) {
const { register, handleSubmit, setValue } = useForm();
const onValid = (data) => {
console.log(data);
};
useEffect(() => {
register("username");
register("password");
}, [register]);
return (
<AuthLayout>
<TextInput
placeholder="Username"
returnKeyType="next"
autoCapitalize="none"
placeholderTextColor={"rgba(255, 255, 255, 0.6)"}
onSubmitEditing={() => onNext(passwordRef)}
onChangeText={(text) => setValue("username", text)}
/>
<TextInput
ref={passwordRef}
placeholder="Password"
secureTextEntry
returnKeyType="done"
lastOne={true}
onSubmitEditing={handleSubmit(onValid)}
placeholderTextColor={"rgba(255, 255, 255, 0.6)"}
onChangeText={(text) => setValue("password", text)}
/>
<AuthButton
text="Log In"
disabled={false}
onPress={handleSubmit(onValid)}
/>
</AuthLayout>
);
}
navigationの内蔵navigation関数はparamと一緒にスキップできます.
//CreateAccount.js
export default function CreateAccount({ navigation }) {
const { register, handleSubmit, setValue, getValues } = useForm();
const onCompleted = (data) => {
const { createAccount: { ok } } = data;
const { username, password } = getValues();
if (ok) {
navigation.navigate("Login", {
username,
password,
});
}
};
受信時にuseFormを介してルーティングされたparamを受信する.//Login.js
export default function Login({ route: { params } }) {
const { register, handleSubmit, setValue, formState, watch } = useForm({
defaultValues: {
password: params?.password,
username: params?.username,
}
});
#9.6 AsyncStorage
ログインすると、複数セットを使用して同期ストレージに格納されます.
Web上でlocalStorageから直接取得するため、isLogedInValerの作成時にlocalStorage値として、reac-nativeは非同期受信として、最初にfalseに設定し、ロード時に値をチェックします//apollo.js
import { ApolloClient, InMemoryCache, makeVar } from "@apollo/client";
import AsyncStorage from "@react-native-async-storage/async-storage";
export const isLoggedInVar = makeVar(false);
export const tokenVar = makeVar("");
export const logUserIn = async (token) => {
await AsyncStorage.multiSet([["token", JSON.stringify(token)], ["loggedIn", JSON.stringify("yes")],]);
isLoggedInVar(true);
tokenVar(token);
};
アプリケーションの最初の実行とロード時にトークンを確認します.//App.js
const preload = async () => {
const token = await AsyncStorage.getItem("token");
if (token) {
isLoggedInVar(true);
tokenVar(token);
}
return preloadAssets();
};
Reference
この問題について(Instagramクローンエンコーディング14日目-App), 我々は、より多くの情報をここで見つけました
https://velog.io/@pjoon357/인스타그램-클론코딩-14일차-App
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
//apollo.js
import { ApolloClient, InMemoryCache, makeVar } from "@apollo/client";
import AsyncStorage from "@react-native-async-storage/async-storage";
export const isLoggedInVar = makeVar(false);
export const tokenVar = makeVar("");
export const logUserIn = async (token) => {
await AsyncStorage.multiSet([["token", JSON.stringify(token)], ["loggedIn", JSON.stringify("yes")],]);
isLoggedInVar(true);
tokenVar(token);
};
//App.js
const preload = async () => {
const token = await AsyncStorage.getItem("token");
if (token) {
isLoggedInVar(true);
tokenVar(token);
}
return preloadAssets();
};
Reference
この問題について(Instagramクローンエンコーディング14日目-App), 我々は、より多くの情報をここで見つけました https://velog.io/@pjoon357/인스타그램-클론코딩-14일차-Appテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol