搜索词
jsx
, jsxFactory
, transformer
建议
允许利用JSX生成过程来控制使用--jsxFactory
时的React.createElement
输出格式。
用例
以thunk形式发出组件子元素
对于通过JSX组件层次结构附加依赖跟踪的响应式框架很有用。
内部createJsxFactoryExpression()调用的LHS使用--jsxFactory
编译器选项进行控制:
// jsx
<div>
<div>a</div>
<div>b</div>
</div>
// current emit (jsxFactory: "h")
h('div', null,
h('div', null, 'a'),
h('div', null, 'b')
)
这会产生一个嵌套的React.createElement()
/h()
链,该链会立即求值。
使用(仍然同步)thunks,框架可以在遍历树时跟踪每个组件依赖项,以进行细粒度的更改检测:
// thunks (needs transformer)
h('div', null, () => [
h('div', null, () => ['a']),
h('div', null, () => ['b'])
])
这需要递归地将JSX发射转换为接受一些参数作为thunk的h()
签名。
我为此编写了一个hacky(#16607)转换器,但不得不从TypeScript编译器中提取大部分与JSX相关的内部内容,而对createExpressionForJsxElement()的更改是微不足道的:
const cs = argumentsList.slice(2);
const argThunk = ts.createArrowFunction(
[],
[],
[],
undefined,
undefined,
ts.createArrayLiteral(cs)
);
const thunkified = [...argumentsList.slice(0, 2), argThunk];
根据#34547,已经在进行计划,将嵌套组件参数作为数组而不是可变参数传递。指定jsxFactory
意味着我们假设控制组合行为;我们还应该控制函数签名。
1条答案
按热度按时间hpxqektj1#
如果你通过API托管编译器,你已经可以编写一个自定义的emit步骤来实现这个功能。我们需要知道一个相当流行的基于JSX的框架的名称,以便将其作为内置选项。