createFactory
Цей API буде видалено в наступному старшому релізі React. Дивіться альтернативи.
createFactory
дозволяє створити функцію, яка створює React-елементи заданого типу.
const factory = createFactory(type)
Довідник
createFactory(type)
Виклик createFactory(type)
для створення фабричної функції, яка створює React-елементи заданого типу
.
import { createFactory } from 'react';
const button = createFactory('button');
Тоді ви зможете використовувати його для створення React-елементів без JSX:
export default function App() {
return button({
onClick: () => {
alert('Clicked!')
}
}, 'Click me');
}
Дивіться більше прикладів нижче.
Параметри
type
: Аргументtype
повинен бути допустимим типом React-компонента. Наприклад, це може бути рядок імені тегу (наприклад,'div'
або'span'
) або React-компонент (функція, клас або спеціальний компонент, якFragment
).
Повернення
Повертає заводську функцію. Ця фабрична функція отримує об'єкт props
як перший аргумент, за яким слідує список ...children
аргументів, і повертає React-елемент із заданими type
, props
і children
.
Використання
Створення React-елементів за допомогою фабрики
Хоча більшість проектів React використовують JSX для опису інтерфейсу користувача, JSX не є обов'язковим. Раніше createFactory
був одним зі способів опису інтерфейсу користувача без JSX.
Викличте createFactory
, щоб створити фабричну функцію для певного типу елемента, наприклад 'button'
:
import { createFactory } from 'react';
const button = createFactory('button');
Виклик цієї фабричної функції створить React-елементи з наданими вами пропсами та дочірніми елементами:
import { createFactory } from 'react';
const button = createFactory('button');
export default function App() {
return button({
onClick: () => {
alert('Clicked!')
}
}, 'Click me');
}
Таким чином createFactory
було використано як альтернативу JSX. Однак, createFactory
є застарілим, і вам не слід викликати createFactory
у будь-якому новому коді. Нижче описано, як відмовитися від використання createFactory
.
Альтернативи
Копіювання createFactory
до вашого проекту
Якщо у вашому проекті багато createFactory
викликів, скопіюйте цю createFactory.js
реалізацію до вашого проекту:
import { createFactory } from './createFactory.js';
const button = createFactory('button');
export default function App() {
return button({
onClick: () => {
alert('Clicked!')
}
}, 'Click me');
}
import { createElement } from 'react';
export function createFactory(type) {
return createElement.bind(null, type);
}
Це дозволить вам зберегти весь ваш код незмінним, окрім імпорту.
Заміна createFactory
на createElement
Якщо у вас є кілька викликів createFactory
, які ви не проти перенести вручну, і ви не хочете використовувати JSX, ви можете замінити кожен виклик заводської функції викликом createElement
. Наприклад, ви можете замінити цей код:
import { createFactory } from 'react';
const button = createFactory('button');
export default function App() {
return button({
onClick: () => {
alert('Clicked!')
}
}, 'Click me');
}
з цим кодом:
import { createElement } from 'react';
export default function App() {
return createElement('button', {
onClick: () => {
alert('Clicked!')
}
}, 'Click me');
}
Повний приклад використання React без JSX:
import { createElement } from 'react';
export default function App() {
return createElement('button', {
onClick: () => {
alert('Clicked!')
}
}, 'Click me');
}
Замінено createFactory
на JSX
Нарешті, ви можете використовувати JSX замість createFactory
. Це найпоширеніший спосіб використання React:
export default function App() {
return (
<button onClick={() => {
alert('Clicked!');
}}>
Click me
</button>
);
};
Іноді ваш наявний код може передавати деяку змінну як тип
замість константи типу 'button'
:
function Heading({ isSubheading, ...props }) {
const type = isSubheading ? 'h2' : 'h1';
const factory = createFactory(type);
return factory(props);
}
Щоб зробити те саме у JSX, вам потрібно перейменувати вашу змінну, щоб вона починалася з великої літери, наприклад Type
:
function Heading({ isSubheading, ...props }) {
const Type = isSubheading ? 'h2' : 'h1';
return <Type {...props} />;
}
Інакше React інтерпретує <type>
як вбудований HTML-тег, оскільки він записаний у нижньому регістрі.