我有以下数组:

const tabsList = [
  { 
    pathPattern: 'users/'
    label: 'Manage users'
  },
  {
    pathPattern: 'users/:id',
    label: 'Edit user profile'
  }
] 

我需要一个从react-router-dom开始的方法来告诉我上面的哪个数组条目与当前路径名匹配.

在此基础上,我将能够在我的组件样式中为活动列表项上色.

我发现方法useMatch()看起来像是做了我想要的,然而,它不接受数组,它只接受一个字符串模式用于比较.

// example: current path is /users/82374023854321
const isAllUsersMatch = useMatch('/users') // null
const isUserIdMatch = useMatch('/users/:id') // { ...PathMatch<string> } 

它可以工作,但不太好,我必须为数组中的每一项创建一个类似的单独变量.

react-router-dom美元里有没有类似以下的东西?

const tabsList = [
  { 
    pathPattern: 'users/'
    label: 'Manage users'
  },
  {
    pathPattern: 'users/:id',
    label: 'Edit user profile'
  }
] 
const activeListItem = tabsList.some((listItem)=> doesItMatch(listItem.pathPattern))

我会用钩子来做这件事,但在Reaction中,您不能在回调中使用钩子,因此以下代码将不起作用:

// const activeListItem = tabsList.some((listItem)=> doesItMatch(listItem.pathPattern))
const activeListItem = tabsList.some((listItem)=> useMatch(listItem.pathPattern)) // ERROR

推荐答案

您在正确的轨道上迭代了tabsListarray.如果您所需要的只是将当前路径与配置对象/数组中的路径相匹配,那么您可以使用useMatch钩子直接使用的matchPath实用函数,而不是使用useMatch挂钩(这在嵌套回调函数中不起作用).

import { matchPath, useLocation } from "react-router-dom";

const tabsList = [
  {
    pathPattern: "users/",
    label: "Manage users"
  },
  {
    pathPattern: "users/:id",
    label: "Edit user profile"
  }
];

...

const { pathname } = useLocation();
const activeListItem = tabsList.find(({ pathPattern }) =>
  matchPath(pathPattern, pathname)
);

并将上述内容抽象为自定义钩子:

const useTabsListMatches = (tabsList = []) => {
  const { pathname } = useLocation();
  return tabsList.find(({ pathPattern }) =>
    matchPath(pathPattern, pathname)
  );
}
const activeListItem = useTabsListMatches(tabsList);

Edit usematch-for-multilpe-patterns-to-test-on-in-react-router-dom

Typescript相关问答推荐

如何使用TypScript和react-hook-form在Next.js 14中创建通用表单组件?

对于使用另一个对象键和值类型的对象使用TS Generics

TypeScript类型不匹配:在返回类型中处理已经声明的Promise Wrapper

如何修复正在处理类型但与函数一起使用时不处理的类型脚本类型

具有泛型类方法的类方法修饰符

ANGLE找不到辅助‘路由出口’的路由路径

类型脚本基于数组作为泛型参数展开类型

在函数中打字推断记录的关键字

Angular文件上传到Spring Boot失败,多部分边界拒绝

如何 bootstrap TS编译器为类型化属性`T`推断正确的类型?

转换器不需要的类型交集

如何缩小函数的返回类型?

跟踪深度路径时按条件提取嵌套类型

NPM使用Vite Reaction应用程序运行预览有效,但我无法将其部署到Netlify

重写返回任何

TS不能自己推断函数返回类型

TypeScript:方法获胜';t接受较窄类型作为参数

为什么类方法参数可以比接口参数窄

使用 fp-ts 时如何使用 TypeScript 序列化任务执行?

typeof 运算符和泛型的奇怪行为