Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 55 additions & 0 deletions docs/api/functions/getQueryParameter.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
[dt-utils](../globals.md) / getQueryParameter

# Function: getQueryParameter()

> **getQueryParameter**(`name`, `url?`): `undefined` \| `null` \| `string` \| `number` \| `boolean`

Defined in: [getQueryParameter/index.ts:35](https://github.com/DTStack/dt-utils/blob/master/src/getQueryParameter/index.ts#L35)

从给定的 URL 中获取指定查询参数的值。

## Parameters

### name

`string`

要获取的查询参数名

### url?

`string`

目标 URL,若未提供则使用当前页面的 window.location.href

## Returns

`undefined` \| `null` \| `string` \| `number` \| `boolean`

- 解析后的查询参数值

## Description

解析目标 URL 的查询字符串,提取并转换指定名称的查询参数值。
支持处理特殊字符串值:
- 'null' 会被转换为 null
- 'undefined' 会被转换为 undefined
- 可以被 JSON 解析的字符串会被自动解析(例如数字、布尔值)
- 其他值保持字符串形式

## Example

```typescript
import getQueryParameter from 'dt-utils';

// 基本用法
getQueryParameter('name', 'https://example.com?name=john&age=25'); // => "john"

// 处理特殊值
getQueryParameter('isActive', 'https://example.com?isActive=true&count=null'); // => true
getQueryParameter('count', 'https://example.com?isActive=true&count=null'); // => null

// 不传入 url 时使用当前页面 URL
// 若当前页面 URL 为 https://current.com?page=home&limit=10
getQueryParameter('limit'); // => 10
```
2 changes: 1 addition & 1 deletion docs/api/functions/getQueryParameters.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ Defined in: [getQueryParameters/index.ts:37](https://github.com/DTStack/dt-utils

### T

`T` *extends* `Record`\<`string`, `undefined` \| `null` \| `string`\>
`T` *extends* `Record`\<`string`, `undefined` \| `null` \| `string` \| `number` \| `boolean`\>

## Parameters

Expand Down
1 change: 1 addition & 0 deletions docs/api/globals.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
- [downloadFile](functions/downloadFile.md)
- [generateUniqueId](functions/generateUniqueId.md)
- [generateUrlWithQuery](functions/generateUrlWithQuery.md)
- [getQueryParameter](functions/getQueryParameter.md)
- [getQueryParameters](functions/getQueryParameters.md)
- [getTypeOfValue](functions/getTypeOfValue.md)
- [~~shouldRender~~](functions/shouldRender.md)
Expand Down
4 changes: 4 additions & 0 deletions docs/api/typedoc-sidebar.json
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,10 @@
"text": "generateUrlWithQuery",
"link": "/api/functions/generateUrlWithQuery.md"
},
{
"text": "getQueryParameter",
"link": "/api/functions/getQueryParameter.md"
},
{
"text": "getQueryParameters",
"link": "/api/functions/getQueryParameters.md"
Expand Down
36 changes: 36 additions & 0 deletions src/getQueryParameter/__test__/index.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import getQueryParameter from '..';

describe('getQueryParameter', () => {
it('should return the parsed value for a parameter from the provided url', () => {
expect(getQueryParameter('age', 'https://example.com?name=john&age=25')).toBe(25);
expect(getQueryParameter('enabled', 'https://example.com?enabled=true')).toBe(true);
});

it('should return undefined when the parameter does not exist', () => {
expect(getQueryParameter('missing', 'https://example.com?name=john')).toBeUndefined();
});

it('should use window.location.href when url is not provided', () => {
const originalLocation = window.location;

Object.defineProperty(window, 'location', {
configurable: true,
value: {
href: 'https://current.com?page=home&limit=10',
},
});

expect(getQueryParameter('page')).toBe('home');
expect(getQueryParameter('limit')).toBe(10);

Object.defineProperty(window, 'location', {
configurable: true,
value: originalLocation,
});
});

it('should preserve special parsed values from the query string', () => {
expect(getQueryParameter('empty', 'https://example.com?empty=null')).toBeNull();
expect(getQueryParameter('unset', 'https://example.com?unset=undefined')).toBeUndefined();
});
});
50 changes: 50 additions & 0 deletions src/getQueryParameter/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
import getQueryParameters from '../getQueryParameters';

/**
* 从给定的 URL 中获取指定查询参数的值。
*
* @category Utils
* @description
* 解析目标 URL 的查询字符串,提取并转换指定名称的查询参数值。
* 支持处理特殊字符串值:
* - 'null' 会被转换为 null
* - 'undefined' 会被转换为 undefined
* - 可以被 JSON 解析的字符串会被自动解析(例如数字、布尔值)
* - 其他值保持字符串形式
*
* @param {string} name - 要获取的查询参数名
* @param {string} [url] - 目标 URL,若未提供则使用当前页面的 window.location.href
* @returns {string | null | undefined | number | boolean} - 解析后的查询参数值
Comment thread
jin-sir marked this conversation as resolved.
*
* @example
* ```typescript
* import getQueryParameter from 'dt-utils';
*
* // 基本用法
* getQueryParameter('name', 'https://example.com?name=john&age=25'); // => "john"
*
* // 处理特殊值
* getQueryParameter('isActive', 'https://example.com?isActive=true&count=null'); // => true
* getQueryParameter('count', 'https://example.com?isActive=true&count=null'); // => null
*
* // 不传入 url 时使用当前页面 URL
* // 若当前页面 URL 为 https://current.com?page=home&limit=10
* getQueryParameter('limit'); // => 10
* ```
*/
const getQueryParameter = (name: string, url?: string) => {
Comment thread
jin-sir marked this conversation as resolved.
Comment thread
jin-sir marked this conversation as resolved.
try {
const targetUrl = url || window.location.href;
const search = new URL(targetUrl).search;
const params = getQueryParameters(search);

return params[name];
} catch (error: unknown) {
console.error(
'Error parsing query parameter:',
error instanceof Error ? error.message : error
);
return undefined;
}
};
export default getQueryParameter;
40 changes: 24 additions & 16 deletions src/getQueryParameters/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,29 +34,37 @@
* // params.page 是字符串类型, params.limit 是数字类型
* ```
*/
const getQueryParameters = <T extends Record<string, string | null | undefined>>(
const getQueryParameters = <T extends Record<string, string | null | undefined | number | boolean>>(
search: string
): T => {
if (!search) return {} as T;

const searchParams = new URLSearchParams(search);
const paramValue = {};
try {
const searchParams = new URLSearchParams(search);
const paramValue = {};

searchParams.forEach((value, key) => {
if (value === 'null') {
paramValue[key] = null;
} else if (value === 'undefined') {
paramValue[key] = undefined;
} else {
try {
paramValue[key] = JSON.parse(value);
} catch (error) {
paramValue[key] = value;
searchParams.forEach((value, key) => {
if (value === 'null') {
paramValue[key] = null;
} else if (value === 'undefined') {
paramValue[key] = undefined;
} else {
try {
paramValue[key] = JSON.parse(value);
} catch (error) {
paramValue[key] = value;
}
}
}
});
});

return paramValue as T;
return paramValue as T;
} catch (error: unknown) {
console.error(
'Error parsing query parameters:',
error instanceof Error ? error.message : error
);
return {} as T;
}
};

export default getQueryParameters;
1 change: 1 addition & 0 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ export { default as formatSecond } from './formatSecond';
export { default as fromBase64 } from './fromBase64';
export { default as generateUniqueId } from './generateUniqueId';
export { default as generateUrlWithQuery } from './generateUrlWithQuery';
export { default as getQueryParameter } from './getQueryParameter';
export { default as getQueryParameters } from './getQueryParameters';
export { default as getTypeOfValue } from './getTypeOfValue';
export { default as IndexedDB } from './indexedDB';
Expand Down
Loading