mirror of
				https://gitee.com/vant-contrib/vant.git
				synced 2025-10-29 18:52:09 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			107 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			107 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| import { watch, nextTick } from 'vue';
 | |
| import { createRouter, createWebHashHistory } from 'vue-router';
 | |
| import DemoHome from './components/DemoHome.vue';
 | |
| import { decamelize } from '../common';
 | |
| import { demos, config } from 'site-mobile-shared';
 | |
| import { getLang, setDefaultLang } from '../common/locales';
 | |
| import { listenToSyncPath, syncPathToParent } from '../common/iframe-sync';
 | |
| 
 | |
| const { locales, defaultLang } = config.site;
 | |
| 
 | |
| setDefaultLang(defaultLang);
 | |
| 
 | |
| function getLangFromRoute(route) {
 | |
|   const lang = route.path.split('/')[1];
 | |
|   const langs = Object.keys(locales);
 | |
| 
 | |
|   if (langs.indexOf(lang) !== -1) {
 | |
|     return lang;
 | |
|   }
 | |
| 
 | |
|   return getLang();
 | |
| }
 | |
| 
 | |
| function getRoutes() {
 | |
|   const routes = [];
 | |
|   const names = Object.keys(demos);
 | |
|   const langs = locales ? Object.keys(locales) : [];
 | |
| 
 | |
|   if (langs.length) {
 | |
|     routes.push({
 | |
|       name: 'NotFound',
 | |
|       path: '/:path(.*)+',
 | |
|       redirect: (route) => ({
 | |
|         name: getLangFromRoute(route),
 | |
|       }),
 | |
|     });
 | |
| 
 | |
|     langs.forEach((lang) => {
 | |
|       routes.push({
 | |
|         name: lang,
 | |
|         path: `/${lang}`,
 | |
|         component: DemoHome,
 | |
|         meta: { lang },
 | |
|       });
 | |
|     });
 | |
|   } else {
 | |
|     routes.push({
 | |
|       name: 'NotFound',
 | |
|       path: '/:path(.*)+',
 | |
|       redirect: {
 | |
|         name: 'home',
 | |
|       },
 | |
|     });
 | |
| 
 | |
|     routes.push({
 | |
|       name: 'home',
 | |
|       path: '/',
 | |
|       component: DemoHome,
 | |
|     });
 | |
|   }
 | |
| 
 | |
|   names.forEach((name) => {
 | |
|     const component = decamelize(name);
 | |
| 
 | |
|     if (langs.length) {
 | |
|       langs.forEach((lang) => {
 | |
|         routes.push({
 | |
|           name: `${lang}/${component}`,
 | |
|           path: `/${lang}/${component}`,
 | |
|           component: demos[name],
 | |
|           meta: {
 | |
|             name,
 | |
|             lang,
 | |
|           },
 | |
|         });
 | |
|       });
 | |
|     } else {
 | |
|       routes.push({
 | |
|         name: component,
 | |
|         path: `/${component}`,
 | |
|         component: demos[name],
 | |
|         meta: {
 | |
|           name,
 | |
|         },
 | |
|       });
 | |
|     }
 | |
|   });
 | |
| 
 | |
|   return routes;
 | |
| }
 | |
| 
 | |
| export const router = createRouter({
 | |
|   history: createWebHashHistory(),
 | |
|   routes: getRoutes(),
 | |
|   scrollBehavior: (to, from, savedPosition) => savedPosition || { x: 0, y: 0 },
 | |
| });
 | |
| 
 | |
| watch(router.currentRoute, () => {
 | |
|   if (!router.currentRoute.value.redirectedFrom) {
 | |
|     nextTick(syncPathToParent);
 | |
|   }
 | |
| });
 | |
| 
 | |
| listenToSyncPath(router);
 | |
| 
 | |
| window.vueRouter = router;
 |