javascript - 我如何路由来自同一个组件的多个实例并在 vue 中保持自身状态
问题描述
我可能无法在标题中非常准确地描述这个问题。
前提:
// in main layout page
<keep-alive>
<router-view />
</keep-alive>
// and i have a route
{ path: "something/:id", name: "something", component: () => import("something.vue") }
然后我导航到它
this.$router.push({
name: "something",
params: { "id": 123, ... } // and more params
});
到目前为止,一切正常。
但是,当我再次使用其他参数值(id 为 456)推送相同的名称时:
// something.vue
// the param is new value (456), no problem
{{$route.params.id}}
// but the other data value is kept previous route, like:
{{ count }}
<q-btn label="add" @click="add" />
<script>
export default {
data() {
return {
count: 1
};
},
methods: {
add() {
this.count++;
}
}
};
</script>
让我重新安排一下。
- 推 id 123
- 参数值是正确的(123),计数值为1
- 点击“添加”按钮,计数值为2
- 推送 ID 456
- 参数值是正确的 (456)
- !!!计数值为2,!!!这不是我想要的
我想计数值遵循路由路径,这意味着不同路由中的所有数据状态都是独立的
解决方案
当您导航到相同的路线但使用不同的参数时 - Vue 会重用组件实例,而不会先销毁然后重新创建它。你应该使用beforeRouteUpdate
钩子来捕捉这个 - 或者放一个观察者$route
(然后检查新路线是否仍然是同名)。
更多信息在手册中 - https://next.router.vuejs.org/guide/advanced/navigation-guards.html#in-component-guards
推荐阅读
- c# - 实体框架生成错误查询
- python - 我需要编写一个程序来确定输入的公式是否具有等效的括号集
- c++ - llvm 9 在 10.15 之前的 mac 版本上支持 std::filesystem 吗?
- ios - 在Objective-C中的搜索栏内按下时,UISearchController会触及安全区域
- java - RMI 中自定义类加载器的委托
- python-3.x - 最小步数可被 1 或 2 整除,但可被给定数整除
- python - 将文件从节点 A 传输到所有其他节点(远程主机)并行
- reactjs - 是否可以使用 aws amplify 构建和部署 cube.js。如果是,它的构建设置是什么?
- python - 改进列表理解,使其运行得更快
- angular - 移除同级容器后动画 fxFlex 宽度变化