# vue-route-query-hook
**Repository Path**: gao-shunpeng/vue-route-query-hook
## Basic Information
- **Project Name**: vue-route-query-hook
- **Description**: 用于响应参数和URL查询参数之间双向同步的Vue 3 hooks
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 3
- **Forks**: 1
- **Created**: 2025-08-01
- **Last Updated**: 2026-02-01
## Categories & Tags
**Categories**: vue-extensions
**Tags**: Vue, TypeScript, JavaScript
## README
# vue-route-query-hook
中文 | [English](./README.md)
一个用于 Vue 3 的 Composable,提供响应式参数与 URL 查询参数之间的双向同步功能。
[](https://www.npmjs.com/package/vue-route-query-hook)
[](https://opensource.org/licenses/MIT)
## 特性
- 🔄 **双向同步**: 响应式参数与 URL 查询参数自动同步
- 🎯 **类型安全**: 完整的 TypeScript 支持
- ⚙️ **灵活配置**: 支持排除字段、空值处理等多种配置
- 🚀 **Vue 3**: 基于 Vue 3 Composition API
- 📦 **轻量级**: 无额外依赖,仅依赖 Vue 和 Vue Router
## 安装
```bash
npm install vue-route-query-hook
```
或使用 yarn:
```bash
yarn add vue-route-query-hook
```
或使用 pnpm:
```bash
pnpm add vue-route-query-hook
```
## 基础用法
```vue
```
## API
### useRouteQuery(params, options?)
#### 参数
- **params**: `QueryParams` - 要同步的响应式参数对象
- key: 路由参数名
- value: Vue 响应式引用 (Ref)
- **options**: `UseRouteQueryOptions` (可选) - 配置选项
#### 返回值
返回一个包含以下方法的对象:
- **updateRouteQuery**: `() => void` - 手动更新路由查询参数
- **initParamsFromRoute**: `() => void` - 从路由初始化参数
- **resetParams**: `(resetValues?) => void` - 重置参数为初始值
## 配置选项
### UseRouteQueryOptions
```typescript
interface UseRouteQueryOptions {
/**
* 排除的字段,这些字段不会同步到路由
* @default []
*/
excludeKeys?: string[];
/**
* 是否立即执行 watch 监听
* @default true
*/
immediate?: boolean;
/**
* 是否在组件挂载时从路由初始化参数
* @default true
*/
initFromRoute?: boolean;
/**
* 空值处理方式
* - 'remove': 移除参数
* - 'keep': 保留参数
* @default 'remove'
*/
emptyValueHandle?: "remove" | "keep";
}
```
## 高级用法
### 排除某些字段
```typescript
const searchParams = reactive({
keyword: "",
internalFlag: false, // 这个字段不需要同步到 URL
});
useRouteQuery(
{
q: toRef(searchParams, "keyword"),
internal: toRef(searchParams, "internalFlag"),
},
{
excludeKeys: ["internal"], // 排除 internal 字段
}
);
```
### 手动控制同步时机
```typescript
const { updateRouteQuery } = useRouteQuery(
{
status: toRef(searchParams, "status"),
},
{
immediate: false, // 禁用自动同步
}
);
// 在需要的时候手动同步
function handleSubmit() {
updateRouteQuery();
}
```
### 保留空值参数
```typescript
useRouteQuery(
{
q: toRef(searchParams, "keyword"),
},
{
emptyValueHandle: "keep", // 空值时保留参数为空字符串
}
);
```
### 自定义重置值
```typescript
const { resetParams } = useRouteQuery({
keyword: toRef(searchParams, "keyword"),
page: toRef(searchParams, "page"),
});
// 重置为默认值
resetParams();
// 重置为指定值
resetParams({
keyword: "default search",
page: 1,
});
```
## 类型支持
该包提供完整的 TypeScript 类型支持:
```typescript
import type {
QueryValue,
QueryParams,
UseRouteQueryOptions,
UseRouteQueryReturn,
} from "vue-route-query-hook";
```
### 类型定义
```typescript
type QueryValue = string | number | boolean | undefined | null;
type QueryParams = Record>;
```
## 注意事项
1. **类型转换**: Hook 会根据原始值的类型自动转换路由参数
- `number`: 转换为数字,无效时保持原值
- `boolean`: `'true'` 转换为 `true`,其他为 `false`
- `string`: 直接返回字符串值
2. **历史记录**: 使用 `router.replace` 更新路由,不会产生浏览器历史记录
3. **深度监听**: 自动开启深度监听,支持嵌套对象的变化检测
## 兼容性
- Vue 3.0+
- Vue Router 4.0+
## 仓库地址
- **GitHub**: [https://github.com/gaoshunpeng/vue-route-query-hook](https://github.com/gaoshunpeng/vue-route-query-hook)
- **Gitee**: [https://gitee.com/gao-shunpeng/vue-route-query-hook](https://gitee.com/gao-shunpeng/vue-route-query-hook)
## 贡献指南
### Issue 提交规范
为了更好地维护项目和快速定位问题,请在提交 Issue 时遵循以下规范:
#### Issue 类型
请在 Issue 标题前添加对应的类型标签:
- 🐛 **[Bug]**: 功能异常或错误
- ✨ **[Feature]**: 新功能请求
- 📚 **[Docs]**: 文档相关问题
- ❓ **[Question]**: 使用咨询或疑问
- 💡 **[Enhancement]**: 功能改进建议
#### Issue 模板
**Bug 报告**
```
**问题描述**
简要描述遇到的问题
**重现步骤**
1. 第一步操作
2. 第二步操作
3. 看到错误
**期望行为**
描述期望的正确行为
**实际行为**
描述实际发生的行为
**环境信息**
- Vue 版本:
- Vue Router 版本:
- vue-route-query-hook 版本:
- 浏览器:
- 操作系统:
**代码示例**
提供最小可复现的代码示例
**其他信息**
任何其他有助于定位问题的信息
```
**功能请求**
```
**功能描述**
详细描述希望添加的功能
**使用场景**
说明在什么情况下需要这个功能
**建议实现**
如果有实现思路,请简要说明
**替代方案**
是否考虑过其他解决方案
```
#### 提交须知
1. **搜索现有 Issue**: 提交前请搜索是否已有相似问题
2. **使用中文**: 优先使用中文描述,方便交流
3. **提供完整信息**: 请按照模板提供详细信息
4. **代码格式**: 使用 \`\`\` 包裹代码块
5. **保持礼貌**: 使用友好和建设性的语言
#### 示例
好的 Issue 标题:
- 🐛 [Bug] useRouteQuery 在 SSR 环境下报错
- ✨ [Feature] 支持数组类型的查询参数
- 📚 [Docs] API 文档中缺少 resetParams 参数说明
不好的 Issue 标题:
- 不工作
- 怎么用?
- 有 bug
感谢你的贡献!🎉
## 许可证
MIT
## 作者
高顺鹏