跳到主要内容

v0.10:一致的 null 处理、URL 工具函数

· 阅读需 4 分钟
Nathaniel Tucker
Creator of Reactive Data Client

本次发布聚焦于一致性和可扩展性。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);
}
}
迁移指南

破坏性变更:

其他改进:

一致的 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 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

数组中的 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 类型的行为统一。

升级支持​

一如往常,如果你遇到任何问题或有疑问,欢迎加入我们的 Chat 或提交 bug