Selectors

通过在 Model 中定义 selectors,我们能够生成 Container 的 getters 并推断其值的类型。

note

我们默认你已拥有 Reselect 的相关知识。

基本

在 Redux 中,对于衍生数据我们应当通过计算得到。selector 定义了如何从来源数据计算衍生数据。

你可以在 selector 中使用各种各样的来源数据,例如 this.statethis.getters 以及 this.getContainer(Model).state 等等。

const Model = createModel(
class extends ModelBase {
public initialState() {
return {
name: "Nyax",
};
}
public selectors() {
return {
year: () => 2020,
text: () => `${this.state.name}@${this.getters.year}`,
};
}
}
);
const container = getContainer(Model);
container.getters.text; // "Nyax@2020"

记忆化

对于复杂计算,我们应当缓存其结果,当下次访问时如果其依赖数据没有改变则直接返回缓存值。

我们使用 createSelector 对复杂计算进行记忆化。

note

请使用 Nyax 包提供的 createSelector 函数。Reselect 包中的 createSelector 函数与 Nyax 不兼容。

info

TypeScript 在类型推断时可能会对循环引用报错。(例如访问 this.getters 的内容)

当出现类型推断报错时,你需要显式定义对应的类型。此时 TypeScript 会检查定义类型和推断类型是否相容。

const Model = createModel(
class extends ModelBase {
public initialState() {
return {
size: 233333,
};
}
public selectors() {
return {
numArr: createSelector(
() => this.state.size,
(size) => new Array(size).fill(0).map((_, index) => index)
),
strArr: createSelector(
(): number[] => this.getters.numArr, // define `number[]` type explicitly
(range) => range.map((num) => "" + num)
),
};
}
}
);
const container = getContainer(Model);
container.getters.strArr; // ["0", "1", "2", ...]