状態に反応するローカルストレージを割り当てます。Reactフック

Malthe Have Musaeus

ユーザーにサインインして、グローバルコンテキストをユーザーデータで更新しようとしています。ユーザーのサインインを維持するために、ローカルストレージにデータを保存しています。

私は状態を処理するためにreact-hookを使用しているので、状態を定義しました:let [userData, setUserData] = useState({});

ユーザーをサインインさせたままにしたくないので、サインイン時にデータをローカルストレージに保存します。これは機能し、データは実際にはローカルストレージに保存されます。

しかし、私の問題はuserData、ローカルストレージからの現在のデータと同じ初期状態を設定できないことです。つまり、userDataリロード時に状態がデフォルトにリセットされます。

ローカルストレージから初期データを取得し、それをuseEffectフック内の状態に割り当てるとうまくいくと思いましたただし、setUserData内部を呼び出すと状態は更新されませんuseEffect

AuthContext.js:

import React, { createContext, useState, useEffect } from 'react';

export const AuthContext = createContext();

const AuthContextProvider = props => {
    let [userData, setUserData] = useState({});

    const loginUser = (data) => {
        localStorage.setItem('userData', JSON.stringify({
            key: data.key,
            id: data.id,
            email: data.email,
            first_name: data.first_name,
            last_name: data.last_name
        })); // Save the user object in local storage
        setUserData({
            key: data.key,
            id: data.id,
            email: data.email,
            first_name: data.first_name,
            last_name: data.last_name
        }); // Set user data    
    };

    const logoutUser = () => {
        localStorage.removeItem('userData');
        setUserData({}); // Empty user data state
        newToast('Successfully signed out');
    };

    useEffect(() => {
        const localUser = JSON.parse(localStorage.getItem('userData'));
        if (localUser && localUser.key) {
            setUserData({
                key: localUser.key,
                id: localUser.id,
                email: localUser.email,
                first_name: localUser.first_name,
                last_name: localUser.last_name
            }); // Set user data    
        }
    }, [])


    return (
        <AuthContext.Provider value={{ userData, loginUser, logoutUser, newToast }}>
            {props.children}
        </AuthContext.Provider>
    )
}

export default AuthContextProvider;

Signin.js:

const Signin = props => {
    let [loading, setLoading] = useState(false);
    let [formError, setFormError] = useState(false);
    const { userData, loginUser, newToast } = useContext(AuthContext);
    const { register, handleSubmit, errors, setError, clearError } = useForm();

    const onSubmit = e => {
        setLoading(true);
        setFormError(false);
        clearError(); // Clear all erros on form        
        axios
            .post('users/auth/login/', {
                headers: { 'Content-Type': 'application/json' },
                email: `${e.email}`,
                password: `${e.password}`,
            })
            .then(res => {
                const { data } = res
                loginUser(data);
                newToast('Successfully signed in');
            })
            .catch((error) => {
                const { data } = error.response;
                console.log(data);
                data.email && setError("email", "", data.email);
                data.password1 && setError("password", "", data.password1);
                setFormError(true);
            })

        setLoading(false);
    };
    return ( ... );
}
Malthe Have Musaeus

だから私は解決策を見つけました!

AuthContext.jsでは、で状態を割り当てる必要はありませんでしたuseEffect代わりに、状態フックを定義するときに初期データを直接取得します。

const localUser = JSON.parse(localStorage.getItem('userData')) || {};
let [userData, setUserData] = useState(localUser);

そうすれば、useEffectフックはまったく必要ありません

これが推奨される方法であることを願っています。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

反応で状態をローカルストレージに保存する

分類Dev

Reactでは、ローカルストレージから状態を取得し、この状態に基づいて条件付きで別の状態を設定する必要があります

分類Dev

DIV状態のローカルストレージを切り替えます

分類Dev

デフォルトのコンポーネントクラスで状態を使用するときに反応すると、未定義になります

分類Dev

ローカルストレージの値を$ scopeに割り当てます

分類Dev

グローバルな状態を管理するためにReactフックをエクスポートするのは間違っていますか?

分類Dev

netplanを使用してローカル静的IPを設定すると、ネットワークがスリープ状態になります

分類Dev

グローバル状態またはReactフックのローカル状態を使用する必要がありますか?

分類Dev

React-状態をローカルストレージに保存

分類Dev

ローカルストレージ、Reactフック、コンテキストプロバイダーを使用して状態を永続的に保つにはどうすればよいですか?

分類Dev

Reactフックを使用してCookieまたはローカルストレージを追加する方法

分類Dev

