mirror of
https://github.com/nuxt/nuxt.git
synced 2024-11-26 07:32:01 +00:00
Layout on afterEach
This commit is contained in:
parent
7d630bf5d9
commit
9a2767ac90
6
TODO.md
6
TODO.md
@ -1,6 +1,8 @@
|
||||
Tasks for `0.9.10`:
|
||||
- [ ] `build.publicPath` #25
|
||||
- [x] `build.publicPath` #25
|
||||
- [ ] Use [name].[chunkhash].js for generated js (production) #218
|
||||
- [ ] Add expired headers (production)
|
||||
- [ ] Activate layout only on afterEach #214
|
||||
- [x] Activate layout only on afterEach #214
|
||||
- [ ] Custom layout in layouts/error.vue #172
|
||||
|
||||
-> Not possible to have custom layout for a page, it should do the condition inside the layout itself (because of the middleware strategy)
|
||||
|
@ -33,18 +33,19 @@ export default {
|
||||
if (!layout || !layouts['_' + layout]) layout = 'default'
|
||||
this.layoutName = layout
|
||||
let _layout = '_' + layout
|
||||
if (typeof layouts[_layout] === 'function') {
|
||||
return this.loadLayout(_layout)
|
||||
}
|
||||
this.layout = layouts[_layout]
|
||||
return Promise.resolve(this.layout)
|
||||
return this.layout
|
||||
},
|
||||
loadLayout (_layout) {
|
||||
loadLayout (layout) {
|
||||
if (!layout || !layouts['_' + layout]) layout = 'default'
|
||||
let _layout = '_' + layout
|
||||
if (typeof layouts[_layout] !== 'function') {
|
||||
return Promise.resolve(layouts[_layout])
|
||||
}
|
||||
return layouts[_layout]()
|
||||
.then((Component) => {
|
||||
layouts[_layout] = Component
|
||||
this.layout = layouts[_layout]
|
||||
return this.layout
|
||||
return layouts[_layout]
|
||||
})
|
||||
.catch((e) => {
|
||||
if (this.$nuxt) {
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
import Vue from 'vue'
|
||||
import middleware from './middleware'
|
||||
import { app, router<%= (store ? ', store' : '') %> } from './index'
|
||||
import { app, router<%= (store ? ', store' : '') %>, NuxtError } from './index'
|
||||
import { getMatchedComponents, getMatchedComponentsInstances, flatMapComponents, getContext, promiseSeries, promisify, getLocation, compile } from './utils'
|
||||
const noopData = () => { return {} }
|
||||
const noopFetch = () => {}
|
||||
@ -88,7 +88,7 @@ function render (to, from, next) {
|
||||
this._hadError = !!this.$options._nuxt.err
|
||||
if (!Components.length) {
|
||||
// Default layout
|
||||
this.setLayout()
|
||||
this.loadLayout(NuxtError.layout)
|
||||
.then(callMiddleware.bind(this, Components, context))
|
||||
.then(() => {
|
||||
this.error({ statusCode: 404, message: 'This page could not be found.' })
|
||||
@ -117,7 +117,7 @@ function render (to, from, next) {
|
||||
this.setTransitions(mapTransitions(Components, to, from))
|
||||
let nextCalled = false
|
||||
// Set layout
|
||||
this.setLayout(Components[0].options.layout)
|
||||
this.loadLayout(Components[0].options.layout)
|
||||
.then(callMiddleware.bind(this, Components, context))
|
||||
.then(() => {
|
||||
// Pass validation?
|
||||
@ -175,9 +175,12 @@ function render (to, from, next) {
|
||||
.catch((error) => {
|
||||
_lastPaths = []
|
||||
error.statusCode = error.statusCode || error.status || (error.response && error.response.status) || 500
|
||||
this.loadLayout(NuxtError.layout)
|
||||
.then(() => {
|
||||
this.error(error)
|
||||
next(false)
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
// Fix components format in matched, it's due to code-splitting of vue-router
|
||||
@ -213,6 +216,8 @@ function fixPrepatch (to, ___) {
|
||||
if (this._hadError && this._dateLastError === this.$options._nuxt.dateErr) {
|
||||
this.error()
|
||||
}
|
||||
// Set layout
|
||||
this.setLayout(this.$options._nuxt.err ? NuxtError.layout : to.matched[0].components.default.options.layout)
|
||||
// hot reloading
|
||||
hotReloadAPI(this)
|
||||
})
|
||||
@ -234,8 +239,9 @@ function hotReloadAPI (_app) {
|
||||
let promises = []
|
||||
// If layout changed
|
||||
if (_app.layoutName !== Component.options.layout) {
|
||||
let promise = _app.setLayout(Component.options.layout)
|
||||
let promise = _app.loadLayout(Component.options.layout)
|
||||
promise.then(() => {
|
||||
_app.setLayout(Component.options.layout)
|
||||
hotReloadAPI(_app)
|
||||
})
|
||||
promises.push(promise)
|
||||
@ -338,8 +344,10 @@ Promise.all(resolveComponents)
|
||||
.then((Components) => {
|
||||
const _app = new Vue(app)
|
||||
|
||||
return _app.setLayout(Components.length ? Components[0].options.layout : '')
|
||||
let layout = Components.length ? Components[0].options.layout : NuxtError.layout
|
||||
return _app.loadLayout(layout)
|
||||
.then(() => {
|
||||
_app.setLayout(layout)
|
||||
return { _app, Components }
|
||||
})
|
||||
})
|
||||
|
@ -6,7 +6,7 @@
|
||||
<script>
|
||||
import Vue from 'vue'
|
||||
import NuxtChild from './nuxt-child'
|
||||
import NuxtError from '<%= components.ErrorPage %>'
|
||||
import NuxtError from '<%= components.ErrorPage ? components.ErrorPage : "./nuxt-error.vue" %>'
|
||||
|
||||
export default {
|
||||
name: 'nuxt',
|
||||
|
@ -6,6 +6,7 @@ import router from './router.js'
|
||||
<% if (store) { %>import store from './store.js'<% } %>
|
||||
import NuxtChild from './components/nuxt-child.js'
|
||||
import NuxtLink from './components/nuxt-link.js'
|
||||
import NuxtError from '<%= components.ErrorPage ? components.ErrorPage : "./components/nuxt-error.vue" %>'
|
||||
import Nuxt from './components/nuxt.vue'
|
||||
import App from '<%= appPath %>'
|
||||
|
||||
@ -85,4 +86,4 @@ const app = {
|
||||
...App
|
||||
}
|
||||
|
||||
export { app, router<%= (store ? ', store' : '') %> }
|
||||
export { app, router<%= (store ? ', store' : '') %>, NuxtError }
|
||||
|
@ -6,7 +6,7 @@ import Vue from 'vue'
|
||||
import { stringify } from 'querystring'
|
||||
import { omit } from 'lodash'
|
||||
import middleware from './middleware'
|
||||
import { app, router<%= (store ? ', store' : '') %> } from './index'
|
||||
import { app, router<%= (store ? ', store' : '') %>, NuxtError } from './index'
|
||||
import { getMatchedComponents, getContext, promiseSeries, promisify, urlJoin } from './utils'
|
||||
|
||||
const isDev = <%= isDev %>
|
||||
@ -72,7 +72,7 @@ export default context => {
|
||||
return Component
|
||||
})
|
||||
// Set layout
|
||||
return _app.setLayout(Components.length ? Components[0].options.layout : '')
|
||||
return _app.setLayout(Components.length ? Components[0].options.layout : NuxtError.layout)
|
||||
})
|
||||
.then((layout) => {
|
||||
// Call middleware
|
||||
|
@ -206,7 +206,7 @@ function * generateRoutesAndFiles () {
|
||||
loading: (typeof this.options.loading === 'string' ? r(this.srcDir, this.options.loading) : this.options.loading),
|
||||
transition: this.options.transition,
|
||||
components: {
|
||||
ErrorPage: './nuxt-error.vue'
|
||||
ErrorPage: null
|
||||
}
|
||||
}
|
||||
// Format routes for the lib/app/router.js template
|
||||
|
Loading…
Reference in New Issue
Block a user