]> git.ipfire.org Git - thirdparty/vuejs/router.git/commitdiff
docs: add named views playground
authorEduardo San Martin Morote <posva13@gmail.com>
Mon, 20 Apr 2020 21:32:24 +0000 (23:32 +0200)
committerEduardo San Martin Morote <posva13@gmail.com>
Mon, 20 Apr 2020 21:32:24 +0000 (23:32 +0200)
playground/App.vue
playground/router.ts
playground/views/Home.vue

index bd763a02205802a6d5556034b97536be5c271537..ce9a76265588df3b9b500de56eba3358c7aea77d 100644 (file)
         <router-link to="/p_1/absolute-a">/p_1/absolute-a</router-link>
       </li>
     </ul>
-    <!-- <transition
-      name="fade"
-      mode="out-in"
-      @before-enter="flushWaiter"
-      @before-leave="setupWaiter"
-    > -->
+    <button @click="toggleViewName">Toggle view</button>
     <Suspense>
       <template #default>
-        <router-view></router-view>
+        <router-view :name="viewName" v-slot="{ Component, props }">
+          <!-- <transition
+            name="fade"
+            mode="out-in"
+            @before-enter="flushWaiter"
+            @before-leave="setupWaiter"
+          > -->
+          <component :is="Component" v-bind="props" />
+          <!-- </transition> -->
+        </router-view>
       </template>
       <template #fallback>
         Loading...
       </template>
     </Suspense>
-    <!-- </transition> -->
   </div>
 </template>
 
 <script>
-import { defineComponent, inject, computed } from 'vue'
+import { defineComponent, inject, computed, ref } from 'vue'
 import { scrollWaiter } from './scrollWaiter'
 import { useRoute } from '../src'
 
@@ -156,6 +159,7 @@ export default defineComponent({
   setup() {
     const route = useRoute()
     const state = inject('state')
+    const viewName = ref('default')
 
     const currentLocation = computed(() => {
       const { matched, ...rest } = route
@@ -179,6 +183,10 @@ export default defineComponent({
       state,
       flushWaiter,
       setupWaiter,
+      viewName,
+      toggleViewName() {
+        viewName.value = viewName.value === 'default' ? 'other' : 'default'
+      },
     }
   },
 })
index ba8bfaec481a2f93ea8b680a5ad8a2946b6c89f8..65d7ba79a4722ed3315de7522cb865f8e936082f 100644 (file)
@@ -5,7 +5,10 @@ import NestedWithId from './views/NestedWithId.vue'
 import Dynamic from './views/Dynamic.vue'
 import User from './views/User.vue'
 import NotFound from './views/NotFound.vue'
-import component from './views/Generic.vue'
+const component = () => {
+  console.log('fetching component')
+  return import('./views/Generic.vue')
+}
 import LongView from './views/LongView.vue'
 import GuardedWithLeave from './views/GuardedWithLeave.vue'
 import ComponentWithData from './views/ComponentWithData.vue'
@@ -13,14 +16,16 @@ import { globalState } from './store'
 import { scrollWaiter } from './scrollWaiter'
 let removeRoute: (() => void) | undefined
 
-// const hist = new HTML5History()
-// const hist = new HashHistory()
 export const routerHistory = createWebHistory()
 export const router = createRouter({
   history: routerHistory,
   routes: [
     { path: '/home', redirect: '/' },
-    { path: '/', component: Home },
+    {
+      path: '/',
+      components: { default: Home, other: component },
+      props: to => ({ waited: to.meta.waitedFor }),
+    },
     {
       path: '/always-redirect',
       redirect: () => ({
@@ -38,7 +43,7 @@ export const router = createRouter({
       path: '/lazy',
       component: async () => {
         await delay(500)
-        return component
+        return component()
       },
     },
     {
@@ -152,6 +157,7 @@ router.beforeEach(async (to, from, next) => {
   const time = Number(to.query.delay)
   if (time > 0) {
     console.log('⏳ waiting ' + time + 'ms')
+    to.meta.waitedFor = time
     await delay(time)
   }
   next()
index e32da0a4d97b7a236477009c99e84011a1575e7f..79d9dc62d527cfa73c176da50ba09157668dde9d 100644 (file)
@@ -2,6 +2,7 @@
   <div>
     <div>Home</div>
     <p>My Data is: {{ someData }}</p>
+    <p v-if="waited != null">I waited for {{ waited }}</p>
     toggle: {{ log(toggle) }}
     <button @click="counter++">{{ counter }}</button>
   </div>
@@ -13,6 +14,7 @@ import { defineComponent, getCurrentInstance, inject, ref } from 'vue'
 
 export default defineComponent({
   name: 'Home',
+  props: ['waited'],
   data: () => ({
     toggle: false,
     counter: 0,