Nested <router-view>- does it work WITH ASYNC COMPONENTS?????
by Admiral Potato
HTML
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
<div id="app">
<nav>
<router-link to="/">/(root)</router-link>
<router-link to="/party">/party</router-link>
<router-link to="/Gruff">Gruff Home</router-link>
<router-link to="/Gruff/profile">Gruff Profile</router-link>
<router-link to="/Gruff/posts">Gruff Posts</router-link>
<router-link to="/Faun">Faun Home</router-link>
<router-link to="/Faun/profile">Faun Profile</router-link>
<router-link to="/Faun/posts">Faun Posts</router-link>
</nav>
<router-view></router-view>
</div>
CSS
nav a {
display: block;
background-color: #eee;
padding: 4px;
margin: 2px;
}
.goats {
background-color: #efe;
padding: 8px;
margin: 2px;
}
.user {
background-color: #fef;
padding: 8px;
margin: 2px;
}
Babel + JSX
const makeDataPromise = (name, data, delay) => {
return new Promise((resolve) => {
console.log('creating promise for component named ' + name)
setTimeout(
() => {
console.log(name + ' has loaded')
resolve(data)
},
delay
)
})
}
const makeAsyncLoaderComponent = (name, data) => () => {
console.log('trying to resolve loader component named ' + name)
const factory = () => ({
component: makeDataPromise(name, data, 1000),
loading: {
created () {
console.log('created function on loader for ' + name)
},
template: `
<div>
<h1>LOADING ${name}</h1>
<div>
<img src="https://i.stack.imgur.com/MEBIB.gif" />
</div>
</div>
`
},
delay: 10
})
return Promise.resolve({
functional: true,
render(h, {data, children}) {
// Transparently pass any props or children
// to the view component.
return h(factory, data, children);
}
})
}
const Goats = {
template: `
<div class="goats">
<h2>ASYNC COMPONENT TIME!</h2>
<router-view></router-view>
</div>
`
}
const GoatsList = { template: `
<div>
<div>There are goats in the house</div>
<nav>
<router-link to="/Gruff">Gruff</router-link>
<router-link to="/Faun">Faun</router-link>
</nav>
</div>` }
const GoatsParty = { template: '<div>GOAT PARTY IN THE HOUSE</div>' }
const User = {
computed: {
id () {
return this.$route.params.id
},
},
template: `
<div class="user">
<h2>User {{ id }}</h2>
<nav>
<router-link :to="'/' + id">Home</router-link>
<router-link :to="'/' + id + '/profile'">Profile</router-link>
<router-link :to="'/' + id + '/posts'">Posts</router-link>
</nav>
<router-view></router-view>
</div>
`
}
const UserHome = { template: '<div>Home</div>' }
const UserProfile = { template: '<div>Profile</div>' }
const UserPosts = { template: '<div>Posts</div>' }
const UserHomeLoader = makeAsyncLoaderComponent(
'UserHome',
UserHome
)
const UserProfileLoader = ...