Remix React Router (原 React Router v6)

在您的 stories 中使用 Remix React Router。(原 storybook-addon-react-router-v6)

在 Github 上檢視

Storybook 擴充套件 Remix React Router

Storybook npm Release npm

在您的 stories 中使用 Remix React Router。

✨注意✨
此套件已重新命名為 storybook-addon-remix-react-router
儲存庫也已重新命名,所以您現在位於正確的頁面。
此遷移是支援 Storybook 8 的必要條件。

近期變更

✅ 使用 storybook-addon-remix-react-router@3 支援 Storybook 8。
✅ 您現在可以使用 useStoryElement 在多個點注入 story。
routing 參數現在接受字串,該字串將同時用作路由路徑和位置路徑名稱。

開始使用

安裝套件

npm i -D storybook-addon-remix-react-router

將其新增至您的 Storybook 設定

// .storybook/main.ts

export default {
  addons: ['storybook-addon-remix-react-router'],
} satisfies StorybookConfig;

裝飾元件的所有 stories

若要將路由器新增至元件的所有 stories,只需將其新增至 decorators 陣列。

請注意,parameters.reactRouter 是可選的,預設情況下,路由器將在 / 呈現元件。

import { withRouter } from 'storybook-addon-remix-react-router';

export default {
  title: 'User Profile',
  render: () => <UserProfile />,
  decorators: [withRouter],
  parameters: {
    reactRouter: reactRouterParameters({
      location: {
        pathParams: { userId: '42' },
      },
      routing: { path: '/users/:userId' },
    }),
  },
};

裝飾特定 story

若要變更單一 story 的設定,您可以執行下列操作

import { withRouter } from 'storybook-addon-remix-react-router';

export default {
  title: 'User Profile',
  render: () => <UserProfile />,
  decorators: [withRouter],
};

export const FromHomePage = {
  parameters: {
    reactRouter: reactRouterParameters({
      location: {
        pathParams: { userId: '42' },
        searchParams: { tab: 'activityLog' },
        state: { fromPage: 'homePage' },
      },
      routing: {
        path: '/users/:userId',
        handle: 'Profile',
      },
    }),
  },
};

全域裝飾所有 stories

若要將專案的所有 stories 包裝在路由器內,請將裝飾器新增至您的 preview.js 檔案。

// .storybook/preview.js

export default {
  decorators: [withRouter],
  parameters: {
    reactRouter: reactRouterParameters({ ... }),
  }
} satisfies Preview;

位置

若要指定任何與瀏覽器位置相關的內容,請使用 location 屬性。

type LocationParameters = {
  path?: string | ((inferredPath: string, pathParams: Record<string, string>) => string | undefined);
  pathParams?: PathParams;
  searchParams?: ConstructorParameters<typeof URLSearchParams>[0];
  hash?: string;
  state?: unknown;
};

推斷路徑

如果未提供 location.path,則瀏覽器路徑名稱將使用 routing 屬性和 pathParams 中聯結的 path 來產生。

路徑作為函式

您可以為 path 提供函式。
它將接收來自 routing 屬性和 pathParams 的已聯結 path 作為參數。
如果函式傳回 string,則將按原樣使用。如果您需要,您可以呼叫 react-router 中的 generatePath
如果函式傳回 undefined,它將回復為預設行為,就像您沒有為 location.path 提供任何值一樣。

路由

您可以將 routing 設定為 createBrowserRouter 接受的任何內容。
為了讓您的生活更輕鬆,storybook-addon-remix-react-router 附帶一些路由輔助工具

export const MyStory = {
  parameters: {
    reactRouter: reactRouterParameters({
      routing: reactRouterOutlet(<MyOutlet />),
    }),
  },
};

路由輔助工具

下列輔助工具可立即使用

reactRouterOutlet(); // Render a single outlet
reactRouterOutlets(); // Render multiple outlets
reactRouterNestedOutlets(); // Render multiple outlets nested one into another
reactRouterNestedAncestors(); // Render the story as an outlet of nested outlets

您也可以建立自己的輔助工具,並使用匯出的類型 RoutingHelper 來協助您

import { RoutingHelper } from 'storybook-addon-remix-react-router';

const myCustomHelper: RoutingHelper = () => {
  // Routing creation logic
};

RouterRoute 基本上是 react-router 中的原生 RouteObject; 使用 { useStoryElement?: boolean } 擴充。如果您想要接受 JSX 並將其轉換為 RouterRoute,則可以使用匯出的函式 castRouterRoute

使用 story 作為路由元素

只需在路由設定物件中設定 { useStoryElement: true }

專用面板

會記錄導覽事件、載入器和動作,以便您更好地了解元件的生命週期。

Addon Panel

相容性

需要 react-router6.4+ 版本。此套件旨在支援 Storybook > 7React > 16

✅ Storybook 8.0
✅ Storybook 7.0

✅ React 18
✅ React 17
✅ React 16

如果您在使用任何版本時遇到問題,請開啟問題。

貢獻

歡迎貢獻。

在撰寫任何程式碼之前,請提交問題,以展示您希望在此擴充套件中看到的錯誤或功能的使用案例。

授權

此套件在 Apache 2.0 授權下發行。