uni-helper / uni-use

uni-app (vue3) 组合式工具集
MIT License
128 stars 16 forks source link

feat: useRouter add query support #45

Closed zhuddan closed 1 month ago

zhuddan commented 1 month ago

描述

这个 PR 新增了 vue router 的 query 参数模式。

额外上下文

我明白这个模式不符合 uni-app 的默认跳转方式,但我习惯了 Vue 原生路由的参数传递方式,因此非常需要这个功能。它支持在路由跳转时携带参数,并在页面中获取这些参数。以下是一个使用示例:

import { useRouter } from '@uni-helper/uni-use';
import { computed, ref, watchEffect } from 'vue';

const router = useRouter();

// 路由跳转,携带参数
router.navigate({ url: '/pages/topics/index', query: { foo: 1 } });

// 路由重定向,携带参数
router.navigate({ url: '/pages/auth/login', query: { bar: 'bar' } });

// 获取当前页路由参数
const id = computed(() => router.currentQuery.value.id);

// 使用当前页路由参数获取数据
const data = ref();

watchEffect(async () => {
  const response = await fetch(
    `https://example.com/${id}`
  );
  data.value = await response.json();
});

尽管这个模式与 uni-app 的跳转机制有所冲突,但它极大地提高了我的开发效率。关于测试,由于单元测试不支持 getCurrentPages,目前尚未找到合适的解决方案,因此我只测试了 utils 中新增的函数。文档部分已根据新功能进行了相应修改。

请仔细审查这个 PR 的变更内容,如果可以,希望能够合并,因为这个功能对我的项目非常重要。

Summary by CodeRabbit

coderabbitai[bot] commented 1 month ago

Walkthrough

The changes enhance the routing functionality of the useRouter module by introducing new interfaces for handling query parameters in navigation options. New functions, handleQuery and setQuery, are added to manage these properties, allowing for improved URL construction. Tests are implemented to validate these functionalities, and the documentation is updated to reflect the new features.

Changes

Files Change Summary
src/useRouter/index.ts Introduced NavigateToOptions and RedirectToOptions interfaces with an optional query property; updated navigation functions accordingly.
src/useRouter/readme.md Enhanced routing examples to illustrate query handling; added reactive data handling with computed for dynamic data fetching.
src/utils.test.ts Newly created tests for the setQuery function to validate query string construction based on various parameter scenarios.
src/utils.ts Introduced a new setQuery function for constructing URLs with query parameters, including handling of empty and falsy values.

Sequence Diagram(s)

sequenceDiagram
    participant User
    participant Router
    participant Utils

    User->>Router: navigateTo({ query: { bar: 'bar' } })
    Router->>Utils: setQuery(baseUrl, query)
    Utils->>Utils: Construct query string
    Utils-->>Router: Return updated URL
    Router-->>User: Navigate to updated URL

🐰 In the meadow, hop and play,
With new routes, we find our way!
Parameters dance, URLs gleam,
A rabbit's joy, a coder's dream!
Let's explore, so much to see,
With every hop, we're wild and free! 🐇✨


Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

Share - [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai) - [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai) - [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai) - [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)
Tips ### Chat There are 3 ways to chat with [CodeRabbit](https://coderabbit.ai): - Review comments: Directly reply to a review comment made by CodeRabbit. Example: - `I pushed a fix in commit .` - `Generate unit testing code for this file.` - `Open a follow-up GitHub issue for this discussion.` - Files and specific lines of code (under the "Files changed" tab): Tag `@coderabbitai` in a new review comment at the desired location with your query. Examples: - `@coderabbitai generate unit testing code for this file.` - `@coderabbitai modularize this function.` - PR comments: Tag `@coderabbitai` in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples: - `@coderabbitai generate interesting stats about this repository and render them as a table.` - `@coderabbitai show all the console.log statements in this repository.` - `@coderabbitai read src/utils.ts and generate unit testing code.` - `@coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.` - `@coderabbitai help me debug CodeRabbit configuration file.` Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. ### CodeRabbit Commands (invoked as PR comments) - `@coderabbitai pause` to pause the reviews on a PR. - `@coderabbitai resume` to resume the paused reviews. - `@coderabbitai review` to trigger an incremental review. This is useful when automatic reviews are disabled for the repository. - `@coderabbitai full review` to do a full review from scratch and review all the files again. - `@coderabbitai summary` to regenerate the summary of the PR. - `@coderabbitai resolve` resolve all the CodeRabbit review comments. - `@coderabbitai configuration` to show the current CodeRabbit configuration for the repository. - `@coderabbitai help` to get help. Additionally, you can add `@coderabbitai ignore` anywhere in the PR description to prevent this PR from being reviewed. ### CodeRabbit Configuration File (`.coderabbit.yaml`) - You can programmatically configure CodeRabbit by adding a `.coderabbit.yaml` file to the root of your repository. - Please see the [configuration documentation](https://docs.coderabbit.ai/guides/configure-coderabbit) for more information. - If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: `# yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json` ### Documentation and Community - Visit our [Documentation](https://coderabbit.ai/docs) for detailed information on how to use CodeRabbit. - Join our [Discord Community](https://discord.com/invite/GsXnASn26c) to get help, request features, and share feedback. - Follow us on [X/Twitter](https://twitter.com/coderabbitai) for updates and announcements.
edwinhuish commented 1 month ago

暂无此应用场景,不过既然 query 最终还是得拼接到 url 上,那么就没有必要额外多加一个 query 选项,而是让用户自己去拼接URL。 仅需要监听 onload 的query参数即可,如你的下面这段。

  const currentQuery = ref<Record<string, any>>({});

  tryOnLoad((options) => {
    currentQuery.value = options ?? {};
  });

移除 query 参数后,关于你的 setQuery 函数,由于此库是 uni-use,不宜加入此处。建议可自用、另发包、或写入readme。

此函数建议可以改进成这样:

/**
 * 封装带有查询参数的 URL
 * @param baseUrl - 基础 URL
 * @param query - 要附加到 URL 的查询参数对象
 * @returns 返回附加了查询参数的完整 URL
 */
export function buildUrl(baseUrl: string, query: Record<string, any>): string {
  if (!Object.keys(query).length) {
    return baseUrl;
  }

  const pieces: string[] = [];

  for (const key in query) {
    if (query[key] === undefined || query[key] === null || query[key] === '') {
      // 用户传入了 key,理应附加此 key,而非移除
      pieces.push(`${key}=`);
    } else {
      pieces.push(`${key}=${encodeURIComponent(query[key])}`);
    }
  }

  // 使用数组 join 方法,而不是使用字符串拼接,以提高性能
  const parameters = pieces.join('&');

  if (!parameters.length) {
    return baseUrl;
  }

  return baseUrl.includes('?')  // 可不用正则解决的需求尽量不要用正则。
    ? `${baseUrl}&${parameters}`
    : `${baseUrl}?${parameters}`;
}
zhuddan commented 1 month ago

暂无此应用场景,不过既然 query 最终还是得拼接到 url 上,那么就没有必要额外多加一个 query 选项,而是让用户自己去拼接URL。 仅需要监听 onload 的query参数即可,如你的下面这段。

感谢您仔细审阅并提供反馈。我理解现有应用场景下,直接让用户拼接 URL 确实更为简洁高效,而不需要额外增加 query 选项。我会遵循您的建议,仅在 onload 时监听 query 参数。既然如此,我会关闭这个PR。非常感谢您的指导,今后我会更加注意确保方案与仓库的目标一致。