面试问到一个很简单的问题吧, 大概意思就是问有一个电影列表,点击每一个电影,进入详情页面,详情页面是一个单独的组件,靠每一个传送过来的id值进行详情页面的渲染,现在有这个一个问题,当点击第一个电影,进来的时候是电影1的详情页面,然后点击第二个电影,进来还是电影1的详情页面,问:为什么会出现这样的情况,如何解决?
不知道我这样理解是不是对的,也许我的理解有点偏,反正面试是凉了,😄
这是测试的代码github.com/isprodigal/…
//路由配置接受一个id值
const router = new Router({
mode: 'history',
base: process.env.BASE_URL,
routes: [
{
path:'/move/:id',
component: () => import('./beforeRouteUpdate/move')
}
]
})<template>
<div id="app">
<img alt="Vue logo" src="./assets/logo.png" />
<p>针对mounted钩子和created钩子只在页面第一次加载后才能调用出来</p>
<p>只要el被加载过,之后的重复加载该页面就不会调用该钩子了</p>
<p>使用beforeRouteUpdate重新调用钩子</p>
<p>在当前路由改变,但是该组件被复用时调用</p>
<p>对于一个带有动态参数的路径/move/:id,在 /move/1 和 /move/2 之间跳转的时候</p>
<p>由于会渲染同样的move组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用。</p>
<p>点击同一模块根据不同的情况拿取不同的数据</p>
<router-link to="/move/1">电影1详情</router-link>
<p></p>
<router-link to="/move/2">电影2详情</router-link>
<p></p>
<router-link to="/move/3">电影3详情</router-link>
<router-view></router-view>
</div>
</template><template>
<div class="move">
<p>{{msg}}页面</p>
</div>
</template>
<script>
export default {
name: "move",
data() {
return {
msg: {}
};
},
// created() {
// this.msg = this.getId(this.$route.params.id);
},
mounted() {
this.msg = this.getId(this.$route.params.id);
},
beforeRouteUpdate(to, from, next) {
this.msg = this.getId(to.params.id);
next();
},
methods: {
getId(id) {
switch (id) {
case "1":
return { id: 1, name: "电影1的详情" };
case "2":
return { id: 2, name: "电影2的详情" };
case "3":
return { id: 3, name: "电影3的详情" };
}
}
}};