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 = ...