560 字
3 分钟
Vue Router4 New Feature
安装
npm i vue-router@next
创建router实例
// 导入vueRouter
import { createRouter, createWebHistory } from 'vue-router'
// 创建router实例
const router = createRouter({
history: createWebHistory(),
routes: [
{ path: '/', component: HelloWorld },
{ path: '/todos', component: Todos },
]
})
挂载到vue实例
createApp(App).use(router).mount('#app')
新特性:动态添加单个路由
// 添加根路由
router.addRoute({
name: 'about',
path: '/about',
component: () =>
import ('./components/About.vue')
})
// 添加子路由
router.addRoute('about', {
path: '/about/info',
component: {
render() {
return h('div', "Info page")
}
}
})
Composition 使用router,route实例
import { useRouter, useRoute } from "vue-router";
setup() {
const state = reactive({
timer: null,
});
const router = useRouter();
const route = useRoute();
onMounted(() => {
state.timer = setInterval(() => {
unref(router).push({
path: "/about",
query:{time: new Date().getTime() }
});
}, 1000);
});
onUnmounted(() => {
clearInterval(state.timer);
});
// 监听路由参数变化
watch(
() => route.query,
(query) => {
console.log(query);
}
);
// 路由守卫
onBeforeRouteLeave((to,from) => {
const answer = window.confirm("确认离开当前页面吗?");
if(!answer){
return false;
}
})
return {
router,
route
}
}
自定义ViewLink
<template>
<div :class="{ active: isActive }" @click="navigate">{{ route.name }}</div>
</template>
<script>
import { RouterLink, useLink } from "vue-router";
export default {
props: {
...RouterLink.props,
},
setup(props) {
// 使用useLink获取路由信息
const { route, href, isActive, isExactActive, navigate } = useLink(props);
return { route, isActive, navigate };
},
};
</script>
<style scoped>
.active{
background: chartreuse;
}
</style>
// 使用组件
<nav-link to="/"></nav-link>
<nav-link to="/todos"></nav-link>
<nav-link to="/about"></nav-link>
keep-alive标签 更换实现形式
<router-view v-slot="{ Component }">
<keep-alive>
<component :is="Component" ></component>
</keep-alive>
</router-view>
router-link标签 tag/event 更换实现形式
befor
<router-link to="/xx" tag="span" event="dbclick" ></router-link>
now
<router-link to="/about" custom v-slot="{ navigate }"> <span @dblclick="navigate">span => About</span> </router-link>
mixins中的路由守卫将被忽略
match方法移除,使用resolve替代
移除router.getMatchedComponents()
// 新方式获取
router.currentRoute.value
包括首屏导航在内所有导航均为异步
// 实现首屏前的动画
app.use(router)
router.isReady().then(() => app.mount('#app'))
route的parent属性被移除
// 新方式获取parent
const parent = this.$route.metched[this.$route.metched.length - 2]
pathToRegexpOptions选项被移除
- pathToRegexpOptions => strict
- caseSensitive => sensitive
createRouter({
strict: Boolean,
sensitive: Boolean
})
使用history.state
// befor
history.pushState(myState, '', url)
// now
router.push(url)
// or
history.replaceState({...history.state, ...myState}, '')
// befor
history.replaceState({}, '', url)
// now
histoty.replaceState(history.state, '', url)
routes选项必填
// 可以填空数组
createRouter({routes:[]})
跳转不存在命名路由会抛出异常
try{
router.push({name:'abouts'})
}catch{
}
缺少必填项参数会抛出异常
命名子路由如果path为空的时候不再追加/
$route属性编码行为
params/query/hash
- path和fullpath 不再做解码
- hash 会被解码
- push、resolve和replace,字符串参数,或者对象参数path属性必须编码
- params中”/“会被解码
- query中”+“不处理,可以使用stringifyQuery处理
Vue Router4 New Feature
https://kuriyama.top/posts/vue/vue-router4-new-feature/