javascript - ReactDOM.render 的第一个参数是什么?
问题描述
我最近正在自学 React,但我发现一个令人困惑的用法ReactDOM.render
function UniversityList(){
return React.createElement(
"ul",
{id: "universities"},
React.createElement("li",
{id: "Waterloo",
className: "University"},
"University of Waterloo"),
React.createElement("li",
{id: "Laurier",
className: "University"},
"Laurier University"
));
};
ReactDOM.render(React.createElement(UniversityList, null, null),
document.getElementById("root"));
在上面的代码中,为什么我们将UniversityList
函数字符串作为第一个参数传递给React.createElement(UniversityList, null, null)
.
- 我们不是总是把我们想要的html标签的类型作为第一个参数传递吗?(我刚开始学习组件,但我仍然不明白)
- 上面的代码中没有调用函数
UniversityList
的地方。具有类型的 React 元素如何"ul"
返回UniversityList
? - 函数
UniversityList
没有被调用,但是ReactDOM.render
页面是怎么渲染成功的呢?React.createElement(UniversityList, null, null)
返回一个 React 对象,如:
{
$$typeof: Symbol(react.element)
key: null
props: { children: null }
__proto__: Object
ref: null
type: UniversityList()
_owner: null
_store: {validated: false}
}
我想在这个 React 对象中呈现的列表项在哪里?
解决方案
我认为好好阅读 react 文档会帮助你理解很多。
React.createElement( type, [props], [...children] )
创建并返回
React element
给定类型的新的。type 参数可以是标签名称字符串(例如'div'
或'span'
)、React component
类型(类或函数)或React fragment
类型。
问题 1
我们不是总是把我们想要的html标签的类型作为第一个参数传递吗?(我刚开始学习组件,但我仍然不明白)
您可以指定 html 元素或其他反应组件。
问题2
上面的代码中没有调用函数
UniversityList
的地方。具有类型的 React 元素如何"ul"
返回UniversityList
?
这在 React 中很典型,您不直接调用函数,而是将它们传递给 React 框架以呈现和处理所有组件生命周期函数,例如挂载、更新和卸载。
例如,一个功能组件可以这样写:
const MyComponent = ({ count }) => <div>{count}</div>;
但是您永远不会真正调用函数 like MyComponent({ count: 3 })
,而是在 JSX 中将其编写为<MyComponent count={3} />
.
第二个文本块对此进行了一些解释:
编写的代码
JSX
将转换为使用React.createElement()
.React.createElement()
如果您使用 JSX,通常不会直接调用。请参阅React Without JSX
以了解更多信息。
问题 3
函数 UniversityList 没有被调用,但是 ReactDOM.render 是如何成功渲染页面的呢?
与问题 2 相同的原因,组件被传递给 React 框架来处理它的渲染和生命周期。React.createElement(UniversityList, null, null)
创建一个新的元素/组件 ,UniversityList
以渲染到 DOM 中,并传递 noprops
或children
. 如果您查看函数定义,它将作为道具UniversityList
传递并创建两个元素作为子元素。{id: "universities"}
li
推荐阅读
- angular - 将第三方 js 脚本加载到自定义路径中的 jhipster webpack
- mysql - 具有两列的Mysql组表
- java - Java 无法创建 java 虚拟机
- node.js - 使用 React 和 Socket.io 的聊天应用程序在发送太多消息后挂起
- mysql - 如果打开 information_schema.tables 的游标,Mysql 存储过程错误的结果集
- html - CSS: How to show full height with overflow-y?
- unit-testing - 测试未编译:“函数声明中缺少 async 关键字”
- java - 通过输入流的字节数组
- javascript - 如何每天午夜从 0 重新开始金额值?
- sql - 选择在给定时间范围内出现两次的值