v0.10:一致的 null 处理、URL 工具函数
· 阅读需 4 分钟
本次发布聚焦于一致性和可扩展性。null 处理现在在所有 schema 类型中保持统一,使数据转换更可预测。新的 URL 工具函数支持自定义 URL 构造和搜索参数编码。
class MyEndpoint<O extends RestGenerics = any> extends RestEndpoint<O> {
searchToString(searchParams) {
// Use qs library for complex nested object encoding
return qs.stringify(searchParams);
}
}
破坏性变更:
其他改进:
- RestEndpoint.searchToString() 用于自定义搜索参数编码
- 导出 getUrlBase、getUrlTokens 用于自定义 URL 构造
- 修复 DevToolsManager 内存泄漏
一致的 null 处理
null 值现在在所有 schema 类型中都会被一致地保留。之前,[] 简写和 schema.Array
在遇到 null 值时的行为并不相同。#2912
[]和 schema.Array 现在行为完全一致null值在所有地方都会被保留(在嵌套 Entity 中原本就会保留)undefined值仍然会被过滤掉
对于那些显式返回 null 表示数据不存在、而用 undefined 表示字段缺失的 API,这一变更确保了更可预测的行为。
URL 工具函数
RestEndpoint.searchToString()
RestEndpoint.searchToString() 支持对搜索参数进行自定义编码。这对于期望在查询字符串中接收复杂嵌套对象的 API 尤其有用。 #2919
例如,使用 qs 库来编码复杂对象:
import { RestEndpoint, RestGenerics } from '@data-client/rest';
import qs from 'qs';
class MyEndpoint<O extends RestGenerics = any> extends RestEndpoint<O> {
searchToString(searchParams) {
return qs.stringify(searchParams);
}
}
getUrlBase、getUrlTokens
新导出的 getUrlBase 和 getUrlTokens 为自定义
RestEndpoint.url() 实现提供了基础构件。
#2919
import { getUrlBase, getUrlTokens } from '@data-client/rest';
// Parse path tokens for custom URL logic
const tokens = getUrlTokens('/users/:id/posts/:postId');
// => ['id', 'postId']
// Get base URL without path parameters
const base = getUrlBase('/users/:id');
// => '/users/'
DevToolsManager 内存修复
DevToolsManager 的 action 缓冲区现在限制为 100 条,防止长时间运行或频繁更新的应用出现内存泄漏。4e6a39e
迁移指南
本次升级需要同时更新所有包的版本。
- NPM
- Yarn
- pnpm
- esm.sh
npm install --save @data-client/react@^0.10.0 @data-client/rest@^0.10.0 @data-client/test@^0.10.0 @data-client/img@^0.10.0
yarn add @data-client/react@^0.10.0 @data-client/rest@^0.10.0 @data-client/test@^0.10.0 @data-client/img@^0.10.0
pnpm add @data-client/react@^0.10.0 @data-client/rest@^0.10.0 @data-client/test@^0.10.0 @data-client/img@^0.10.0
<script type="importmap">
{
"imports": {
"@data-client/react": "https://esm.sh/@data-client/react@^0.10.0",
"@data-client/rest": "https://esm.sh/@data-client/rest@^0.10.0",
"@data-client/test": "https://esm.sh/@data-client/test@^0.10.0",
"@data-client/img": "https://esm.sh/@data-client/img@^0.10.0"
}
}
</script>
数组中的 null 值
如果你的代码依赖于 null 值被从数组中过滤掉,现在需要显式处理:
Before
import { Entity, schema, RestEndpoint } from '@data-client/rest';
class User extends Entity {
id = '';
name = '';
pk() { return this.id; }
}
const getUsers = new RestEndpoint({
path: '/users',
schema: new schema.Array(User),
});
// API response: [{ id: '1' }, null, { id: '2' }]
const usersWithoutNull = useSuspense(getUsers);
After
import { Entity, schema, RestEndpoint } from '@data-client/rest';
class User extends Entity {
id = '';
name = '';
pk() { return this.id; }
}
const getUsers = new RestEndpoint({
path: '/users',
schema: new schema.Array(User),
});
// API response: [{ id: '1' }, null, { id: '2' }]
const usersWithoutNull = useSuspense(getUsers).filter(Boolean);
这一变更与嵌套 Entity 原有的 null 处理方式保持一致,使所有 schema 类型的行为统一。
升级支持
一如往常,如果你遇到任何问题或有疑问,欢迎加入我们的 或提交 bug
