我在这个拉取请求中看到了:
添加一个
router.reload()
重新加载当前路径并再次调用数据钩子
但是当我尝试从 Vue 组件发出以下命令时:
this.$router.reload()
我收到此错误:
Uncaught TypeError: this.$router.reload is not a function
我在docs中搜索,但找不到任何相关内容。 vue/vue-router 是否提供这样的功能?
我感兴趣的软件版本是:
"vue": "^2.1.0",
"vue-router": "^2.0.3",
PS。我知道
location.reload()
是替代方案之一,但我正在寻找原生 Vue 选项。
this.$router.go()
正是这样做的;如果未指定参数,路由器将导航到当前位置,刷新页面。
注意:当前路由器的实现和其历史组件未将参数标记为可选,但IMVHO这要么是Evan You的错误或遗漏,因为规范明确允许它。 我已经提交了一份有关它的问题报告。如果您确实关心当前的 TS 注释,只需使用等效的
this.$router.go(0)
至于“为什么会这样”:
go
在内部将其参数传递给window.history.go
,因此它等于windows.history.go()
- 反过来,根据MDN doc重新加载页面。
注意:由于这会在常规桌面(非便携式)Firefox 上执行“软”重新加载,因此如果您使用它,可能会出现一堆奇怪的怪癖,但实际上您需要真正的重新加载;使用OP提到的
(https://developer.mozilla.org/en-US/docs/Web/API/Location/reload)可能会有所帮助 - 它确实解决了我在FF上的问题。window.location.reload(true);
最简单的解决方案是为
:key
添加 <router-view>
属性:
<router-view :key="$route.fullPath"></router-view>
这是因为如果处理相同的组件,Vue Router 不会注意到任何变化。使用该密钥,对路径的任何更改都会触发使用新数据重新加载组件。
this.$router.go(this.$router.currentRoute)
Vue-路由器文档:
我检查了 GitHub 上的 vue-router repo,似乎已经没有
reload()
方法了。但在同一个文件中,有: currentRoute
对象。
来源:vue-router/src/index.js
文档:文档
get currentRoute (): ?Route {
return this.history && this.history.current
}
现在您可以使用
this.$router.go(this.$router.currentRoute)
重新加载当前路线。
简单示例。
此答案的版本:
"vue": "^2.1.0",
"vue-router": "^2.1.1"
如果您使用 Typescript,请使用
router.go(0)
,并且它会询问 go 方法的参数。
路由器.js
routes: [
{
path: '/',
component: test,
meta: {
reload: true,
},
}]
main.js
import router from './router';
new Vue({
render: h => h(App),
router,
watch:{
'$route' (to) {
if(to.currentRoute.meta.reload==true){window.location.reload()}
}
}).$mount('#app')
解析 URL 的路由并使用 Javascript 导航窗口。
let r = this.$router.resolve({
name: this.$route.name, // put your route information in
params: this.$route.params, // put your route information in
query: this.$route.query // put your route information in
});
window.location.assign(r.href)
此方法替换 URL 并导致页面执行完整请求(刷新),而不是依赖 Vue.router。 $router.go 对我来说效果不一样,尽管理论上应该如此。
一个简单的例子:
this.$router.go(0)
这里是文档: https://router.vuejs.org/guide/essentials/navigation.html#traverse-history
如果您只想更新页面上的某些组件,这里有一个解决方案:
在模板中
<Component1 :key="forceReload" />
<Component2 :key="forceReload" />
数据中
data() {
return {
forceReload: 0
{
}
在方法中:
Methods: {
reload() {
this.forceReload += 1
}
}
使用唯一的键并将其绑定到您想要更新的每个组件的数据属性(我通常只需要单个组件,最多两个。如果您需要更多,我建议只需使用另一个组件刷新整个页面答案。
我从 Michael Thiessen 的帖子中了解到这一点: https://medium.com/hackernoon/the- Correct-way-to-force-vue-to-re-render-a-component-bde2caae34ad
<router-link
:to='`/products`'
@click.native="$router.go()"
class="sub-link"
>
</router-link>
我已经尝试过重新加载当前页面。
这是我的重载。因为有些浏览器很奇怪。
location.reload
无法重新加载。
methods:{
reload: function(){
this.isRouterAlive = false
setTimeout(()=>{
this.isRouterAlive = true
},0)
}
}
<router-view v-if="isRouterAlive"/>
function removeHash () {
history.pushState("", document.title, window.location.pathname
+ window.location.search);
}
App.$router.replace({name:"my-route", hash: '#update'})
App.$router.replace({name:"my-route", hash: ' ', params: {a: 100} })
setTimeout(removeHash, 0)
备注:
#
之后必须有一些值。setTimeout
,而不是 $nextTick
,以保持网址干净。简单地重新加载/刷新任何组件,执行以下操作
<ProductGrid v-if="renderComponent"/>
<script>
import ProductGrid from "./product-grid";
export default {
name:'product',
components: {
ProductGrid
},
data() {
return {
renderComponent: true,
};
},
methods: {
forceRerender: function() {
// Remove my-component from the DOM
this.renderComponent = false;
this.$nextTick(() => {
// Add the component back in
this.renderComponent = true;
});
}
},
watch:{
'$route.query.cid'(newId, oldId) {
if(newId>0){
this.forceRerender();
}
}
}
}
</script>
对于重新渲染,您可以在父组件中使用
<template>
<div v-if="renderComponent">content</div>
</template>
<script>
export default {
data() {
return {
renderComponent: true,
};
},
methods: {
forceRerender() {
// Remove my-component from the DOM
this.renderComponent = false;
this.$nextTick(() => {
// Add the component back in
this.renderComponent = true;
});
}
}
}
</script>
找到了一种在 vue router 4 上从相同源重新加载相同路由的方法:
import {
useRouter,
NavigationFailureType,
isNavigationFailure,
} from "vue-router";
const router = useRouter();
const handleLinkClick = (link) => {
router.push({ name: link }).then((failure) => {
if (isNavigationFailure(failure, NavigationFailureType.duplicated)) {
router.go({ name: link });
}
});
这个答案帮助了我:
this.$router
.push({ path: '/home' })
.then(() => { this.$router.go() })
它首先重定向到
/home
,然后重新加载页面。帮助登录后更新导航栏。
我有两种重新加载路线的方法。
如果我们想刷新页面A。
// at A page, go to blank page
route.push('/blank')
// at black page, go to A page
route.push('/A')
v-if
刷新路线 // at vue3
const componentVisible = ref(true)
const refresh = () => {
componentVisible.value = false
nextTick(() => {
componentVisible.value = true
})
}
<button @click="refresh">click to reload</button>
<div v-if="componentVisible" class="panel-content">
<router-view></router-view>
</div>
如果您想重新加载页面,只需执行以下操作:
window.location.reload()
vueObject.$forceUpdate();
您可以使用
forceUpdate
方法。
window.location.reload();
您可以使用它来重新加载当前页面。 Jquery 中也有类似的用法。