React类组件传Props并存入变量再渲染的原理问询
理解React中向类组件传Props并存入数组渲染的实现逻辑
咱们先一步步拆解这段Grid组件的代码逻辑,再聊React里这种写法的工作原理:
一、代码的实现逻辑
这段Grid组件的核心是动态生成一个网格布局的Box组件集合,具体步骤如下:
- 计算网格宽度:通过
this.props.cols(列数)乘以14,得出整个网格的宽度,用内联样式绑定到外层的.grid容器上,保证网格能根据列数自适应宽度。 - 初始化存储数组:创建
rowsarr数组,用来存放后续生成的每个Box组件。 - 双层循环生成格子:
- 外层循环遍历行数(
this.props.rows),内层循环遍历列数(this.props.cols),覆盖网格的每个坐标位置。 - 为每个格子生成唯一标识:
boxid = i + "_" + j,用来区分不同的格子。 - 确定格子的样式类:根据
this.props.gridfull[i][j]的布尔值,给格子分配box on(激活状态)或box off(未激活状态)的类名。 - 生成Box组件并存入数组:把每个格子对应的
<Box />组件(带上boxclass、key、boxid、坐标row/col、点击回调selectbox这些props)push到rowsarr里。
- 外层循环遍历行数(
- 渲染网格:最后返回外层的
.grid容器,把rowsarr数组直接放在JSX里,React会自动渲染数组里的所有Box组件。
二、React中的工作原理
你可能疑惑:为什么能把带props的组件存入数组再渲染?其实这完全符合React的设计逻辑:
- JSX本质是JavaScript对象:当你写
<Box boxclass={boxclass} ... />的时候,Babel会把它编译成React.createElement(Box, {boxclass: boxclass, ...}),返回的是一个描述组件的JavaScript对象。所以你完全可以像操作普通JS对象一样,把它们存入数组、传递或者存储。 - 数组在JSX中的渲染规则:React允许在JSX中直接渲染数组,它会自动遍历数组中的每个元素,把它们依次渲染到DOM中,效果和你手动写一堆
<Box />组件完全一致。 - 这种写法的优势:当你需要根据动态数据(比如这里的行数、列数、格子状态)生成大量重复组件时,用循环+数组的方式可以避免冗余代码,让组件逻辑更简洁、可维护性更强。
- 关于
key的重要性:数组里的每个JSX元素必须带上唯一的key属性,React通过这个key来追踪每个组件的身份,在组件更新时能精准判断哪些组件需要重新渲染,避免不必要的DOM操作,提升性能。这里用i+"_"+j作为key是合理的,因为每个格子的坐标组合是唯一的。
内容的提问来源于stack exchange,提问作者jammy
相关产品推荐
相关产品推荐

