JSX

  • 必须闭合标签(如 <br />
  • 只有一个根节点(用 <div>...</div> 或 <>...</> 包裹)

1.HTML 原生特性替换

html 特性JSX 属性
classclassName
forhtmlFor
小写事件名(onclick),需要传函数调用小驼峰事件名(onClick),且只需要传入函数名即可,不要传函数调用

2.嵌入 JS 代码

用大括号:{ ... }

3.特殊情况

JSX 中,当表达式返回 falsenullundefinedtrue 时,这些值不会被渲染到 DOM 中

4.赋值

JSX 可以赋值给变量,然后用大括号将其嵌入到其他 JSX 中

5.安全性

React 在渲染内容前,默认会进行转义

条件渲染

使用 JavaScript 语法,如 if 语句、&&? : 操作符有条件地渲染 JSX

<div>
  {isTrue && 'hello'} // && 左侧如果是 0,React 此时则会渲染 0 而不是不进行渲染(可以将左侧的值改成布尔类型)
</div>

列表渲染

使用 JavaScript 的 filter()map() 来实现数组的过滤和转换,将数据数组转换为组件数组

people.map(person =>
  <li key={person.id}>
    <img
      src={getImageUrl(person)}
      alt={person.name}
    />
  </li>
)

key

直接放在 map() 方法里的 JSX 元素一般都需要指定 key 值

这些 key 会告诉 React,每个组件对应着数组里的哪一项,所以 React 可以把它们匹配起来。这在数组项进行移动(例如排序)、插入或删除等操作时非常重要。一个合适的 key 可以帮助 React 推断发生了什么,从而得以正确地更新 DOM 树,避免多余的创建销毁 DOM 节点。

其他

HTML 转 JSX 工具:HTML to JSX

渲染

state 或者 props 发生变化时会触发组件渲染

样式

在 React 中添加 CSS 样式有多种方式:

内联样式

style 需要传入一个对象,样式属性名使用驼峰命名法

function MyComponent() {
  return (
    <div style={{
      color: 'blue',
      fontSize: '16px'
    }}>
      直接内联样式
    </div>
  );
}

引入外部 CSS 文件

import './styles.css';
 
function MyComponent() {
  return (
    <div className="container">
      <h1 className="title">标题</h1>
      <button className="button">点击我</button>
    </div>
  );
}

CSS Modules

/* MyComponent.module.css */
.container {
  border: 1px solid #ddd;
  padding: 20px;
}
 
.header {
  color: #ff6b6b;
}
import styles from './MyComponent.module.css';
 
function MyComponent() {
  return (
    <div className={styles.container}>
      <h1 className={styles.header}>CSS Modules示例</h1>
    </div>
  );
}

Styled Components (CSS-in-JS)

npm install styled-components
import styled from 'styled-components';
 
const StyledButton = styled.button`
  background-color: ${props => props.primary ? '#007bff' : '#6c757d'};
  color: white;
  padding: 10px 20px;
  border: none;
  border-radius: 4px;
  cursor: pointer;
  
  &:hover {
    opacity: 0.8;
  }
`;
 
function MyComponent() {
  return (
    <div>
      <StyledButton primary>主要按钮</StyledButton>
      <StyledButton>次要按钮</StyledButton>
    </div>
  );
}