# 深入 JSX
- React.createElement(component, props, ...children)函数的语法糖
# React 必须在作用域内
- 因为 JSX 会编译为 React.createElement 调用形式,所以 React 库必须包含在 JSX 代码作用域内
# JSX 中的 Props
- js 表达式作为 props , if 和 for 不是 js 表达式,不能直接使用
<MyBtns foo={1 + 2 + 3} />
1
- 字符串字面量
<MyBtns msg='hello' />
<MyBtns msg={'hello'} />
1
2
2
- 属性展开
function App() {
const props = {
fName: 'hello',
lName: 'moto'
}
return <MyComponent {...props} />
}
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# JSX 中的子元素
- 字符串字面量
<MyComponent>Hello world!</MyComponent>
function MyComponent(props) {
// props.children === 'Hello world!'
return <div>{props.children}</div>
}
1
2
3
4
5
6
2
3
4
5
6
- JSX子元素
// 组件嵌套
<MyComponent>
<HeaderComp />
<BottomComp />
</MyComponent>
1
2
3
4
5
2
3
4
5
- 函数作为子元素
function Repeat(props: any) {
let items = [];
for (let index: number = 0; index < props.times; index++) {
items.push(props?.children(index));
}
return <div>{items}</div>
}
<Repeat times={10}>
{
(index: number) => <div key={index}> hello {index}</div>
}
</Repeat>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
- 布尔类型 Null 以及 Undefined 将会被忽略,不会被渲染
<div />
<div></div>
<div>{false}</div>
<div>{null}</div>
<div>{undefined}</div>
<div>{true}</div>
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
- 注意:有一些 falsy 值,如数字0,仍然会被渲染
// 当 props.message 空数组时,0 仍然会被渲染
<div>
{props.messages.length &&
<MessageList messages={props.messages} />
}
</div>
// 解决
<div>
{props.messages.length > 0 &&
<MessageList messages={props.messages} />
}
</div>
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13