Как бороться, когда пользователь обновил страницу обновления приложения vuejs / vuex? - PullRequest
1 голос
/ 25 июня 2019

в моем laravel 5.8 / vuejs 2.5 / "vuex 3.1 пользователь входит в систему, и некоторые данные хранятся в хранилище пользователя, например, в auth / Login.vue:

<script>

    export default {
        ...
        mounted() {
            this.setAppTitle("", 'Login', bus);
        }, // mounted() {

        computed: {
            authError() {
                return this.$store.getters.authError;
            }
        }, // computed: {

        methods: {
            authenticate() {
                this.$store.dispatch('login');    // calling action
                login(this.$data.form)
                    .then((res) => {
                        this.$store.commit("loginSuccess", res);  // calling mutation
                        this.$store.dispatch('retrieveUserLists', res.user.id );
                        this.$router.push({path: '/websites-blogs'}); // For debugging!
                    })
                    .catch((error) => {
                        this.$store.commit("loginFailed", {error});   // calling mutation
                    });
            }
        },  // methods: {

и хранят там, где находится учетная запись пользователяи его данные хранятся в ресурсах / js / store.js:

export default {
    state : {
        currentLoggedUser: user,

        // personal data only for logged user
        userLists: [],
    },

    getters : {
        ...
        userLists(state) {
            return state.userLists;
        },

Работает нормально, пока пользователь не обновит страницу входа в систему (F5 или CTRL + R) и пользователь не войдет в мою страницу, но некоторые данныескажем, (списки пользователей) пусты, а некоторые списки пусты.

У меня есть MainApp.vue:

<template>
    <body class="account-body">
    <v-dialog/>

    <MainHeader></MainHeader>
    <div class="content p-0 m-0" style="width: 100% !important; margin: auto !important;">
        <notifications group="wiznext_notification"/>
        <router-view></router-view>
    </div>
    </body>

</template>

<script>

    ...
    export default {
        name: 'main-app',
        components: {MainHeader},

        mixins: [appMixin],

        created() {
        },
        mounted() {
            ...
        },

        methods: {
            ...
        }, // methods: {



    }



</script>

и resources / views / index.blade.php:

<?php $current_dashboard_template = 'Horizontal' ?>

<!doctype html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <title id="app_title">{{ config('app.name', 'Laravel') }}</title>

    <link href="{{ asset(('css/Horizontal/bootstrap.min.css')) }}" rel="stylesheet" type="text/css">
    <link href="{{ asset(('css/Horizontal/icons.css')) }}" rel="stylesheet" type="text/css">
    <link href="{{ asset(('css/Horizontal/style.css')) }}" rel="stylesheet" type="text/css">
    ...
    {{--<link href="css/Horizontal/ion.rangeSlider.css" rel="stylesheet" type="text/css"/>--}}
    {{--<link href="css/Horizontal/ion.rangeSlider.skinModern.css" rel="stylesheet" type="text/css"/>--}}
    {{--<link href="css/Horizontal/powerange.css" rel="stylesheet" type="text/css"/>--}}

    <link href="{{ asset(('css/'.$current_dashboard_template.'/app.css')) }}" rel="stylesheet" type="text/css">


    ...

</head>


<body>

<div class="wrapper" id="app">

    <main>
        <div id="main_content">
            <mainapp></mainapp>
        </div>
    </main>

</div>

</body>


@include('footer')
<script src="{{ asset('js/jquery.min.js') }}"></script>
<script src="{{ asset('js/bootstrap.bundle.min.js') }}"></script>

<script src="{{ asset('js/metisMenu.min.js') }}"></script>
<script src="{{ asset('js/waves.min.js') }}"></script>
<script src="{{ asset('js/jquery.slimscroll.min.js') }}"></script>



<script src="{{ asset('js/app.js') }}{{  "?dt=".time()  }}"></script>
{{--<script type="text/javascript" src="{{ asset('js/vuecsv.min.js') }}"></script>--}}

</html>

Не могли бы вы посоветовать правильный способ таких ситуаций? Что я могу сделать?

ИЗМЕНЕНО:

Я попытался переделать свое хранилище и, похоже, этоработает нормально:

const user = getLocalUser();

export default {
    state : {
        currentLoggedUser: user,
        isLoggedIn: !!user,
        loading: false,
        auth_error: null,

        api_url: '/api',

        // personal data only for logged user
        userLists: [], // I need to save data on page refresh
    },

    getters : {
        ...
        userLists(state) {

            // that works ok after user logged into the system  and userLists is read on all page without refresh
            if ( state.userLists.length > 0 ) {
                return state.userLists;
            }

            // if userLists is empty check data in localStorage which were saved in refreshUserLists mutation
            let localStorageUserLists = JSON.parse(localStorage.getItem("userLists"));

            if ( localStorageUserLists.length > 0 ) {
                console.log("localStorageUserLists RETURNED::")
                return localStorageUserLists;
            }
            return [];
        },


    },

    mutations : {
        // that works ok after user logged into the system  and his personal data(in my case 5 rows) are read from db into the vuex store
        refreshUserLists(state, payload) {
            state.userLists = payload;
            localStorage.setItem("userLists", JSON.stringify(payload) );
        },


    },

На что еще мне обратить внимание?

Ответы [ 3 ]

2 голосов
/ 25 июня 2019

Так что дело в том, что Vuex контролирует состояние ваших данных по всему вашему приложению и компонентам, но как только пользователь нажмет F5 или любую другую опцию обновления, Vuex будет сброшен, вы ничего не можете с этим поделать, просто такработает.

Один из способов решения проблемы, о котором я могу подумать сейчас, - это сохранить данные на Vuex и, возможно, на локальном хранилище, а затем, на жизненном цикле vuex create, вы можете просто заполнить данные данными локального хранилища, если оно пустое.

1 голос
/ 26 июня 2019

Я не согласен с предлагаемыми решениями.Обновление браузера обычно указывает, что пользователь хочет получить самые свежие данные с сервера и сбросить состояние приложения с этими свежими данными.Поэтому вы не должны хранить состояние Vuex в localStorage или куки, чтобы обойти это.Если вы сделаете это, то теперь у вас будет состояние вашего приложения в двух местах, а также пользователь думает, что у него самые свежие данные, когда они этого не делают.

Лучший способ обработать событие обновления браузера в SPAэто загрузить ваше состояние с нуля.Когда ваше приложение загружается после обновления, оно должно заметить, что пользователь не вошел в систему (так как это состояние по умолчанию), и должно войти в него путем согласования с сервером за кулисами, например, путем отправки cookie сеанса и полученияподтверждение (или перенаправление на страницу входа, если сеанс истек).Также следует повторно извлечь все соответствующие данные с сервера и снова сохранить их в Vuex.

0 голосов
/ 25 июня 2019

вы можете использовать как localStorage, так и cookies. Из-за проблем, которые у меня возникли с LocalStorage, я рекомендую файлы cookie. Vue имеет богатый плагин под названием Vue-cookies .

Вы можете установить и получить данные с помощью этих команд:

var user = { id:1, name:'Journal',session:'25j_7Sl6xDq2Kc3ym0fmrSSk2xV2XkUkX' }; this.$cookies.set('user',user); // print user name console.log(this.$cookies.get('user').name)

подробнее: Github

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...