为了测试 VueJS 服务器端渲染,我试图弄清楚一些事情。我使用最新的VueJS Hackernews 2.0作为这个项目的样板。
目前我坚持这个:
服务器使用 预取数据preFetch
。都好。当用户路由到这个组件时,相同的函数在beforeRouteEnter
函数内部被调用。都好。
但是,当用户第一次加载它时,该preFetchData
函数会被调用 2 次。一进preFetch
一进beforeRouteEnter
。
这是有道理的,因为这正是 Vue Router 的工作方式。preFetch
在服务器上运行,一旦 Vue 在客户端呈现,beforeRouteEnter
就会调用。
但是,我不希望 Vue 在第一次加载时执行 2 次,因为数据已经从服务器端渲染功能存储在存储中preFetch
。
我无法检查数据是否已经在商店中,因为我希望该组件始终在beforeRouteEnter
. 只是不是当它来自服务器时第一次呈现时。
在这种情况下如何只获取一次数据?
<template>
<div class="test">
<h1>Test</h1>
<div v-for="item in items">
{{ item.title }}
</div>
</div>
</template>
<script>
import store from '../store'
function preFetchData (store) {
return store.dispatch('GET_ITEMS')
}
export default {
beforeRouteEnter (to, from, next) {
// We only want to use this when on the client, not the server
// On the server we have preFetch
if (process.env.VUE_ENV === 'client') {
console.log('beforeRouterEnter, only on client')
preFetchData(store)
next()
} else {
// We are on the server, just pass it
next()
}
},
name: 'test',
computed: {
items () {
return this.$store.state.items
}
},
preFetch: preFetchData // Only on server
}
</script>
<style lang="scss">
.test {
background: #ccc;
padding: 40px;
div {
border-bottom: 1px red solid;
}
}
</style>
在上面:API 调用是在store.dispatch('GET_ITEMS')