Как получить переменные запроса GET с помощью Vue (Router) перед загрузкой / отображением страницы - PullRequest
2 голосов
/ 12 марта 2019

При загрузке страницы входа в систему - я хочу проверить, были ли установлены переменные GET, и извлечь их в моем приложении Vue (так что тогда я могу изменить отображаемый режим).

Мой URL и переменные выглядят так:

https://localhost:3000/login?user=potato&token=666

мой код выглядит так:

let routes = [
    {
        path:       '/login',
        component:  Login
    },
    {
        path:       '/login/:user/:token',
        component:  Login,
        // props:   true
        props:      ['user', 'token']
    },
    ...
]; 

... ... ...

export default {
    props: [ 'user', 'token' ], 
    data() {
        return {
            // Change to yours for testing, empty these before production release
            user: '',
            pass: '',
            getData: null
        };
    },
    beforeRouteEnter (to, from, next) {
        getPost(to.params.id, (err, post) => {
            next(vm => vm.setGetData(err, post))
        })
    },
    // When route changes and this component is already rendered,
    // the logic will be slightly different.
    beforeRouteUpdate (to, from, next) {
        this.getData = null
        getPost(to.params.id, (err, post) => {
            this.setGetData(err, post)
            next()
        })
    },
    methods: {
        setGetData (err, post) {
            if (err) {
                this.error = err.toString()
            } else {
                this.getData = post
            }
        }
    }
}

Моя последняя попытка была связана с документацией Vues по извлечению данных: https://router.vuejs.org/guide/advanced/data-fetching.html#fetching-after-navigation

Но это не полностью объяснено (getPost is not defined). Я немного новичок в Vue / VueRouter (я работаю с vanilla js или php), мой вопрос может показаться простым, но серьезным, я не нашел ничего, что представляло бы полностью объясненный пример выборки получения данных.

В начале мне сказали, что это «пропуски», и я тоже не понял этого, следуя документу Vues: https://router.vuejs.org/guide/essentials/passing-props.html#boolean-mode

  • Как мне получить переменные GET, до того, как что-нибудь отобразится, поэтому у меня есть время, чтобы изменить переменную режима?

  • Правильно ли выглядит мой URL? https://localhost:3000/login?user=potato&token=666 или это должно выглядеть так? https://localhost:3000/login/potato/666?

При обработке этого вручную с помощью window.location.href, как предложено, ломается мой код:

    beforeRouteEnter(to, from, next) {
        console.log(window.location.href);
        if (this.getGetVariables(window.location.href)){
            console.log('has token: ' + this.token ); 
        }
        next()
    }, 

  methods: {
        // URL Variables: 
        getGetVariables: function(urlString) {
            var url = new URL(urlString);
            this.token = url.searchParams.get('token');
            console.log(this.token);
            if (!this.token) return false;
            this.user = url.searchParams.get('user');
            console.log(this.user);
        }

TypeError: Невозможно прочитать свойство 'getGetVariables' из неопределенного

Похоже, он не устанавливает переменные, пока не достигнет create() (я думаю). Итак, где я должен сохранить переменные URL?

Я попытался изменить имя beforeRouteEnter на beforeRouteUpdate, и в этой функции он больше не получает URL-адрес.

Ответы [ 2 ]

2 голосов
/ 12 марта 2019

Вы должны иметь возможность получить доступ к параметрам запроса с помощью this.$router.query.


$ route.query

тип: Объект

Объект, который содержит пары ключ / значение строки запроса. Например, для пути /foo?user=1 мы получаем $route.query.user == 1. Если запроса нет, значением будет пустой объект.

источник: https://router.vuejs.org/api/#route-object-properties


редактирование:

Пользователь и токен внутри пути не используют $router.query, это реквизиты, которые заполняются маршрутизатором и будут автоматически меняться при изменении URL.

https://router.vuejs.org/guide/essentials/passing-props.html

Вот пример, который я нашел, используя ?name=value: https://jsfiddle.net/posva/chyLjpv0/

Вот пример, который я нашел, используя /:name: https://jsfiddle.net/jonataswalker/ykf0uv0d/

1 голос
/ 12 марта 2019

Ваш подход с beforeRouteEnter правильный.Вы можете получить доступ к переменным get, используя vanilla JS, используя window.location.href .

Я не знаю ни одного vue-подобного метода получения параметров GET.

...