介绍
Dojo 的中间件系统提供了一种以响应式方式管理异步或命令式 API 的方法,以及影响任何组合的基于函数的小部件或其他中间件的行为和属性 API。
框架提供了几个核心和可选的中间件,但是应用程序开发人员可以轻松地编写自己的中间件。
功能 | 描述 |
---|---|
响应式 DOM 访问 | 通过中间件,基于函数的小部件可以与对应于其输出节点的 DOM 部分的具体信息和 API 进行交互。 |
小部件渲染生命周期控制 | 中间件可以控制 Dojo 渲染管道的任何组合小部件的部分,例如在小部件需要渲染更新时使它们失效。小部件渲染也可以暂停和恢复,允许在等待关键信息变得可用时短路渲染输出。 |
各种框架提供的中间件 | Dojo 提供可选的中间件,允许小部件实现一系列功能,例如响应和控制焦点、简单值缓存、响应元素交叉和调整大小事件、CSS 主题、国际化和构建时渲染等。 |
轻松组合和重用 | 中间件设计与基于函数的小部件紧密结合,允许在小部件层次结构中进行一致的组合,以及在开发自定义中间件时进行重用。 |
基本用法
创建中间件
- 使用与定义基于函数的小部件相同的
create()
原语来定义中间件 - 可以选择定义一个属性接口,该接口会增强组合中间件的小部件的属性接口。属性值在创建组合小部件的实例时给出。
- 返回一个简单的函数引用,该函数定义了中间件的 API,其他组合的小部件或中间件可以与之交互
src/middleware/myMiddleware.ts
import { create } from '@dojo/framework/core/vdom';
const factory = create().properties<{ middlewareProp?: boolean }>();
export const myMiddleware = factory(({ properties }) => {
return () => {
return properties().middlewareProp ? 'Conditional is true' : 'Conditional is false';
};
});
export default myMiddleware;
组合中间件
- 组合中间件并返回一个对象以公开更复杂的 API
- 使用核心
invalidator
中间件将组合的小部件标记为需要重新渲染
src/middleware/myComposingMiddleware.ts
import { create, invalidator } from '@dojo/framework/core/vdom';
import myMiddleware from './myMiddleware';
const factory = create({ myMiddleware, invalidator });
export const myComposingMiddleware = factory(({ middleware: { myMiddleware, invalidator } }) => {
return {
get() {
return myMiddleware();
},
set() {
invalidator();
}
};
});
export default myComposingMiddleware;
在小部件中使用中间件
- 使用任何使用的中间件的附加属性来增强小部件的属性接口
- 在使用组合它们的小部件时传入中间件属性
src/widgets/MyWidget.tsx
import { create, tsx } from '@dojo/framework/core/vdom';
import myComposingMiddleware from '../middleware/myComposingMiddleware';
const factory = create({ myComposingMiddleware });
export default factory(function MyWidget({ properties, middleware: { myComposingMiddleware } }) {
return (
<virtual>
<div>{`Middleware property value: ${properties.middlewareProp}`}</div>
<div>{`Middleware usage: ${myComposingMiddleware.get()}`}</div>
</virtual>
);
});
src/main.tsx
import renderer, { tsx } from '@dojo/framework/core/vdom';
import MyWidget from './widgets/MyWidget';
const r = renderer(() => <MyWidget middlewareProp={true} />);
r.mount();