React 文档拾遗

组件名称必须大写开头

组件是常规的 JS 函数,但必须大写开头,否则无法运行。

组件 return 语句不在同一行必须添加小括号

jsx 复制代码
return <img src="https://i.imgur.com/MK3eW3As.jpg" alt="Katherine Johnson" />

// or
return (
  <div>
    <img src="https://i.imgur.com/MK3eW3As.jpg" alt="Katherine Johnson" />
  </div>
)

组件不能嵌套定义

组件可以渲染别的组件,但是不能在组件中定义组件,如果要使用父组件的数据,通过 props 传递即可,而不是嵌套定义。

JSX 只能返回一个根元素

因为 JSX 会被转换 JS 对象,但函数不能返回多个对象(除非包到数组里面),所以 JSX 也只能返回一个根元素。

如果你不想增加一个额外的 <div> 标签作为根元素,可以使用 <></> 空标签 Fragment 代替,它不会在 HTML 结构中添加额外节点。

JSX 标签必须闭合

自闭合标签必须有 /,如 <img> 必须写成 <img />

有开始标签 <div> 就必须有闭合标签 </div>

一个好用的网站

官方推荐了一个网站可以将 HTML 快速转换为 JSX:

transform.tools/html-to-jsx

这个网站还有 CSS 转换 Tailwind,好东西。

props 不可更改

如果子组件的 props 需要改变,只能向父组件"请求"传递一个新的 props 对象,旧 props 将会被丢弃最后被 JS 引擎回收。

需要交互性时可以设置 state。

条件渲染切勿将数字放在 && 左侧

JS 会自动把左侧的值转成布尔类型以判断条件是否成立,如果左侧是数字 0,为"假"值,此时 React 会渲染 0 而不是不进行渲染。

一个常见错误就是 itemCount && <p>items</p>,本意是 itemCount 为 0 时不进行渲染,实际会渲染成一个 0,可以用 itemCount > 0 && 更正。

渲染数组列表一定要给上 key 值

React 会通过 key 值将组件和数组里的元素对应起来,这在数组项进行排序、插入或者删除等操作时非常重要。React 通过 key 值可以推断发生了什么,从而正确的更新 DOM 树。

尽量不要把数组的索引当做 key 值使用,实际上没有显式指定 key 值时,React 就是这么做的。如果你的数组元素不需要更新可以例外。

key 值在兄弟节点中必须唯一,但不要求全局唯一。

key 值不能改变,所以不要这样 key={Math.random()} 在渲染时动态地生成 key。

另外,注意直接放在 map() 方法中的 JSX 元素一般都要指定 key 值,数组列表并不单单指 <li> 这种元素。

如果想要列表渲染的每一个组件都输出多个 DOM 节点,可以用 <Fragment key={id}></Fragment> 包裹。

我一般直接用内置函数 crypto.randomUUID() 生成

组件函数为什么会执行两次?组件函数为什么会执行两次?

组件渲染时会读取三种输入:props,state 和 context,应该始终将它们视作只读的。

如果需要根据用户输入来改变内容,应该通过 setState,而不是直接写入变量。

在组件渲染时,永远不应该改变预先存在的变量和对象(不纯)。

新创建的项目默认在"严格模式"下开发,它将会调用每个组件函数两次,来帮助找到违反以上规则的组件。

在渲染时可以更改"刚刚"创建的变量和对象

上文说到,组件不能改变预先存在的变量和对象,也就是组件函数作用域外的变量或是函数调用前创建的对象,这种改变的行为也被称为突变(mutation)。

但是你完全可以在作用域内做一些更改变量或对象的行为,比如:

jsx 复制代码
function TeaGathering() {
  let cups = []
  for (let i = 1; i <= 12; i++) {
    cups.push(<Cup key={i} guest={i} />)
  }
  return cups
}

这被称为局部突变,就像组件内部的小秘密一样。

事件处理函数

  • 组件内部定义
  • handle 开头,后面是事件名称
  • 可以内联定义(匿名函数)
  • 可以当做 props 传递,按惯例以 on 开头,后面是事件名称
  • 所有事件都会传播,
相关推荐
无人生还17 小时前
从 Vue3 到 React · 快速上手系列第 5 篇:事件处理与表单(受控组件 vs v-model)
前端·vue.js·react.js
光影少年18 小时前
RN Bridge 原理
前端·react native·react.js
moMo18 小时前
用 React 写一个 TodoList
react native·react.js
To_OC1 天前
写了三遍 Todo List,我终于搞懂了 React 父子组件到底怎么通信
前端·javascript·react.js
kyriewen1 天前
别再乱用useEffect了——你写的10个里有8个不该存在
前端·javascript·react.js
zandy10111 天前
衡石 Agentic BI的ReAct 推理框架在 Agentic BI 中的工程化实践
前端·javascript·react.js
labixiong1 天前
React Compiler 用 Rust 重写了,编译提速 10 倍——手写 useMemo 的日子到头了
react.js·rust
张元清2 天前
React useDeepCompareEffect:修复 useEffect 的对象依赖问题(2026)
javascript·react.js
用户298698530142 天前
React 前端处理 Excel 工作表复制的技术实践
javascript·react.js·excel
光影少年2 天前
RN原生交互 & 桥接
前端·javascript·react native·react.js·前端框架