NativeScript vue, vuex и urlhandler

Редактировать

Я использую https://github.com/hypery2k/nativescript-urlhandler, чтобы открыть глубокую ссылку в своем приложении, используя NativeScript vue и vuex. Кажется, что для того, чтобы получить методы, необходимые для маршрутизации [$navigateTo и т. д.], этот плагин необходимо настроить немного иначе, чем примеры, приведенные в документации.

import Vue from "nativescript-vue";
import Vuex from "vuex";
Vue.use(Vuex);

import { handleOpenURL } from 'nativescript-urlhandler';

new Vue({
    mounted() {
        handleOpenURL( (appURL) => {
            console.info(appURL)
            // Settings is the variable that equals the component - in this case settings.
            this.$navigateTo(Settings);
        });
    },
    render: h => h("frame", [h(Home)]),
    store: ccStore
}).$start();

handleOpenURL необходимо вызывать внутри Mounted — тогда вы можете проанализировать appURL и сослаться на страницу (компонент), к которой вы хотите перейти. Мне посоветовали не вызывать handleOpenURL из маршрутизатора, но я не уверен, почему, и он работает без ошибок, и у меня есть доступ к методам маршрутизации... поэтому, если кто-нибудь знает, плохая ли это идея, пожалуйста, сообщите я знаю :) Спасибо!

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

Это основано на решении https://github.com/Спакарар — его можно найти здесь: https://github.com/geodav-tech/vue-nativescript-router-пример. Это отличное решение, потому что вам не нужно включать каждый отдельный компонент в каждый компонент для использования в навигации — это дает почти vue-маршрутизатор.


Я использую https://github.com/hypery2k/nativescript-urlhandler, чтобы открыть ссылку на контент в своем приложении, однако у меня возникают проблемы с открытием ссылки.

В моем файле app.js у меня есть следующее:

import Vue from "nativescript-vue";
import Vuex from "vuex";
Vue.use(Vuex);
....
import { handleOpenURL } from 'nativescript-urlhandler';
import ccStore  from './store/store';


handleOpenURL(function(appURL) {
// I have hardwired 'Settings' in for testing purposes - but this would be the appURL
    ccStore.dispatch('openAppURL', 'Settings');
});

....

new Vue({
    render: h => h("frame", [h(Home)]),
    store: ccStore
}).$start();

Я храню состояние маршрута в vuex и использую различные методы, которые работают (нажатие на ссылку загружает компонент). Однако handleOpenURL существует вне vue... поэтому мне пришлось обращаться к vuex напрямую из метода handleOpenURL. Я создал действие специально для этого случая - openAppURL.. оно делает то же самое, что и другие мои методы (хотя я его консолидировал).

При нажатии на ссылку приложения я НЕ перехожу на страницу в приложении. Я поместил журнал консоли в openAppURL и вижу, что он вызывается, и возвращается правильный объект маршрута ... он просто не открывает страницу. SetTimeOut используется, потому что nextTick недоступен из vuex.

Я в недоумении, как заставить страницу появиться...

const ccStore = new Vuex.Store({
    state: {
        user: {
            authToken: null,
            refreshToken: null,
        },
        routes: [
            {
                name: "Home",
                component: Home
            },
            {
                name: "Log In",
                component: Login
            },
            ...
        ],
        currentRoute: {
            //INITIALIZE THIS WITH YOUR HOME PAGE
            name: "Home",
            component: Home //COMPONENT
        },
        history: [],
    },
    mutations: {
        navigateTo(state, newRoute, options) {
            state.history.push({
                route: newRoute,
                options
            });
       },
    },
    actions: {
        openAppURL({state, commit}, routeName ) {
            const URL =  state.routes[state.routes.map( (route) => {
                return route.name;
            }).indexOf(routeName)];

            return setTimeout(() => {
                commit('navigateTo', URL, { animated: false, clearHistory: true });
        }, 10000);
       },
       ....
     }
   etc....

Вы используете Vue Router? Надеюсь, вы знаете, что он не поддерживается. Я также не вижу никакого кода, связанного с ручной маршрутизацией выше, не могли бы вы объяснить, где именно вы запускаете код навигации.

Manoj 29.05.2019 21:52

Привет @Manoj - я делаю бит маршрута в миксине - но вы абсолютно правы, мне пришлось провести рефакторинг, чтобы получить метод $navigateTo ... Я обновлю вышеизложенное своим исправленным кодом ... Это кажется, что NativeScript vue нужно настроить иначе, чем в примерах в github.com/hypery2k/nativescript-urlhandler. Я был бы признателен, если бы вы могли высказать свое мнение об этом - опубликую сейчас :) Спасибо!

Rob 29.05.2019 22:36
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
2
642
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Мне посоветовали опубликовать мои выводы в качестве ответа и отметить его как правильный. Чтобы использовать nativescript-urlhandler с vue, вы должны инициализировать обработчик из смонтированного хука жизненного цикла vue. Пожалуйста, смотрите выше для более подробной информации.

import Vue from "nativescript-vue";
import Vuex from "vuex";
Vue.use(Vuex);

import Settings from "~/components/Settings";

import { handleOpenURL } from 'nativescript-urlhandler';

new Vue({
    mounted() {
        handleOpenURL( (appURL) => {
            console.info(appURL) // here you can get your appURL path etc and map it to a component... eg path === 'Settings. In this example I've just hardwired it in.
            this.$navigateTo(Settings);
        });
    },
    render: h => h("frame", [h(Home)]),
    store: ccStore
}).$start();

Другие вопросы по теме