构建学习环境
- 文件使用.jsx后缀
- index.jsx
安装 vite
npm install vite
# 或者
yarn add vite
<html>
<script src="index.jsx" type="module"></script>
</html>
// 启动vite
vite
JSX
const rEl = <h1>This is my first JSX experience</h1>
JSX 到底是什么?
一种标签语法,对 JS 进行语法扩展
- 不是字符串,不是 HTML 标签
- 描述 UI 呈现与交互的直观的表现形式
- 仿 HTML
-
createElement 与 JSX 对比
const rEl = React.createElement('h1', {
className:'title'
}, 'This is my first JSX experience');
const rEl = <h1 className='title'>This is my first JSX experience</h1>
把上一个节用 React.createElement 案例改写为 JSX
React深入认识 ```jsx class MyButton extends React.Component { constructor(props){ super(props);
this.state = { openStatus: false } }
statusChange(){ this.setState({ openStatus: !this.state.openStatus }); }
render() { // JSX 遵循JS的命名规范,一般使用camelCase小驼峰 // class => className tabindex => tabIndex return (
<div className="wrapper">
<p className="text">
{ /* 插值表达式 */
this.state.openStatus ? '打开状态' : '关闭状态';
}
</p>
<button
onClick={this.statusChange.bind(this)}
>
{this.state.openStatus ? '关闭' : '打开'}
</button>
); } }
ReactDOM.render({ React.createElement(MyButton), docment.getElementById(‘app’); });
<a name="SvZWv"></a>
## 为什么 React 不把视图标记和逻辑分开呢?
1. 渲染和 UI 标记是有逻辑耦合
- 为了更加直观地把UI和逻辑联系起来
2. 即使是这样的耦合,也能实现关注点分离
- 单独有render函数中返回 JSX 或 createElement
- 所以从某一个模块来看视图标记跟主逻辑分离的
- 令代码更加直观,以便更好地维护
<a name="RAEUI"></a>
## JSX 插值表达式
- 表达式
- 一切有效的(符合JS编程逻辑的)表达式 `{ title }`
- JSX 被编译以后 -> React元素 -> 普通的对象
```jsx
const rEl1 = <h1 className='title'>This is a title part.</h1>
const rEl2 = React.createElement('h1', {
className: 'title'
}, 'This is a title part.');
console.log(rEl, rEl2);
JSX会编译成 React.createElement(),即 JSX 是 React.createElement() 的上一层(语法糖)
可以在插值表达式输入各种表达式内容
{}
中可以输入 函数执行,字符串等等
var mark = 'title';
function selectText(mark){
switch(mark){
case 'title':
return 'This is a title';
default:
return 'This is a paragraph';
}
}
function getText(mark){
if(mark === 'title'){
return (
<h1 className={ mark }>
{ selectText(mark) }
</h1>
);
return <p>{ selectText(mark) }</p>;
}
}
var arr = [
{
id: 1,
name: '张三'
},
{
id: 2,
name: '李四'
},
{
id: 3,
name: '王五'
}
];
function setList(){
return (
<ul>
{
arr.map(item => {
<li key={ item.id }>
<span>{ item.id }</span>
<p>{ item.name }</p>
</li>
});
}
</ul>
);
}
const rEl = setList();
ReactDOM.render(rEl, document.getElementById('app'));
注意事项
单标签必须要闭合
const rEl = <img src="" />;
- render 之前
- 所有 JSX 内容都会转成字符串
- 所有输入(插值)的内容都会进行转义
- 以避免 XSS