κΈ°λ³Έ μ¬μ©λ² (Basic usage)
as μ°μ°μ (The as operator)
- λ΄μ₯ μμ (Intrinsic elements)
- κ°-κΈ°λ° μμ (Value-based elements)
- ν¨μν μ»΄ν¬λνΈ (Function Component)
- ν΄λμ€ν μ»΄ν¬λνΈ (Class Component)
- μμ± νμ κ²μ¬ (Attribute type checking)
- μμ νμ κ²μ¬ (Children Type Checking)
JSX κ²°κ³Ό νμ (The JSX result type)
ννμ ν¬ν¨νκΈ° (Embedding Expressions)
리μ‘νΈμ ν΅ν©νκΈ° (React integration)
ν©ν 리 ν¨μ (Factory Functions)
JSXλ λ΄μ₯ν XML κ°μ ꡬ문μ λλ€. λ³νμ μλ―Έλ ꡬνμ λ°λΌ λ€λ₯΄μ§λ§ μ ν¨ν JavaScriptλ‘ λ³νλμ΄μΌ ν©λλ€. JSXλ Reactλ‘ ν° μΈκΈ°λ₯Ό μ»μμ§λ§, μ΄ν λ€λ₯Έ ꡬνλ λ±μ₯νμ΅λλ€. TypeScriptλ μλ² λ©, νμ κ²μ¬, JSXλ₯Ό JavaScriptλ‘ μ§μ μ»΄νμΌνλ κ²μ μ§μν©λλ€.
JSXλ₯Ό μ¬μ©νλ €λ©΄ λ€μ λ κ°μ§ μμ μ ν΄μΌ ν©λλ€.
- νμΌ μ΄λ¦μ
.tsx
νμ₯μλ‘ μ§μ ν©λλ€. jsx
μ΅μ μ νμ±νν©λλ€.
TypeScriptλ preserve
, react
λ° react-native
λΌλ μΈ κ°μ§μ JSX λͺ¨λμ ν¨κ» μ 곡λ©λλ€.
μ΄ λͺ¨λλ€μ λ°©μΆ λ¨κ³μμλ§ μν₯μ λ―ΈμΉλ©°, νμ
κ²μ¬μλ μν₯μ λ°μ§ μμ΅λλ€.
preserve
λͺ¨λλ λ€λ₯Έ λ³ν λ¨κ³(μ: Babel)μ μ¬μ©νλλ‘ κ²°κ³Όλ¬Όμ μΌλΆλ₯Ό μ μ§ν©λλ€.
λν κ²°κ³Όλ¬Όμ .jsx
νμΌ νμ₯μλ₯Ό κ°μ΅λλ€.
react
λͺ¨λλ React.createElement
λ₯Ό μμ±νμ¬, μ¬μ©νκΈ° μ μ JSX λ³νμ΄ νμνμ§ μμΌλ©°, κ²°κ³Όλ¬Όμ .js
νμ₯μλ₯Ό κ°κ² λ©λλ€.
react-native
λͺ¨λλ JSXλ₯Ό μ μ§νλ€λ μ μ preserve
λͺ¨λμ λμΌνμ§λ§, κ²°κ³Όλ¬Όμ .js
νμ₯μλ₯Ό κ°κ² λλ€λ μ μ΄ λ€λ¦
λλ€.
λͺ¨λ | μ λ ₯ | κ²°κ³Ό | κ²°κ³Ό νμΌ νμ₯μ |
---|---|---|---|
preserve |
<div /> |
<div /> |
.jsx |
react |
<div /> |
React.createElement("div") |
.js |
react-native |
<div /> |
<div /> |
.js |
--jsx
λͺ
λ Ήμ€ νλκ·Έ λλ tsconfig.json νμΌμ ν΄λΉ μ΅μ
μ μ¬μ©νμ¬ λͺ¨λλ₯Ό μ§μ ν μ μμ΅λλ€.
*μ°Έκ³ : React JSXλ₯Ό μμ±ν λ
--jsxFactory
μ΅μ μΌλ‘ μ¬μ©ν JSX ν©ν 리(JSX factory) ν¨μλ₯Ό μ§μ ν μ μμ΅λλ€ (κΈ°λ³Έκ°μReact.createElement
)
νμ λ¨μΈ(type assertion)μ μ΄λ»κ² μμ±νλμ§ λ μ¬λ € λ³ΌκΉμ:
var foo = <foo>bar;
μ μ½λλ λ³μ bar
κ° foo
νμ
μ΄λΌλ κ²μ λ¨μΈν©λλ€.
TypeScriptλ κΊΎμ κ΄νΈλ₯Ό μ¬μ©ν΄ νμ
μ λ¨μΈνκΈ° λλ¬Έμ, JSX ꡬ문과 ν¨κ» μ¬μ©ν κ²½μ° νΉμ λ¬Έλ² ν΄μμ λ¬Έμ κ° λ μλ μμ΅λλ€. κ²°κ³Όμ μΌλ‘ TypeScriptλ .tsx
νμΌμμ νμ΄ κ΄νΈλ₯Ό ν΅ν νμ
λ¨μΈμ νμ©νμ§ μμ΅λλ€.
μμ ꡬ문μ .tsx
νμΌμμ μ¬μ©ν μ μμΌλ―λ‘, as
λΌλ λ체 μ°μ°μλ₯Ό ν΅ν΄ νμ
λ¨μΈμ ν΄μΌ ν©λλ€.
μμ μμλ as
μ°μ°μλ‘ μ½κ² λ€μ μμ±ν μ μμ΅λλ€.
var foo = bar as foo;
as
μ°μ°μλ .ts
μ .tsx
νμΌ λͺ¨λ μ¬μ©ν μ μμΌλ©°, κΊΎμ κ΄νΈ νμμ λ¨μΈκ³Ό λμΌνκ² λμν©λλ€.
JSXμ νμ
κ²μ¬λ₯Ό μ΄ν΄νκΈ° μν΄μ , λ¨Όμ λ΄μ₯ μμμ κ°-κΈ°λ° μμμ μ°¨μ΄μ μ λν΄ μμμΌ ν©λλ€.
JSX ννμ <expr />
μμ expr
μ νκ²½μ λ΄μ₯λ μμ(μ: DOM νκ²½μ div
λλ span
) νΉμ μ¬μ©μκ° λ§λ μ¬μ©μ μ μ μ»΄ν¬λνΈλ₯Ό μ°Έμ‘°ν κ²μ
λλ€.
μ΄λ λ€μκ³Ό κ°μ λ κ°μ§ μ΄μ λ‘ μ€μν©λλ€:
- 리μ‘νΈμμ λ΄μ₯ μμλ
React.createElement("div")
κ³Ό κ°μ λ¬Έμμ΄λ‘ μμ±λλ λ°λ©΄, μ¬μ©μκ° λ§λ μ»΄ν¬λνΈλReact.createElement("MyComponent")
κ° μλλλ€. - JSX μμμ μ λ¬λλ μμ±μ νμ μ λ€λ₯΄κ² μ‘°νλμ΄μΌ ν©λλ€. λ΄μ₯ μμμ μμ±μ λ΄μ¬μ μΌλ‘ μκ³ μμ΄μΌ νμ§λ§, μ»΄ν¬λνΈλ κ°κ° μμ μ μμ± μ§ν©μ μ§μ νλ €κ³ ν©λλ€.
TypeScriptλ Reactμ λμΌν κ·μΉμ μ¬μ©νμ¬ κ΅¬λ³ν©λλ€. λ΄μ₯ μμλ νμ μλ¬Έμλ‘ μμνκ³ κ°-κΈ°λ° μμλ νμ λλ¬Έμλ‘ μμν©λλ€.
λ΄μ₯ μμλ νΉμ μΈν°νμ΄μ€ JSX.IntrinsicElements
μμ μ‘°νλ©λλ€.
κΈ°λ³Έμ μΌλ‘ μ΄ μΈν°νμ΄μ€κ° μ§μ λμ§ μμΌλ©΄ κ·Έλλ‘ μ§νλμ΄ λ΄μ₯ μμ νμ
μ κ²μ¬λμ§ μμ΅λλ€.
κ·Έλ¬λ μ΄ μΈν°νμ΄μ€κ° μλ κ²½μ°, λ΄μ₯ μμμ μ΄λ¦μ JSX.IntrinsicElements
μΈν°νμ΄μ€μ νλ‘νΌν°λ‘ μ‘°νλ©λλ€.
μλ₯Ό λ€μ΄:
declare namespace JSX {
interface IntrinsicElements {
foo: any
}
}
<foo />; // μ±κ³΅
<bar />; // μ€λ₯
μμ μμ μμ <foo />
λ μ λμνμ§λ§, <bar />
λ JSX.IntrinsicElements
μ μ§μ λμ§ μμκΈ° λλ¬Έμ μ€λ₯λ₯Ό μΌμΌν΅λλ€.
μ°Έκ³ : λ€μκ³Ό κ°μ΄
JSX.IntrinsicElements
μ catch-all λ¬Έμμ΄ μΈλ±μλ₯Ό μ§μ ν μλ μμ΅λλ€.
declare namespace JSX {
interface IntrinsicElements {
[elemName: string]: any;
}
}
κ°-κΈ°λ° μμλ ν΄λΉ μ€μ½νμ μλ μλ³μλ‘ κ°λ¨νκ² μ‘°νλ©λλ€.
import MyComponent from "./myComponent";
<MyComponent />; // μ±κ³΅
<SomeOtherComponent />; // μ€λ₯
κ°-κΈ°λ° μμλ₯Ό μ μνλλ°μ λ€μμ λ κ°μ§ λ°©λ²μ΄ μμ΅λλ€:
- ν¨μν μ»΄ν¬λνΈ (FC)
- ν΄λμ€ν μ»΄ν¬λνΈ
μ΄ λ κ°μ§ μ νμ κ°-κΈ°λ° μμλ JSX ννμμμ μλ‘ κ΅¬λ³ν μ μμΌλ―λ‘, TSλ κ³ΌλΆν ν΄κ²°μ μ¬μ©νμ¬ λ¨Όμ ν¨μν μ»΄ν¬λνΈ ννμμΌλ‘ ν΄μν©λλ€. μ΄ κ³Όμ μ΄ μ±κ³΅μ μΌλ‘ μ§νλλ©΄, TSλ μ΄ μ μΈμ ννμμΌλ‘ ν΄μν©λλ€. ν¨μν μ»΄ν¬λνΈλ‘ ν΄μλμ§ μλλ€λ©΄, TSλ ν΄λμ€ν μ»΄ν¬λνΈλ‘ ν΄μμ μλν©λλ€. μ΄ κ³Όμ λ μ€ν¨ν κ²½μ°, TSλ μ€λ₯λ₯Ό λ³΄κ³ ν©λλ€.
μ΄λ¦μμ μ μ μλ―, μ»΄ν¬λνΈλ 첫 λ²μ§Έ μΈμκ° props
κ°μ²΄μΈ JavaScript ν¨μλ‘ μ μλ©λλ€.
TSλ μ»΄ν¬λνΈμ λ°ν νμ
μ΄ JSX.Element
μ ν λΉ κ°λ₯νλλ‘ μꡬν©λλ€.
interface FooProp {
name: string;
X: number;
Y: number;
}
declare function AnotherComponent(prop: {name: string});
function ComponentFoo(prop: FooProp) {
return <AnotherComponent name={prop.name} />;
}
const Button = (prop: {value: string}, context: { color: string }) => <button>
ν¨μν μ»΄ν¬λνΈλ JavaScript ν¨μμ΄λ―λ‘, ν¨μ μ€λ²λ‘λ λν μ¬μ© κ°λ₯ν©λλ€:
interface ClickableProps {
children: JSX.Element[] | JSX.Element
}
interface HomeProps extends ClickableProps {
home: JSX.Element;
}
interface SideProps extends ClickableProps {
side: JSX.Element | string;
}
function MainButton(prop: HomeProps): JSX.Element;
function MainButton(prop: SideProps): JSX.Element {
...
}
μ°Έκ³ : ν¨μν μ»΄ν¬λνΈλ μ΄μ μ 무μν ν¨μν μ»΄ν¬λνΈ(SFC)λ‘ μλ €μ Έ μμ΅λλ€. νμ§λ§ μ΅κ·Ό λ²μ μ 리μ‘νΈμμ λ μ΄μ ν¨μν μ»΄ν¬λνΈλ₯Ό 무μνλ‘ μ·¨κΈνμ§ μμΌλ©°,
SFC
νμ κ³Ό κ·Έ λ³μΉμΈStatelessComponent
μ λ μ΄μ μ¬μ©λμ§ μμ΅λλ€.
ν΄λμ€ν μ»΄ν¬λνΈμ νμ μ μ μνλ κ²μ κ°λ₯ν©λλ€. μ΄λ₯Ό μν΄μ μμ ν΄λμ€ νμ κ³Ό μμ μΈμ€ν΄μ€ νμ μ΄λΌλ μλ‘μ΄ μ©μ΄λ₯Ό μ΄ν΄ν΄μΌ ν©λλ€.
<Expr />
μμ, μμ ν΄λμ€ νμ
μ Expr
μ νμ
μ
λλ€.
μμ μμμμ MyComponent
κ° ES6 ν΄λμ€λΌλ©΄ μ΄ ν΄λμ€ νμ
μ ν΄λμ€ μμ±μμ΄κ³ μ μμ
λλ€.
MyComponent
κ° ν©ν 리 ν¨μλΌλ©΄, ν΄λμ€ νμ
μ ν΄λΉ ν¨μμ
λλ€.
ν΄λμ€ νμ μ΄ κ²°μ λλ©΄, μΈμ€ν΄μ€ νμ μ ν΄λμ€ νμ μ μμ±μ νΉμ νΈμΆ μκ·Έλμ²(μλ κ² μ€ μ΄λ μͺ½μΌλ‘λ )μ μν λ°ν νμ μ κ²°ν©νμ¬ κ²°μ λ©λλ€. λ°λΌμ ES6 ν΄λμ€μ κ²½μ°, μΈμ€ν΄μ€ νμ μ ν΄λΉ ν΄λμ€μ μΈμ€ν΄μ€ νμ μ΄ λκ³ , ν©ν 리 ν¨μμ κ²½μ°μ ν΄λΉ ν¨μλ‘λΆν° λ°νλ κ°μ νμ μ΄ λ©λλ€.
class MyComponent {
render() {}
}
// μμ±μ μκ·Έλμ² μ¬μ©
var myComponent = new MyComponent();
// μμ ν΄λμ€ νμ
=> MyComponent
// μμ μΈμ€ν΄μ€ νμ
=> { render: () => void }
function MyFactoryFunction() {
return {
render: () => {
}
}
}
// νΈμΆ μκ·Έλμ² μ¬μ©
var myComponent = MyFactoryFunction();
// μμ ν΄λμ€ νμ
=> MyFactoryFunction
// μμ μΈμ€ν΄μ€ νμ
=> { render: () => void }
ν₯λ―Έλ‘κ²λ μμ μΈμ€ν΄μ€ νμ
μ JSX.ElementClass
μ ν λΉ κ°λ₯ν΄μΌ νλ©°, κ·Έλ μ§ μμ κ²½μ° μ€λ₯λ₯Ό μΌμΌν΅λλ€.
κΈ°λ³Έμ μΌλ‘ JSX.ElementClass
λ {}
μ΄μ§λ§, μ μ ν μΈν°νμ΄μ€μ μ ν©ν νμ
μΌλ‘λ§ JSXλ₯Ό μ¬μ©νλλ‘ μ νν μ μμ΅λλ€.
declare namespace JSX {
interface ElementClass {
render: any;
}
}
class MyComponent {
render() {}
}
function MyFactoryFunction() {
return { render: () => {} }
}
<MyComponent />; // μ±κ³΅
<MyFactoryFunction />; // μ±κ³΅
class NotAValidComponent {}
function NotAValidFactoryFunction() {
return {};
}
<NotAValidComponent />; // μ€λ₯
<NotAValidFactoryFunction />; // μ€λ₯
μμ± νμ κ²μ¬λ₯Ό μν΄μ 첫 λ²μ§Έλ‘ μμ μμ± νμ μ κ²°μ ν΄μΌ ν©λλ€. μ΄λ λ΄μ₯ μμμ κ°-κΈ°λ° μμ κ°μ μ½κ° λ€λ₯Έ μ μ΄ μμ΅λλ€.
λ΄μ₯ μμμ κ²½μ°, μμ μμ± νμ
μ JSX.IntrinsicElements
μ νλ‘νΌν° νμ
κ³Ό λμΌν©λλ€.
declare namespace JSX {
interface IntrinsicElements {
foo: { bar?: boolean }
}
}
// 'foo'μ μμ μμ± νμ
μ '{bar?: boolean}'
<foo bar />;
κ°-κΈ°λ° μμμ κ²½μ°μ μ‘°κΈ λ 볡μ‘ν©λλ€.
μ΄μ μ μμ μΈμ€ν΄μ€ νμ
μ νλ‘νΌν° νμ
μ λ°λΌ κ²°μ λ©λλ€.
μ¬μ©ν νλ‘νΌν°λ JSX.ElementAttributesProperty
μ λ°λΌ κ²°μ λ©λλ€.
μ΄λ λ¨μΌ νλ‘νΌν°λ‘ μ μΈλμ΄μΌ ν©λλ€.
μ΄ν ν΄λΉ νλ‘νΌν° μ΄λ¦μ μ¬μ©ν©λλ€.
TypeScript 2.8 λΆν° JSX.ElementAttributesProperty
κ° μ 곡λμ§ μμΌλ©΄, ν΄λμ€ μμμ μμ±μ λλ ν¨μν μ»΄ν¬λνΈμ 첫 λ²μ§Έ 맀κ°λ³μ νμ
μ λμ μ¬μ©ν μ μμ΅λλ€.
declare namespace JSX {
interface ElementAttributesProperty {
props; // μ¬μ©ν νλ‘νΌν° μ΄λ¦μ μ§μ
}
}
class MyComponent {
// μμ μΈμ€ν΄μ€ νμ
μ νλ‘νΌν°λ₯Ό μ§μ
props: {
foo?: string;
}
}
// 'MyComponent'μ μμ μμ± νμ
μ '{foo?: string}'
<MyComponent foo="bar" />
μμ μμ± νμ μ JSXμμ μμ± νμ μ νμΈνλλ° μ¬μ©λ©λλ€. μ νμ νΉμ νμμ μΈ νλ‘νΌν°λ€μ΄ μ§μλ©λλ€.
declare namespace JSX {
interface IntrinsicElements {
foo: { requiredProp: string; optionalProp?: number }
}
}
<foo requiredProp="bar" />; // μ±κ³΅
<foo requiredProp="bar" optionalProp={0} />; // μ±κ³΅
<foo />; // μ€λ₯, requiredPropμ΄ λλ½λ¨
<foo requiredProp={0} />; // μ€λ₯, requiredPropμ λ¬Έμμ΄μ΄μ΄μΌ ν¨
<foo requiredProp="bar" unknownProp />; // μ€λ₯, unknownPropμ μ‘΄μ¬νμ§ μμ
<foo requiredProp="bar" some-unknown-prop />; // μ±κ³΅, 'some-unknown-prop'μ μ ν¨ν μλ³μκ° μλκΈ° λλ¬Έμ
μ°Έκ³ : λ§μ½ μμ± μ΄λ¦μ΄ μ ν¨ν JavaScript μλ³μ(
data-*
μμ± λ±)κ° μλ κ²½μ°, ν΄λΉ μ΄λ¦μ μμ μμ± νμ μμ μ°Ύμ μ μμ΄λ μ€λ₯λ‘ κ°μ£Όνμ§ μμ΅λλ€.
μΆκ°μ μΌλ‘, JSX.IntrinsicAttributes
μΈν°νμ΄μ€λ μΌλ°μ μΌλ‘ μ»΄ν¬λνΈμ propsλ μΈμλ‘ μ¬μ©λμ§ μλ JSX νλ μμν¬λ₯Ό μν μΆκ°μ μΈ νλ‘νΌν°λ₯Ό μ§μ ν μ μμ΅λλ€. - μλ₯Ό λ€λ©΄ Reactμ key
. λ λμκ°μ, JSX.IntrinsicClassAttributes<T>
μ λ€λ¦ νμ
μ μ¬μ©νμ¬ ν΄λμ€ν μ»΄ν¬λνΈμ λν΄ λμΌν μ’
λ₯μ μΆκ° μμ±μ μ§μ ν μ μμ΅λλ€ (ν¨μν μ»΄ν¬λνΈ μ μΈνκ³ ). μ΄ μ νμμ, μ λ€λ¦μ 맀κ°λ³μλ ν΄λμ€ μΈμ€ν΄μ€ νμ
μ ν΄λΉν©λλ€. Reactμ κ²½μ°, μ΄λ Ref<T>
νμ
μ ref
μμ±μ νμ©νλ λ°μ μ°μ
λλ€. μΌλ°μ μΌλ‘λ, JSX νλ μμν¬ μ¬μ©μκ° λͺ¨λ νκ·Έμ νΉμ μμ±μ μ 곡ν νμκ° μλ€λ©΄, μ΄λ° μΈν°νμ΄μ€μ λͺ¨λ νλ‘νΌν°λ μ νμ μ΄μ΄μΌ ν©λλ€.
μ€νλ λ μ°μ°μ λν λμν©λλ€:
var props = { requiredProp: "bar" };
<foo {...props} />; // μ±κ³΅
var badProps = {};
<foo {...badProps} />; // μ€λ₯
TypeScript 2.3λΆν°, TSλ μμ μ νμ
κ²μ¬λ₯Ό λμ
νμ΅λλ€. μμ μ μμ JSX ννμ μ μμ±μ μ½μ
νλ μμ μμ± νμ
μ νΉμν νλ‘νΌν°μ
λλ€.
TSλ JSX.ElementAttributesProperty
λ₯Ό μ¬μ©ν΄ props λ₯Ό κ²°μ νλ κ²κ³Ό μ μ¬νκ², JSX.ElementChildrenAttribute
λ₯Ό μ¬μ©ν΄ ν΄λΉ props λ΄μ μμ μ μ΄λ¦μ κ²°μ ν©λλ€.
JSX.ElementChildrenAttribute
λ λ¨μΌ νλ‘νΌν°λ‘ μ μΈλμ΄μΌ ν©λλ€.
declare namespace JSX {
interface ElementChildrenAttribute {
children: {}; // μ¬μ©ν μμμ μ΄λ¦μ μ§μ
}
}
<div>
<h1>Hello</h1>
</div>;
<div>
<h1>Hello</h1>
World
</div>;
const CustomComp = (props) => <div>{props.children}</div>
<CustomComp>
<div>Hello World</div>
{"This is just a JS expression..." + 1000}
</CustomComp>
λ€λ₯Έ μμ±μ²λΌ μμ μ νμ λ μ§μ ν μ μμ΅λλ€. μλ₯Ό λ€μ΄ React νμ΄ν μ μ¬μ©νλ κ²½μ° κΈ°λ³Έ νμ μ μ€λ²λΌμ΄λ ν κ²μ λλ€.
interface PropsType {
children: JSX.Element
name: string
}
class Component extends React.Component<PropsType, {}> {
render() {
return (
<h2>
{this.props.children}
</h2>
)
}
}
// μ±κ³΅
<Component name="foo">
<h1>Hello World</h1>
</Component>
// μ€λ₯ : μμμ JSX.Elementμ λ°°μ΄μ΄ μλ JSX.Element νμ
μ
λλ€.
<Component name="bar">
<h1>Hello World</h1>
<h2>Hello World</h2>
</Component>
// μ€λ₯ : μμμ JSX.Elementμ λ°°μ΄μ΄λ λ¬Έμμ΄μ΄ μλ JSX.Element νμ
μ
λλ€.
<Component name="baz">
<h1>Hello</h1>
World
</Component>
κΈ°λ³Έμ μΌλ‘ JSX ννμμ κ²°κ³Όλ¬Όμ any
νμ
μ
λλ€.
JSX.Element
μΈν°νμ΄μ€λ₯Ό μμ νμ¬ νΉμ ν νμ
μ μ§μ ν μ μμ΅λλ€.
κ·Έλ¬λ μ΄ μΈν°νμ΄μ€μμλ JSXμ μμ, μμ±, μμμ λν μ 보λ₯Ό κ²μν μ μμ΅λλ€.
μ΄ μΈν°νμ΄μ€λ λΈλλ°μ€μ
λλ€.
JSXλ μ€κ΄νΈ({ }
)λ‘ ννμμ κ°μΈ νκ·Έ μ¬μ΄μ ννμ μ¬μ©μ νμ©ν©λλ€.
var a = <div>
{["foo", "bar"].map(i => <span>{i / 2}</span>)}
</div>
μμ μ½λλ λ¬Έμμ΄μ μ«μλ‘ λλ μ μμΌλ―λ‘ μ€λ₯λ₯Ό μΌμΌν΅λλ€.
preserve
μ΅μ
μ μ¬μ©ν λ, κ²°κ³Όλ λ€μκ³Ό κ°μ΅λλ€:
var a = <div>
{["foo", "bar"].map(function (i) { return <span>{i / 2}</span>; })}
</div>
리μ‘νΈμμ JSXλ₯Ό μ¬μ©νκΈ° μν΄μ React νμ΄νμ μ¬μ©ν΄μΌ ν©λλ€.
μ΄λ 리μ‘νΈλ₯Ό μ¬μ©ν μ μλλ‘ JSX
λ€μμ€νμ΄μ€λ₯Ό μ μ νκ² μ μν©λλ€.
/// <reference path="react.d.ts" />
interface Props {
foo: string;
}
class MyComponent extends React.Component<Props, {}> {
render() {
return <span>{this.props.foo}</span>
}
}
<MyComponent foo="bar" />; // μ±κ³΅
<MyComponent foo={0} />; // μ€λ₯
jsx: react
μ»΄νμΌλ¬ μ΅μ
μμ μ¬μ©νλ ν©ν 리 ν¨μλ μ€μ μ΄ κ°λ₯ν©λλ€. μ΄λ jsxFactory
λͺ
λ Ή μ€ μ΅μ
μ μ¬μ©νκ±°λ μΈλΌμΈ @jsx
μ£Όμμ μ¬μ©νμ¬ νμΌλ³λ‘ μ€μ ν μ μμ΅λλ€. μλ₯Ό λ€μ΄ jsxFactory
μ createElement
λ₯Ό μ€μ νλ€λ©΄, <div />
λ React.createElement("div")
λμ createElement("div")
μΌλ‘ μμ±λ κ²μ
λλ€.
μ£Όμ pragma λ²μ μ λ€μκ³Ό κ°μ΄ μ¬μ©ν μ μμ΅λλ€ (TypeScript 2.8 κΈ°μ€):
import preact = require("preact");
/* @jsx preact.h */
const x = <div />;
μ΄λ λ€μμ²λΌ μμ±λ©λλ€:
const preact = require("preact");
const x = preact.h("div", null);
μ νλ ν©ν 리λ μ μ λ€μμ€νμ΄μ€λ‘ λμκ°κΈ° μ μ JSX
λ€μμ€νμ΄μ€(νμ
κ²μ¬λ₯Ό μν μ 보)μλ μν₯μ λ―ΈμΉ©λλ€. ν©ν λ¦¬κ° React.createElement
(κΈ°λ³Έκ°)λ‘ μ μλμ΄ μλ€λ©΄, μ»΄νμΌλ¬λ μ μ JSX
λ₯Ό κ²μ¬νκΈ° μ μ React.JSX
λ₯Ό λ¨Όμ κ²μ¬ν κ²μ
λλ€. ν©ν λ¦¬κ° h
λ‘ μ μλμ΄ μλ€λ©΄, μ»΄νμΌλ¬λ μ μ JSX
λ₯Ό κ²μ¬νκΈ° μ μ h.JSX
λ₯Ό κ²μ¬ν κ²μ
λλ€.