2022-10-18 13:54:20 +08:00
|
|
|
|
---
|
|
|
|
|
title: API
|
|
|
|
|
order: 15
|
|
|
|
|
---
|
|
|
|
|
|
2022-10-25 15:15:25 +08:00
|
|
|
|
### defineAppConfig
|
2022-10-18 13:54:20 +08:00
|
|
|
|
|
2022-10-25 15:15:25 +08:00
|
|
|
|
该方法用于获取框架配置的类型提示。
|
2022-10-18 13:54:20 +08:00
|
|
|
|
|
2022-10-25 15:15:25 +08:00
|
|
|
|
```ts title="src/app.ts"
|
|
|
|
|
import { defineAppConfig } from 'ice';
|
|
|
|
|
|
|
|
|
|
export default defineAppConfig(() => ({
|
|
|
|
|
app: {
|
|
|
|
|
rootId: 'ice-container',
|
|
|
|
|
}
|
|
|
|
|
}));
|
|
|
|
|
```
|
|
|
|
|
|
2022-11-11 11:02:51 +08:00
|
|
|
|
### definePageConfig
|
2022-10-25 15:15:25 +08:00
|
|
|
|
|
|
|
|
|
该方法用于获取路由组件支持的配置类型,支持的配置可以被插件动态扩展。
|
|
|
|
|
|
|
|
|
|
```tsx title="src/pages/home.tsx"
|
2022-11-11 11:02:51 +08:00
|
|
|
|
import { definePageConfig } from 'ice';
|
2022-10-25 15:15:25 +08:00
|
|
|
|
|
2022-11-11 11:02:51 +08:00
|
|
|
|
export const pageConfig = definePageConfig(() => ({
|
2022-10-25 15:15:25 +08:00
|
|
|
|
title: 'About',
|
|
|
|
|
meta: [
|
|
|
|
|
{
|
|
|
|
|
name: 'theme-color',
|
|
|
|
|
content: '#eee',
|
|
|
|
|
},
|
|
|
|
|
],
|
|
|
|
|
}));
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### history
|
|
|
|
|
|
|
|
|
|
应用的 history,用于获取路由信息、执行跳转等。
|
|
|
|
|
|
|
|
|
|
```ts
|
|
|
|
|
|
|
|
|
|
import { history } from 'ice';
|
|
|
|
|
|
|
|
|
|
export function historyPush (link: string) {
|
|
|
|
|
history.push(link);
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
:::caution
|
|
|
|
|
|
|
|
|
|
在应用入口 `src/app.ts` 导入使用时,由于 history 还未完成初始化创建,不能以立即执行的方式使用。推荐以上述方式封装后在必要的时候进行调用。
|
|
|
|
|
:::
|
|
|
|
|
|
|
|
|
|
### useParams
|
|
|
|
|
|
2022-11-15 15:03:30 +08:00
|
|
|
|
:::caution
|
|
|
|
|
小程序端不支持该 API。
|
|
|
|
|
:::
|
|
|
|
|
|
2022-10-25 15:15:25 +08:00
|
|
|
|
useParams 函数返回动态路由的匹配参数信息。
|
|
|
|
|
|
|
|
|
|
```tsx
|
|
|
|
|
import { useParams } from 'ice';
|
|
|
|
|
|
|
|
|
|
// 路由规则为 home/:uid/repo/:repoid
|
|
|
|
|
// 当前路径 home/clark/repo/1234
|
|
|
|
|
export default function Home() {
|
|
|
|
|
const params = useParams();
|
|
|
|
|
// params 输出内容为 { uid: 'clark', repoid: '1234'}
|
|
|
|
|
return (
|
|
|
|
|
<>
|
|
|
|
|
<h2>Home Page</h2>
|
|
|
|
|
</>
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### useSearchParams
|
|
|
|
|
|
2022-11-15 15:03:30 +08:00
|
|
|
|
:::caution
|
|
|
|
|
小程序端会返回当前页面 `Page.onLoad` 生命周期返回的 query 参数。
|
|
|
|
|
同时小程序端不支持修改 query string,即调用该 API 返回的 `setSearchParams` 不会生效。
|
|
|
|
|
:::
|
|
|
|
|
|
2022-10-25 15:15:25 +08:00
|
|
|
|
useSearchParams 用于读取和修改当前 URL 的 query string。
|
|
|
|
|
|
|
|
|
|
```tsx
|
2022-12-07 19:17:17 +08:00
|
|
|
|
import { useSearchParams } from 'ice';
|
2022-10-25 15:15:25 +08:00
|
|
|
|
|
2023-02-10 17:38:12 +08:00
|
|
|
|
// 假设当前访问的 url 是 localhost:3000/home?uid=1234
|
2022-10-25 15:15:25 +08:00
|
|
|
|
export default function Home() {
|
|
|
|
|
const [searchParams, setSearchParams] = useSearchParams();
|
2023-02-10 17:38:12 +08:00
|
|
|
|
// 通过 searchParams.get() 获取当前 query 值
|
|
|
|
|
console.log(searchParams.get('uid')); // 1234
|
2022-10-25 15:15:25 +08:00
|
|
|
|
|
|
|
|
|
const changeSearch = () => {
|
|
|
|
|
// 通过 setSearchParams 可以修改对应 query string
|
2022-12-07 19:17:17 +08:00
|
|
|
|
setSearchParams({ uid: '4321' });
|
2022-10-25 15:15:25 +08:00
|
|
|
|
}
|
|
|
|
|
return (
|
|
|
|
|
<>
|
|
|
|
|
<h2>Home Page</h2>
|
|
|
|
|
</>
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### useNavigate
|
|
|
|
|
|
2022-11-15 15:03:30 +08:00
|
|
|
|
:::caution
|
|
|
|
|
小程序端不支持该 API。可通过 Link 组件或 history 或小程序原生 API 进行跳转。
|
|
|
|
|
:::
|
|
|
|
|
|
2022-10-25 15:15:25 +08:00
|
|
|
|
useNavigate 函数返回一个可以控制跳转的函数,用于组件内部控制路径跳转
|
|
|
|
|
|
|
|
|
|
```tsx
|
|
|
|
|
import { useNavigate } from 'ice';
|
|
|
|
|
|
|
|
|
|
export default function Home() {
|
|
|
|
|
const navigate = useNavigate();
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
navigate('/logout', { replace: true });
|
|
|
|
|
}, []);
|
|
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
<>
|
|
|
|
|
<h2>Home Page</h2>
|
|
|
|
|
</>
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### useLocation
|
|
|
|
|
|
2022-11-15 15:03:30 +08:00
|
|
|
|
:::caution
|
|
|
|
|
小程序端不支持该 API。
|
|
|
|
|
:::
|
|
|
|
|
|
2022-10-25 15:15:25 +08:00
|
|
|
|
useLocation 返回当前 location 信息。
|
|
|
|
|
|
|
|
|
|
```tsx
|
|
|
|
|
import { useLocation } from 'ice';
|
|
|
|
|
|
|
|
|
|
function Home() {
|
|
|
|
|
const location = useLocation();
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
// send pv info
|
|
|
|
|
}, [location]);
|
|
|
|
|
return (
|
|
|
|
|
<>
|
|
|
|
|
<h2>Home Page</h2>
|
|
|
|
|
</>
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### useAppData
|
|
|
|
|
|
2022-11-14 18:09:04 +08:00
|
|
|
|
useAppData 返回应用全局数据,需要搭配 `src/app.ts` 中导出的 `dataLoader` 使用:
|
2022-10-25 15:15:25 +08:00
|
|
|
|
|
|
|
|
|
```ts title="src/app.ts"
|
2022-11-14 18:09:04 +08:00
|
|
|
|
import { defineDataLoader } from 'ice';
|
|
|
|
|
|
|
|
|
|
export const dataLoader = defineDataLoader(() => {
|
2022-10-25 15:15:25 +08:00
|
|
|
|
return await fetch('/api/user');
|
2022-11-14 18:09:04 +08:00
|
|
|
|
})
|
2022-10-25 15:15:25 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
在任意组件内进行消费:
|
|
|
|
|
|
|
|
|
|
```tsx
|
|
|
|
|
import { useAppData } from 'ice';
|
|
|
|
|
|
|
|
|
|
function Home() {
|
|
|
|
|
const data = useAppData();
|
|
|
|
|
// data 内容为 /api/user 接口返回数据
|
|
|
|
|
return (
|
|
|
|
|
<>
|
|
|
|
|
<h2>Home Page</h2>
|
|
|
|
|
</>
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### useData
|
|
|
|
|
|
2022-11-10 16:40:39 +08:00
|
|
|
|
useData 返回路由组件数据,需要搭配在路由组件中定义数据获取方法进行使用。参考[页面数据请求文档](./data-loader)
|
2022-10-25 15:15:25 +08:00
|
|
|
|
|
|
|
|
|
### useConfig
|
|
|
|
|
|
2022-11-11 11:02:51 +08:00
|
|
|
|
useConfig 返回路由组件配置,搭配 [definePageConfig](./api#definepageconfig)。
|
2022-10-25 15:15:25 +08:00
|
|
|
|
|
|
|
|
|
```tsx title="src/pages/home.tsx"
|
2022-11-11 11:02:51 +08:00
|
|
|
|
import { definePageConfig, useConfig } from 'ice';
|
2022-10-25 15:15:25 +08:00
|
|
|
|
|
|
|
|
|
export default function Home() {
|
|
|
|
|
const config = useConfig();
|
|
|
|
|
return (
|
|
|
|
|
<>
|
|
|
|
|
<h2>Home Page</h2>
|
|
|
|
|
</>
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
2022-11-11 11:02:51 +08:00
|
|
|
|
export const pageConfig = definePageConfig(() => ({
|
2022-10-25 15:15:25 +08:00
|
|
|
|
title: 'About',
|
|
|
|
|
meta: [
|
|
|
|
|
{
|
|
|
|
|
name: 'theme-color',
|
|
|
|
|
content: '#eee',
|
|
|
|
|
},
|
|
|
|
|
],
|
|
|
|
|
}));
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### useMounted
|
2022-10-18 13:54:20 +08:00
|
|
|
|
|
2022-11-15 15:03:30 +08:00
|
|
|
|
:::caution
|
|
|
|
|
小程序端不支持该 API。
|
|
|
|
|
:::
|
|
|
|
|
|
2022-10-18 13:54:20 +08:00
|
|
|
|
该方法会在 React Hydrate 完成后返回 `true`,一般在开启 SSR/SSG 的应用中,用于控制在不同端中渲染不同的组件。
|
|
|
|
|
|
|
|
|
|
:::caution
|
|
|
|
|
|
|
|
|
|
使用此 `useMounted` 而不是 `typeof windows !== 'undefined'` 来判断当前是否在 Client 端中渲染。
|
|
|
|
|
|
|
|
|
|
因为第一次 Client 端渲染必须与 Server 端渲染的接口一致,如果不使用此 Hook 判断的话,在 Hydrate 时可能出现节点不匹配的情况。
|
|
|
|
|
:::
|
|
|
|
|
|
|
|
|
|
使用示例:
|
|
|
|
|
|
|
|
|
|
```tsx
|
|
|
|
|
import { useMounted } from 'ice';
|
|
|
|
|
|
|
|
|
|
const Home = () => {
|
|
|
|
|
const mounted = useMounted();
|
|
|
|
|
return <div>{mounted ? 'Client' : 'Server'}</div>;
|
|
|
|
|
};
|
|
|
|
|
```
|
|
|
|
|
|
2023-06-05 16:01:11 +08:00
|
|
|
|
### useAppContext
|
|
|
|
|
|
|
|
|
|
获取应用级 Context, 包含字段为:
|
|
|
|
|
* appConfig object, 通过 defineAppConfig 定义的 appConfig
|
|
|
|
|
* renderMode string, 渲染模式,'CSR'|'SSR'|'SSG'
|
|
|
|
|
* documentOnly boolean, 是否指定为 CSR
|
|
|
|
|
* downgrade boolean, 是否为 SSR 降级
|
|
|
|
|
|
|
|
|
|
```ts title="src/document.ts"
|
|
|
|
|
import { useAppContext } from 'ice';
|
|
|
|
|
|
|
|
|
|
function Document() {
|
|
|
|
|
const { renderMode } = useAppContext();
|
|
|
|
|
console.log(renderMode);
|
|
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
<html>
|
|
|
|
|
<head>
|
|
|
|
|
</head>
|
|
|
|
|
<body>
|
|
|
|
|
<Main />
|
|
|
|
|
</body>
|
|
|
|
|
</html>
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
2022-10-18 13:54:20 +08:00
|
|
|
|
### `<ClientOnly />`
|
|
|
|
|
|
2022-11-15 15:03:30 +08:00
|
|
|
|
:::caution
|
|
|
|
|
小程序端不支持该组件。
|
|
|
|
|
:::
|
|
|
|
|
|
2022-10-18 13:54:20 +08:00
|
|
|
|
`<ClientOnly />` 组件只允许在 React Hydrate 完成后在 Client 端中渲染组件。
|
|
|
|
|
|
|
|
|
|
:::tip
|
|
|
|
|
|
|
|
|
|
用 `<ClientOnly />` 组件包裹不能在 Node.js 中运行的组件,比如如果组件要访问 `window` 或 `document` 对象。
|
|
|
|
|
:::
|
|
|
|
|
|
|
|
|
|
**Props**
|
|
|
|
|
|
|
|
|
|
- `children`: 一个函数,且返回仅在浏览器中渲染的组件。该函数不会在 Server 端中执行
|
|
|
|
|
- `fallback`(可选): 在 React Hydrate 完成之前渲染的组件
|
|
|
|
|
|
|
|
|
|
使用示例:
|
|
|
|
|
|
|
|
|
|
```tsx
|
|
|
|
|
import { ClientOnly } from 'ice';
|
|
|
|
|
|
|
|
|
|
export function Home () {
|
|
|
|
|
return (
|
|
|
|
|
<ClientOnly fallback={<div>loading...</div>}>
|
|
|
|
|
{() => <span>page url is {window.location.href}</span>}
|
|
|
|
|
</ClientOnly>
|
|
|
|
|
);
|
|
|
|
|
};
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
引入一个组件:
|
|
|
|
|
|
|
|
|
|
```tsx
|
|
|
|
|
import { ClientOnly } from 'ice';
|
|
|
|
|
import MyComponent from './MyComponent';
|
|
|
|
|
|
|
|
|
|
export function Home () {
|
|
|
|
|
return (
|
|
|
|
|
<ClientOnly fallback={<div>loading...</div>}>
|
|
|
|
|
{() => <MyComponent />}
|
|
|
|
|
</ClientOnly>
|
|
|
|
|
);
|
|
|
|
|
};
|
|
|
|
|
```
|
2022-10-21 11:21:19 +08:00
|
|
|
|
|
|
|
|
|
### `<KeepAliveOutlet />`
|
|
|
|
|
|
2022-11-15 15:03:30 +08:00
|
|
|
|
:::caution
|
|
|
|
|
小程序端不支持该组件。
|
|
|
|
|
:::
|
|
|
|
|
|
2022-10-21 11:21:19 +08:00
|
|
|
|
缓存所有路由组件的状态。详细使用方式参考 [Keep Alive 文档](../advanced/keep-alive/#缓存路由组件)。
|
2022-10-25 15:15:25 +08:00
|
|
|
|
|
|
|
|
|
### `<Link />`
|
|
|
|
|
|
2022-11-15 15:03:30 +08:00
|
|
|
|
:::info
|
|
|
|
|
在小程序端 Link 组件底层为原生 `navigator` 组件。
|
|
|
|
|
:::
|
|
|
|
|
|
2022-10-25 15:15:25 +08:00
|
|
|
|
`<Link>` 是 React 组件,用于渲染带路由跳转功能的 `<a>` 元素。
|
|
|
|
|
|
|
|
|
|
```tsx
|
|
|
|
|
import { Link } from 'ice';
|
|
|
|
|
|
|
|
|
|
function Home() {
|
|
|
|
|
const data = useAppData();
|
|
|
|
|
// data 内容为 /api/user 接口返回数据
|
|
|
|
|
return (
|
|
|
|
|
<>
|
|
|
|
|
<h2>Home Page</h2>
|
|
|
|
|
<Link to="/user">user</Link>
|
|
|
|
|
</>
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### `<Outlet />`
|
|
|
|
|
|
2022-11-15 15:03:30 +08:00
|
|
|
|
:::caution
|
|
|
|
|
小程序端不支持该组件。
|
|
|
|
|
:::
|
|
|
|
|
|
2022-10-25 15:15:25 +08:00
|
|
|
|
`<Outlet>` 用于渲染父路由中渲染子路由,通常出现在 `layout.tsx` Layout 组件中。
|
|
|
|
|
|
|
|
|
|
```tsx title="src/layout.tsx"
|
|
|
|
|
|
|
|
|
|
import { Outlet } from 'ice';
|
|
|
|
|
|
|
|
|
|
export default function Layout() {
|
|
|
|
|
return (
|
|
|
|
|
<div>
|
|
|
|
|
<h1>title</h1>
|
|
|
|
|
<Outlet />
|
|
|
|
|
</div>
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### AppConfig
|
|
|
|
|
|
|
|
|
|
AppConfig 是 TS 类型定义,用于获取框架配置类型。
|
|
|
|
|
|
|
|
|
|
```ts
|
|
|
|
|
import type { AppConfig } from 'ice';
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
:::caution
|
|
|
|
|
|
|
|
|
|
推荐通过 [defineAppConfig](./api#defineappconfig) 的方式在入口定义应用类型,如果涉及到类型拓展和泛型的应用可以通过上述方式导入该类型。
|
|
|
|
|
:::
|
|
|
|
|
|
|
|
|
|
### RouteConfig
|
|
|
|
|
|
|
|
|
|
RouteConfig 是 TS 类型定义,用于获取路由配置类型。
|
|
|
|
|
|
|
|
|
|
```ts
|
|
|
|
|
import type { RouteConfig } from 'ice';
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
:::caution
|
|
|
|
|
|
2022-11-11 11:02:51 +08:00
|
|
|
|
推荐通过 [definePageConfig](./api#definepageconfig) 的方式在路由组件中定义类型,如果涉及到类型拓展和泛型的应用可以通过上述方式导入该类型。
|
2022-10-25 15:15:25 +08:00
|
|
|
|
:::
|
|
|
|
|
|
|
|
|
|
### Document 组件
|
|
|
|
|
|
2022-11-15 15:03:30 +08:00
|
|
|
|
:::caution
|
|
|
|
|
小程序端不支持该组件。
|
|
|
|
|
:::
|
|
|
|
|
`Meta`、`Title`、`Links`、`Scripts` 和 `Main` 组件仅支持在 `src/document.tsx` 中使用,使用场景参考 [Document 文档](./document)
|
2022-10-25 15:15:25 +08:00
|
|
|
|
|