【发布时间】:2018-10-07 08:22:38
【问题描述】:
我有一个非常奇怪的错误,页面加载组件mounted 和beforeMount 触发/运行两次?我的每个组件都代表一个页面,所以当我在mywebsite.com/contact 上加载页面时,Contact.vue 函数mounted 和beforeMount 会触发/运行两次,但如果我在mywebsite.com/foo 上加载页面,Contact.vue 函数@ 987654329@ 和 beforeMount 触发/运行一次(这是我认为? 应该发生的)。
知道为什么这些函数会执行两次吗?我有一些挑剔的设置,但它适用于动态模板。
router/index.js:
const router = new Router({
routes: [
{
path: (window.SETTINGS.ROOT || '') + '/:slug',
name: 'Page',
component: Page,
props: true
},
]
})
Page.vue:
<template>
<component v-if="wp" :is="templateComponent" v-bind:wp="wp"></component>
<p v-else>Loading...</p>
</template>
<script type="text/javascript">
import { mapGetters } from 'vuex'
import * as Templates from './templates'
// Map templates
let templateCmps = {}
_.each(Templates, cmp => {
templateCmps[cmp.name] = cmp
})
export default {
props: ["slug"],
components: {
...templateCmps
// Example:
// 'default': Templates.Default,
// 'contact': Templates.Contact,
// 'home': Templates.Home,
},
computed: {
...mapGetters(['pageBySlug']),
wp() {
return this.pageBySlug(this.slug);
},
templateComponent() {
let template = 'default' // assign default template
if (!_.isNull(this.wp.template) && this.wp.template.length)
template = this.wp.template.replace('.php','').toLowerCase()
return template
}
},
created() {
this.$store.dispatch('getPageBySlug', { slug: this.slug })
}
}
</script>
联系.vue:
<template>
<main></main>
</template>
<script type="text/javascript">
export default {
name: 'contact',
mounted() {
console.log('Contact::mounted') // this outputs twice
},
beforeMount() {
console.log('Contact::beforeMount') // this outputs twice
}
}
</script>
【问题讨论】:
-
尝试给
templateComponent添加一个观察者,看看值是否有任何不必要的变化? -
或者在
return template之前简单地添加console.log(template) -
你能做一个 JS fiddle 让我们看看发生了什么吗?
-
尝试打印出 console.log(this.$vnode.tag) 。这将显示组件名称和 ID;然后您可以检查是否有两个不同的组件正在渲染。我曾经遇到过这个问题,我的项目的 css 框架 (semantic-ui) 两次渲染一些 div 并将 display: 'none' 设置为其中一个。狡猾的混蛋。
标签: vue.js vuejs2 vue-component vue-router