পৃষ্ঠায় রিফ্রেশে ভয়েস অবস্থা state


106

আমার অ্যাপ্লিকেশন ব্যবহারকারীর প্রমাণীকরণের জন্য ফায়ারবেস এপিআই ব্যবহার করে, একটি ভুয়েস রাজ্যে বুলিয়ান মান হিসাবে লগইন স্থিতি সংরক্ষণ করে।

যখন আমি লগ ইন করি যখন আমি লগইন স্থিতি সেট করি এবং শর্ত অনুসারে লগইন / লগআউট বোতামটি প্রদর্শন করি।

পৃষ্ঠাটি রিফ্রেশ হয়ে গেলে, ভ্যু অ্যাপ্লিকেশনটির অবস্থা হারিয়ে যায় এবং ডিফল্টে পুনরায় সেট হয়

এমনকি কোনো ব্যবহারকারী লগ ইন থাকলেও যেমন একটি সমস্যা ঘটায় এবং পৃষ্ঠার রিফ্রেশ হয় লগইন অবস্থা ফিরে সেট করা হয় মিথ্যা এবং লগইন বাটন যদিও ব্যবহারকারী থাকার বিষয়টি মতেই লগ ইন লগ আউট বোতাম পরিবর্তে প্রদর্শিত হয় ....

এই আচরণটি রোধ করতে আমি কী করব

আমি কি কুকি ব্যবহার করব বা অন্য কোনও ভাল সমাধান পাওয়া যাবে ...

    -

4
আমি এটি পরিচালনা করতে কোনও ধরণের লোকাল স্টোরেজ ব্যবহার করি। এটি কুকিজ বা অন্য কিছু হতে পারে
হামারবট

@ এল_ম্যাটেলা কুকিজ বাদে স্থানীয়ভাবে ডেটা সঞ্চয় করার জন্য আপনি কী কী পদ্ধতি ব্যবহার করেন
Boomboxboy

4
সাধারণভাবে, আমি একটি স্থানীয় স্টোরেজ এনপিএম প্যাকেজ ব্যবহার করি যা আমার জন্য ডেটা সঞ্চয় করার জন্য সেরা পদ্ধতিটি বেছে নিতে পারে: npmjs.com/package/local-stores "সমস্ত কিছু লোকালস্টোরের সাথে যোগাযোগের জন্য এপিআই হ'ল একটি সরল উপায় Note নোট করুন যে লোকালস্টোরেশন যখন হয় বর্তমান ব্রাউজারে অসমর্থিত, একটি ইন-মেমরি স্টোরের একটি ফ্যালব্যাক স্বচ্ছভাবে ব্যবহৃত হয়। "
হামারবট

@ এল_ম্যাটেলা আপনাকে অনেক ধন্যবাদ ... আমি একবার দেখে
নেব

উত্তর:


110

এটি একটি পরিচিত ব্যবহারের কেস। বিভিন্ন সমাধান আছে।

উদাহরণস্বরূপ, এক ব্যবহার করতে পারেন vuex-persistedstatevuexপৃষ্ঠার রিফ্রেশের মধ্যে স্থিতি পরিচালনা করতে ও সংরক্ষণ করার জন্য এটি একটি প্লাগইন ।

কোডের উদাহরণ:

import { Store } from 'vuex'
import createPersistedState from 'vuex-persistedstate'
import * as Cookies from 'js-cookie'

const store = new Store({
  // ...
  plugins: [
    createPersistedState({
      getState: (key) => Cookies.getJSON(key),
      setState: (key, state) => Cookies.set(key, state, { expires: 3, secure: true })
    })
  ]
})

আমরা এখানে যা করি তা সহজ:

  1. আপনি ইনস্টল করা প্রয়োজন js-cookie
  2. চালু থেকে getStateআমরা সংরক্ষণ করা অবস্থা লোড করার চেষ্টা করিCookies
  3. উপর setStateআমরা আমাদের রাষ্ট্র সংরক্ষণCookies

