react 6 react-router源码 matchPath

16 篇文章 0 订阅

react-router matchPath

path-to-regexp 链接与使用方式点击这里进入
https://www.npmjs.com/package/path-to-regexp

import { pathToRegexp } from "path-to-regexp";

/**
 *  react-router
 *   match
 *
 * @param {*} path 路径规则
 * @param {*} pathname 具体的地址
 * @param {*} option 相关配置  配置是一个对象,该对象中,可以出现: exact, sensitive,strict
 */

export default function matchPath(path, pathname, options) {
  const keys = [];
  const regExp = pathToRegexp(path, keys, getOptions(options));
  const result = regExp.exec(pathname);
  //   console.log(result, keys);
  if (!result) {
    return; //没有匹配结果
  } else {
    let execArr = Array.from(result);
    execArr = execArr.slice(1);
    // console.log(execArr)
    const params = getParams(execArr, keys);
    // console.log(params);
    if (!params) {
      return null;
    }
    return {
      isExact: pathname === result[0],
      params,
      path,
      url: result[0]
    };
  }
}

/**
 * 将传入的react-router的配置,转换为path-to-regexp的配置
 * @param {*} option
 */

function getOptions(options = {}) {
  const defaultOptions = {
    exact: false,
    sensitive: false,
    strict: false
  };
  const opts = { ...defaultOptions, ...options };
  return {
    sensitive: opts.sensitive,
    strict: opts.sensitive,
    end: opts.exact
  };
}

/**
 * 根据匹配的分组结果,得到一个params对象
 * @param {*} groups
 * @param {*} keys
 */

function getParams(groups, keys) {
  const obj = {};
  for (let i = 0; i < groups.length; i++) {
    const value = groups[i];
    const name = keys[i].name;
    obj[name] = value;
  }
  //   console.log(obj);
  return obj;
}


let match = matchPath("/news/:id/:page?","/news/dfawe/fawef");
console.log(match);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值