反応フックを使用してコンテキストプロバイダーに複数の状態を追加する

分類Dev

Rフォレストプロットパッケージを使用して、ボックスに可変色を割り当てる方法はありますか?

分類Dev

反応プロジェクトでredux状態をマルチフィルターするにはどうすればよいですか?

分類Dev

ネストされた状態プロパティにレデューサーを割り当てますか?

分類Dev

(Power)Mockitoでローカルオブジェクトの状態と割り込みフローを追跡しますか?

分類Dev

ログイン状態に応じてルーターでユーザーをリダイレクトする

分類Dev

ログイン状態に応じてルーターでユーザーをリダイレクトする

分類Dev

ログイン状態に応じてルーターでユーザーをリダイレクトする

分類Dev

状態更新にコンポーネントを再描画するワンステップの背後にある:フックを反応させます

分類Dev

開始時に非同期ストレージからネイティブロード状態に反応する

分類Dev

NodeJとMongooseを使用してボットフレームワークの状態管理にMongoDBをローカルでdirectline-jsを使用する方法は?

分類Dev

データフレーム-対応するインデックスに値を割り当てます

分類Dev

同期ブロックの外部で定義されたフィールドにオブジェクトを割り当てる-スレッドセーフですか?

分類Dev

React:reduxストアと状態をローカルファイルに保存する可能性はありますか?

分類Dev

React Typescript:ルーターコンポーネントに反応する場所の状態を追加します

分類Dev

ナビゲーションルートの状態に反応して、キーとインデックスを作成します

分類Dev

LongClickListenerがImageViewに割り当てられた状態でRecyclerViewをスクロールします

分類Dev

反応クラスを反応フックに変換する方法(firebaseストレージ)

Related 関連記事

  1. 1

    反応で状態をローカルストレージに保存する

  2. 2

    Reactでは、ローカルストレージから状態を取得し、この状態に基づいて条件付きで別の状態を設定する必要があります

  3. 3

    DIV状態のローカルストレージを切り替えます

  4. 4

    デフォルトのコンポーネントクラスで状態を使用するときに反応すると、未定義になります

  5. 5

    ローカルストレージの値を$ scopeに割り当てます

  6. 6

    グローバルな状態を管理するためにReactフックをエクスポートするのは間違っていますか?

  7. 7

    netplanを使用してローカル静的IPを設定すると、ネットワークがスリープ状態になります

  8. 8

    グローバル状態またはReactフックのローカル状態を使用する必要がありますか?

  9. 9

    React-状態をローカルストレージに保存

  10. 10

    ローカルストレージ、Reactフック、コンテキストプロバイダーを使用して状態を永続的に保つにはどうすればよいですか?

  11. 11

    Reactフックを使用してCookieまたはローカルストレージを追加する方法

  12. 12

    反応フックを使用してコンテキストプロバイダーに複数の状態を追加する

  13. 13

    Rフォレストプロットパッケージを使用して、ボックスに可変色を割り当てる方法はありますか?

  14. 14

    反応プロジェクトでredux状態をマルチフィルターするにはどうすればよいですか?

  15. 15

    ネストされた状態プロパティにレデューサーを割り当てますか?

  16. 16

    (Power)Mockitoでローカルオブジェクトの状態と割り込みフローを追跡しますか?

  17. 17

    ログイン状態に応じてルーターでユーザーをリダイレクトする

  18. 18

    ログイン状態に応じてルーターでユーザーをリダイレクトする

  19. 19

    ログイン状態に応じてルーターでユーザーをリダイレクトする

  20. 20

    状態更新にコンポーネントを再描画するワンステップの背後にある:フックを反応させます

  21. 21

    開始時に非同期ストレージからネイティブロード状態に反応する

  22. 22

    NodeJとMongooseを使用してボットフレームワークの状態管理にMongoDBをローカルでdirectline-jsを使用する方法は?

  23. 23

    データフレーム-対応するインデックスに値を割り当てます

  24. 24

    同期ブロックの外部で定義されたフィールドにオブジェクトを割り当てる-スレッドセーフですか?

  25. 25

    React:reduxストアと状態をローカルファイルに保存する可能性はありますか?

  26. 26

    React Typescript:ルーターコンポーネントに反応する場所の状態を追加します

  27. 27

    ナビゲーションルートの状態に反応して、キーとインデックスを作成します

  28. 28

    LongClickListenerがImageViewに割り当てられた状態でRecyclerViewをスクロールします

  29. 29

    反応クラスを反応フックに変換する方法(firebaseストレージ)

ホットタグ

アーカイブ