দস্তাবেজ এবং ইনস্টলেশন নির্দেশাবলী: https://www.npmjs.com/package/vuex-persistsstate


আপনাকে ধন্যবাদ ... প্লাগইনের
গিথুব

8
ডেটা সেট / পাওয়ার জন্য আপনার কি নির্দিষ্ট কিছু করা দরকার? পুনরায় লোড করার সময় আমার ডেটা ডিফল্টে পুনরায় সেট করা হয়। কেবল এটির মাধ্যমে সেট করা হচ্ছে $ store.state.user, চেষ্টা করা বস্তু এবং সহজ স্ট্রিং - কোনও ভাগ্য নেই।
ডগকফি

6
কুকিগুলি ক্লায়েন্ট এবং সার্ভারের মধ্যে সংক্রমণিত হওয়ার কারণে আমি সম্ভবত তার পরিবর্তে স্থানীয় স্টোরেজটি দেখব ...
জেমস ওয়েস্টগেট

আমি কীভাবে রাজ্যকে বাঁচাতে পারি? কুকিজ মাপসই এবং যেমন বড় হয় LocalStorage হবে সাফারি ব্যক্তিগত মোড কাজ না
কর্মীদের জ্বালাতনের শিকার

@ আমিও একই সমস্যার মুখোমুখি হয়েছি, এর কোন সমাধান খুঁজে পেয়েছি?
আদিল

54

আপনার ভিউএক্স স্থিতি তৈরি করার সময়, এটি ভিয়েক্স-স্টেস্টেস্টেট প্লাগইন ব্যবহার করে সেশন স্টোরেজে সংরক্ষণ করুন এইভাবে, ব্রাউজারটি বন্ধ হয়ে গেলে তথ্য হারিয়ে যাবে। কুকিগুলির ব্যবহার এড়িয়ে চলুন কারণ এই মানগুলি ক্লায়েন্ট এবং সার্ভারের মধ্যে ভ্রমণ করবে।

import Vue from 'vue'
import Vuex from 'vuex'
import createPersistedState from 'vuex-persistedstate'

Vue.use(Vuex);

export default new Vuex.Store({
    plugins: [createPersistedState({
        storage: window.sessionStorage,
    })],
    state: {
        //....
    }
});

sessionStorage.clear();ব্যবহারকারী ম্যানুয়ালি লগ আউট করার সময় ব্যবহার করুন ।


13
আমি অবাক হয়েছি যে কুকিজের সমাধান এতগুলি তারা পেয়েছে। ব্রাউজার উইন্ডোটি বন্ধ হয়ে গেলে স্বয়ংক্রিয়ভাবে সমস্ত রাজ্য সাফ হওয়ায় এই সমাধানটি আরও ভাল বলে আমি মনে করি। আমি আমার রাষ্ট্রের ডেটা সার্ভারে কুকি হিসাবে প্রেরণ করতে পছন্দ করি না এবং ব্রাউজার উইন্ডোটি বন্ধ হয়ে গেলে আমি সংবেদনশীল ডেটাও বজায় রাখতে চাই না।
মার্ক হ্যাজার্স

আপনি কুকি সহ আপনার হেডারগুলির সাথে মোট 8k এর মধ্যেও সীমাবদ্ধ।
জেমস ওয়েস্টগেট

4
@ মার্কহাগার্স এবং এটি স্থানীয়ভাবে IE8 এর পরে সমর্থিত! অতিরিক্ত কোড লোড করার প্রয়োজন নেই।
ফ্যাবিয়ান ভন এলার্টস

4
আমি একটি ত্রুটি পেয়ে যাচ্ছিলাম vuex-persistedstate.es.js?0e44:1 Uncaught (in promise) TypeError: Converting circular structure to JSON
আকিন হুয়ান

4
@ অ্যাকিন - ত্রুটিটি বোঝায় যে আপনার রাজ্যে একটি বিজ্ঞপ্তি রেফারেন্স রয়েছে, একটি বস্তু অন্য অবজেক্টকে রেফার করে যা শেষ পর্যন্ত প্রথম অবজেক্টে ফিরে আসে।
জেমস ওয়েস্টগেট

