@adam_carraway

Как перерисовать компонент vue?

У меня есть компонент Header.vue в котором находится шапка сайта.
<div class="main_menu__auth l-ml-10 lm-ml-10" ref="map">
                    <div v-if="authdata == null" class="main_menu__auth__login l-fs-15 main_menu__auth__login--shown">
                        <i class="far fa-user-circle  l-fs-20 icon icon--signin"></i>
                        <span class="l-ml-10 lm-hidden">Войти</span>
                    </div>
                    <div v-else>
                        {{authdata.name}} |
                        <button @click="exit">Выход</button>
                    </div>
                </div>

В эту шапку(компонент) передается authdata (если массив authdata пуст значит пользователь не авторизован), а если не пуст то авторизован. Допустим я авторизовался и обновил страницу, в шапке мне покажется логин и кнопка выхода, если нажать на кнопку выход то отправится запрос на logout (пользователь станет не авторизованным) после этого запроса я обнуляю authdata . Вопрос в следующем как мне перерисовать (обновить) dom чтобы вместо логина и кнопки выхода появилась кнопка входа?
export default {
        data:function(){
            return{
            }
        },
        props:[
            'authdata'
        ],

        mounted(){
          this.update()
        },
        watch:{

        },
        methods:{
            update: function () {
                console.log(this.authdata)
            },
            exit:function () {

                $.ajax({
                    url: "/exit",
                    type: "GET",
                    data: "get=on",
                    success: function (response) {
                        console.log('Нажал на выход'+response);
                        this.authdata = null;
                        console.log(this.authdata);
                    }
                });
            }
        }
    }

только начал изучать vue.
  • Вопрос задан
  • 3545 просмотров
Решения вопроса 2
coderisimo
@coderisimo
вроде все правильно делаете, но :

exit:function () {
let t = this; // вам нужно передать внутрь правильный контекст
         $.ajax({
              url: "/exit",
              type: "GET",
              data: "get=on",
              success: function (response) {
                        console.log('Нажал на выход'+response);
                        t.authdata = null; //  внимание! this здесь уже не тот! :)
                        console.log( t.authdata);
                    }
                });
            }
Ответ написан
Комментировать
Для принудительного обновления компонента проще всего использовать токены. К примеру.
В data создадим поле refreshToken со значением 1.
Добавим метод refreshComponent, который производит инкремент переменной refreshToken.
И к нужному элементу добавим значение v-bind:refresh-token = "refreshToken".
Теперь, когда нужно перерисовать компонент, просто вызываем метод refreshComponent.
Но все же, лучше подход будет использовать хранилище состояния vuex, он реактивен. Просто создай логику с v-if / v-else и оно будет работать как нужно.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
bootd
@bootd
Гугли и ты откроешь врата знаний!
Входящие свойства нельзя обнулить из компонента. У вас должна быть ошибка в консоли, что так делать нельзя.

Для таких вещей используйте vuex, что бы вынести данные глобально.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы