Redirecionar na inicialização pelo URL do navegador fornecido

9

Criei um novo aplicativo Vue com um caminho base. Devido ao fato de o aplicativo estar incorporado a outro aplicativo Vue, esse aplicativo não renderiza a router-viewinicialização. Se você quiser saber mais sobre como ou por que esse aplicativo está incorporado a outro aplicativo, dê uma olhada aqui:

montar aplicativos Vue no contêiner do aplicativo principal Vue

e minha própria resposta para esse problema:

https://stackoverflow.com/a/58265830/9945420

Ao iniciar meu aplicativo, ele processa tudo, exceto o router-view. Quero redirecionar na inicialização pelo URL do navegador fornecido. Esta é a minha configuração de roteador :

import Vue from 'vue';
import Router from 'vue-router';

import One from './views/One.vue';
import Two from './views/Two.vue';

Vue.use(Router);

const router = new Router({
    base: '/my-embedded-app/',
    mode: 'history',
    routes: [
        {
            path: '/',
            component: One,
        },
        {
            path: '/two',
            component: Two,
        },
    ],
});

router.replace(router.currentRoute.fullPath);

export default router;

Quero que o aplicativo renderize o componente Dois ao chamar .../my-embedded-app/two. Infelizmente, router.replacesempre redireciona para /(portanto, o URL do navegador é .../my-embedded-app/). Eu depurei o routere vi que o caminho é /, mas eu esperava que fosse /two.

Nota importante: não quero redirecionar o usuário para /twosempre que o URL estiver /. Eu só quero renderizar a exibição Twoquando o URL estiver /two. Atualmente não.

O que pode estar errado? Talvez eu nem precise desse redirecionamento e consiga resolver o problema de uma maneira mais elegante.

hrp8sfH4xQ4
fonte
Quer dizer, você deseja renderizar o componente Um ao escrever - / meu aplicativo incorporado / um como URL e o componente dois para - / meu aplicativo incorporado / dois? Se sim, você tentou - {caminho: 'dois', componente: Dois,} Removendo '/' de '/ dois'
urvashi
Sim, exatamente. Eu tentei sua abordagem, mas recebo um aviso de que essa rota precisa usar uma barra principal. Ao executar o aplicativo, esta rota não funcionou ..
hrp8sfH4xQ4
você pode alterar a ordem do seu percurso?
VariableVasasMT

Respostas:

1

Esse é o comportamento normal, é o modo como o aplicativo de página única funciona. O sinal de "libra" - como # - significa que os links não moverão o aplicativo para outra página.

para que você possa alterar o modo do roteador para

mode:"hash"
Muhammad Elbadawy
fonte
0

atualizado: jsfiddle

O que aconteceu foi que route.currentRoute.fullPathfoi executado antes do roteador estar pronto.

VariableVasasMT
fonte
Isso não mudou nada. router.currentRoute.fullPathainda retorna em /vez de /twoao chamarlocalhost:3000/apps/my-embedded-app/two
hrp8sfH4xQ4 11/11/19
Tenterouter.onReady(() => { router.replace(router.currentRoute.fullPath); });
VariableVasasMT
desculpe que não funcionou. Quando eu uso o evento onReady, recebo esse erromessage: "Navigating to current location ("/subApps/app-one") is not allowed"
hrp8sfH4xQ4 11/11/19
@ hrp8sfH4xQ4 Eu sugiro que você faça um jsfiddle e explique exatamente o que você precisa e pode haver pessoas que possam mudar isso para você, não podemos reproduzir exatamente o problema.
VariableVasasMT
desculpe, eu não posso reproduzir isso com um violino. Um servidor de arquivos é necessário para o contêiner IFrame. Mas este é um repositório para fins de teste github.com/byteCrunsher/router-startup
hrp8sfH4xQ4
0

Tente beforeEnter. Dê uma olhada no código abaixo:

const router = new Router({
  base: "/my-embedded-app/",
  mode: "history",
  routes: [
    {
      path: "/",
      component: One,
      beforeEnter: (to, from, next) => {
        // Your are free to add whatever logic here.
        // On first visit
        next("/two");
      }
    },
    {
      path: "/two",
      component: Two
    }
  ]
});

Leia mais sobre os protetores de navegação aqui

Rajeev Radhakrishnan
fonte
desculpe, o mesmo para a resposta de tony19. Não quero redirecionar o usuário. Quero renderizar a Twoexibição se o URL do navegador for .../two. No momento não
hrp8sfH4xQ4 14/10/19
0

Você poderia fornecer um repositório no github ou alguns para testar o real?

Caso contrário, minha primeira idéia é usar rotas filho com uma visão "vazia" como base, aqui um exemplo sobre o que eu tentei. (trabalhando no meu caso)

router.js

export default new Router({
    mode: 'history',
    base: '/my-embedded-app/',
    routes: [
      {
        path: '/',
        name: 'base',
        component: Base,
        children: [
          {
            path: '',
            name: 'one',
            component: One
          },
          {
            path: 'two',
            name: 'two',
            component: Two
          }
        ]
      }
    ]
})

Base.vue

<template>
    <router-view/>
</template>

One.vue

<template>
  <div>One</div>
</template>

Two.vue

<template>
  <div>Two</div>
</template>
victor-gabou
fonte
Este problema está relacionado com este aqui stackoverflow.com/questions/58397766/... e criei um pequeno repositório para fins de teste github.com/byteCrunsher/router-startup
hrp8sfH4xQ4