11

ভিউেক্স রাজ্য স্মৃতিতে রাখা হয়। পৃষ্ঠার বোঝা এই বর্তমান অবস্থাকে মুছে ফেলবে। এই কারণেই রাজ্য পুনরায় লোড করতে জোর করে না।

তবে vuex-persistedstateপ্লাগইন এই সমস্যাটি সমাধান করে

npm install --save vuex-persistedstate

এখন এটি স্টোরে আমদানি করুন।

import Vue from 'vue'
import Vuex from 'vuex'
import account from './modules/account'
import createPersistedState from "vuex-persistedstate";

Vue.use(Vuex);

const store = new Vuex.Store({
  modules: {
    account,
  },
  plugins: [createPersistedState()]
});

এটি কোডের একক লাইনের সাথে নিখুঁতভাবে কাজ করেছে: plugins: [createPersistedState()]


10

আমি মনে করি লগইন স্থিতি সংরক্ষণ করতে কুকিজ / স্থানীয় স্টোরেজ ব্যবহার করা কিছু পরিস্থিতিতে কিছু ত্রুটির কারণ হতে পারে।
ফায়ারবেস ইতিমধ্যে আমাদের জন্য স্থানীয় স্টোরেজে লগইন তথ্য রেকর্ড করে এক্সপায়ারটাইম এবং রিফ্রেশ টোকেন।
অতএব আমি লগইন স্থিতি পরীক্ষা করতে ভিউ তৈরি হুক এবং ফায়ারবেস এপিআই ব্যবহার করব।
যদি টোকেনের মেয়াদ শেষ হয়ে যায়, এপিআই আমাদের জন্য টোকেন রিফ্রেশ করবে।
সুতরাং আমরা নিশ্চিত করতে পারি যে আমাদের অ্যাপটিতে লগইন স্থিতির প্রদর্শন ফায়ারবেসের সমান।

new Vue({
    el: '#app',
    created() {
        firebase.auth().onAuthStateChanged((user) => {
            if (user) {
                log('User is logined');
                // update data or vuex state
            } else {
                log('User is not logged in.');
            }
        });
    },
});

এই পরিস্থিতির বিরুদ্ধে সর্বোত্তম, অফিসিয়াল এবং প্রস্তাবিত পন্থা
অ্যালিজুনিয়র

8

রাষ্ট্রের উপর রাখুন:

producer: JSON.parse(localStorage.getItem('producer') || "{}")

রূপান্তর করা:

localStorage.setItem("producer",JSON.stringify(state.producer)) // OR
localStorage.removeItem("producers");

আমার জন্য ভাল কাজ করে!


1

আমি যখনই ব্যবহারকারীর ডেটা পুনরায় লোড করি তখনও আমার শিরোনামগুলি পুনরায় সেট করে আমি এটিকে সমাধান করেছি, আমি কী জানি এর চেয়ে ভাল ...

new Vue({
    el: 'vue',
    render: h => h(VueBox),
    router,
    store,

    computed: {
        tokenJWT () {
            return this.$store.getters.tokenCheck
        },
    },


    created() {
        this.setAuth()

    },

    methods:
        Object.assign({}, mapActions(['setUser']), {

            setAuth(){
                if (this.tokenJWT) {
                    if (this.tokenJWT === 'expired') {
                        this.$store.dispatch('destroyAuth')
                        this.$store.dispatch('openModal')
                        this.$store.dispatch('setElModal', 'form-login')

                    } else {
                        window.axios.defaults.headers.common = {
                            'Accept': 'application/json',
                            'Authorization': 'Bearer ' + this.tokenJWT
                        }
                        axios.get( api.domain + api.authApi )
                            .then(res => {
                                if (res.status == 200) {
                                    this.setUser( res.data.user )
                                }
                            })
                            .catch( errors => {
                                console.log(errors)
                                this.destroyAuth()
                            })
                    }
                }
            }
        })

})
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.