Учебник по настройке

Это краткая инструкция по настройке tsx-control-statements, фантастического пакета от Константина Симеонова.

Я предпочитаю операторы управления TSX вместо renderX или встроенного потока управления, потому что считаю их более декларативными и, следовательно, более легкими для чтения. Например:

const List = ({ children }: any) => <div>{children}</div>;
const Item = ({ children }: any) => <p>{children}</p>;
const items = [
{ id: 1, name: 'Alex' },
{ id: 2, name: 'Dave' },
{ id: 3, name: 'Tom' },
];
const Example = () => (
<List>
{items &&
items.map((item, i) => (
<Item key={item.id}>
{i}: {item.name}
</Item>
))}
</List>
);

Можно заменить на:

const Example2 = () => (
<List>
<If condition={!!items}>
<For
of={items}
body={(item, i) => (
<Item key={item.id}>
{i}: {item.name}
</Item>
)}
/>
</If>
</List>
);

Короче говоря, операторы управления TSX позволяют мне указать, как я хотел бы, чтобы мои данные отображались, и он позаботится о реализации за меня.

Я нашел документацию по настройке с помощью Webpack и ts-loader немного неясной и непоследовательной, поэтому вот руководство для идиотов по его настройке.

Установить

yarn add -ED tsx-control-statements

-E относится к точной версии, чтобы избежать серьезных изменений в будущем.

-D, как вы все знаете, относится к devDependencies.

Конфигурация веб-пакета

Сначала потребуйте statements в свой файл webpack.config.js:

const statements = require('tsx-control-statements').default

Затем под ts-loader добавьте следующий объект options:

options: {
getCustomTransformers: () => ({
before: [statements()],
}),
},

Все ваше правило .tsx? должно выглядеть так (используйте loader, если у вас есть один загрузчик, и use, когда у вас несколько/массив загрузчиков):

rules: [
{
test: /\.tsx?$/,
loader: 'ts-loader',
options: {
getCustomTransformers: () => ({
before: [statements()],
}),
},
exclude: /node_modules/,
}
]

Теперь вы готовы использовать пакет в своем проекте React, например:

import { If } from 'tsx-control-statements/components';
const Loading = (loading: boolean) => (
<p>
<If condition={loading}>
Loading!!!
</If>
<If condition={!loading}>
Not Loading!!!
</If>
</p>
)

Надеюсь, это помогло.