在JavaScript写HTML:React核心特性JSX介绍

43 阅读2分钟

一、JSX 基础概念

1. 什么是 JSX

JSX 是一种 JavaScript 的语法扩展,它允许你在 JavaScript 代码中编写类似 XML 的结构。虽然 JSX 看起来像 HTML,但实际上它更接近 JavaScript。

2. 为什么使用 JSX

  • 直观的 UI 表达:代码结构与最终 DOM 结构相似,易于理解。

  • 代码可维护性:将 HTML 与 JavaScript 逻辑整合,减少文件分离带来的复杂性。

  • 编译时检查:在编译阶段发现错误,而不是运行时。

二、JSX 基本语法

1. 基本标签结构

const element = <h1>Hello, JSX!</h1>;
  • 标签必须闭合(如 <br />

  • 支持嵌套结构

2. 注释

const element = (
  <div>
    {/* 这是一个注释 */}
    <h1>Hello</h1>
  </div>
);

三、JSX 中的表达式

1. 嵌入 JavaScript 表达式

使用 {} 可以在 JSX 中嵌入任意 JavaScript 表达式:

const name = "John";
const element = <h1>Hello, {name}</h1>;

支持函数调用:


function getGreeting() {
  return "Welcome";
}

const element = <h1>{getGreeting()}</h1>;

2. 条件渲染

使用三元运算符:

const isLoggedIn = true;
const element = (
  <div>
    {isLoggedIn ? <h1>Welcome back!</h1> : <h1>Please log in</h1>}
  </div>
);

使用逻辑与运算符:

const count = 5;
const element = (
  <div>
    {count > 0 && <p>You have {count} messages</p>}
  </div>
);

3. 列表渲染

使用数组的 map() 方法:

const numbers = [1, 2, 3, 4, 5];
const listItems = numbers.map((number) => <li key={number}>{number}</li>);

const element = <ul>{listItems}</ul>;

注意:每个列表项都应该有一个唯一的 key 属性,这有助于 React 识别哪些元素发生了变化。

四、JSX 属性

1. 使用字符串字面量

const element = <img src="profile.jpg" alt="Profile" />;

2. 使用 JavaScript 表达式

const width = 200;
const element = <img src="profile.jpg" style={{ width: width }} />;

3. 驼峰命名法

由于 JSX 是 JavaScript,属性名使用驼峰命名法而不是 HTML 的 kebab-case:

const element = <div className="container"></div>; // 不是 class
const element = <input onChange={handleChange} />; // 不是 onchange

4. 展开属性

const props = { firstName: "John", lastName: "Doe" };
const element = <User {...props} />;

五、JSX 样式

1. 内联样式

const style = {
  color: "red",
  fontSize: 24, // 注意驼峰命名
  backgroundColor: "#f0f0f0",
};

const element = <h1 style={style}>Styled Text</h1>;

2. 类名样式

// CSS
.container {
  padding: 20px;
}

// JSX
const element = <div className="container">Content</div>;

六、JSX 与组件

1. 函数组件

function Welcome(props) {
  return <h1>Hello, {props.name}</h1>;
}

const element = <Welcome name="John" />;

2. 类组件

已弃用

class Welcome extends React.Component {
  render() {
    return <h1>Hello, {this.props.name}</h1>;
  }
}

const element = <Welcome name="John" />;

3. 自定义组件

// 定义组件
function Button(props) {
  return <button onClick={props.onClick}>{props.label}</button>;
}

// 使用组件
const element = <Button label="Click me" onClick={handleClick} />;

七、JSX 注意事项

1. JSX 必须有一个根元素

错误:

const element = (
  <h1>Hello</h1>
  <p>World</p>
);

正确:

const element = (
  <div>
    <h1>Hello</h1>
    <p>World</p>
  </div>
);

2. 大写组件名

JSX 标签名首字母必须大写,小写标签会被视为原生 HTML 标签。

3. 列表渲染与 key 属性

遍历生成列表时,每个元素必须有唯一的 key(通常使用稳定 ID)。

const items = list.map((item) => (
  <li key={item.id}>{item.name}</li> //  使用唯一 ID 作为 key
));

4. JSX 中的引号与大括号

字符串属性:使用引号。

  <MyComponent title="Hello" /> //  字符串值

表达式属性:使用大括号。

    <MyComponent count={1 + 2} /> //  表达式计算结果

5. 动态组件名

直接使用变量作为组件名会失败,需通过对象映射。
错误示例

const ComponentName = 'Button';
<ComponentName /> //  解析为 HTML 标签

正确方式

const components = { Button: () => <button>Click</button> };
const ComponentName = 'Button';
<components[ComponentName] /> //  通过映射获取组件