]> git.ipfire.org Git - thirdparty/vuejs/router.git/commitdiff
feat(router): allow global router clases
authorEduardo San Martin Morote <posva13@gmail.com>
Thu, 30 Apr 2020 12:13:56 +0000 (14:13 +0200)
committerEduardo San Martin Morote <posva13@gmail.com>
Thu, 30 Apr 2020 12:13:56 +0000 (14:13 +0200)
src/RouterLink.ts
src/router.ts
test-dts/createRouter.test-d.ts

index 189c93a2b22344edc2af32d75128e2d1ab230338..65550a4be89a09b6c685d28beeaf96b61d1f41f1 100644 (file)
@@ -92,23 +92,32 @@ export const RouterLink = (defineComponent({
       type: [String, Object] as PropType<RouteLocationRaw>,
       required: true,
     },
-    activeClass: {
-      type: String,
-      default: 'router-link-active',
-    },
-    exactActiveClass: {
-      type: String,
-      default: 'router-link-exact-active',
-    },
+    activeClass: String,
+    // inactiveClass: String,
+    exactActiveClass: String,
     custom: Boolean,
   },
 
   setup(props, { slots, attrs }) {
     const link = reactive(useLink(props))
+    const { options } = inject(routerKey)!
 
     const elClass = computed(() => ({
-      [props.activeClass]: link.isActive,
-      [props.exactActiveClass]: link.isExactActive,
+      [getLinkClass(
+        props.activeClass,
+        options.linkActiveClass,
+        'router-link-active'
+      )]: link.isActive,
+      // [getLinkClass(
+      //   props.inactiveClass,
+      //   options.linkInactiveClass,
+      //   'router-link-inactive'
+      // )]: !link.isExactActive,
+      [getLinkClass(
+        props.exactActiveClass,
+        options.linkExactActiveClass,
+        'router-link-exact-active'
+      )]: link.isExactActive,
     }))
 
     return () => {
@@ -179,3 +188,20 @@ function includesParams(
 function getOriginalPath(record: RouteRecord | undefined): string {
   return record ? (record.aliasOf ? record.aliasOf.path : record.path) : ''
 }
+
+/**
+ * Utility class to get the active class based on defaults.
+ * @param propClass
+ * @param globalClass
+ * @param defaultClass
+ */
+let getLinkClass = (
+  propClass: string | undefined,
+  globalClass: string | undefined,
+  defaultClass: string
+): string =>
+  propClass != null
+    ? propClass
+    : globalClass != null
+    ? globalClass
+    : defaultClass
index f6a159158aa6c676f2ee541bd1645f62e11556f7..768ae9e46b619fd598d988717745a64452f9299d 100644 (file)
@@ -109,11 +109,27 @@ export interface RouterOptions extends PathParserOptions {
    * {@link RouterOptions.parseQuery | `parseQuery`} counterpart to handle query parsing.
    */
   stringifyQuery?: typeof originalStringifyQuery
+  /**
+   * Default class applied to active {@link RouterLink}. If none is provided,
+   * `router-link-active` will be applied.
+   */
+  linkActiveClass?: string
+  /**
+   * Default class applied to exact active {@link RouterLink}. If none is provided,
+   * `router-link-exact-active` will be applied.
+   */
+  linkExactActiveClass?: string
+  /**
+   * Default class applied to non active {@link RouterLink}. If none is provided,
+   * `router-link-inactive` will be applied.
+   */
+  // linkInactiveClass?: string
 }
 
 export interface Router {
   readonly history: RouterHistory
   readonly currentRoute: Ref<RouteLocationNormalizedLoaded>
+  readonly options: RouterOptions
 
   addRoute(parentName: RouteRecordName, route: RouteRecordRaw): () => void
   addRoute(route: RouteRecordRaw): () => void
@@ -714,6 +730,7 @@ export function createRouter(options: RouterOptions): Router {
     hasRoute,
     getRoutes,
     resolve,
+    options,
 
     push,
     replace,
index 7d62c717d6d635ef6f89cce82fcc5d84abe12f8f..44a97244f1d1b7b98c08a0ba7daf0a8961efac41 100644 (file)
@@ -5,10 +5,10 @@ const component = defineComponent({})
 
 const router = createRouter({
   history: createWebHistory(),
-  strict: true,
   routes: [{ path: '/', component }],
   parseQuery: search => ({}),
   stringifyQuery: query => '',
+  strict: true,
   end: true,
   sensitive: true,
   scrollBehavior(to, from, savedPosition) {},