React 也就这样 01——React 元素的创建和渲染
React 是一个用于构建用户界面的 JavaScript 库
它包括两个库:react.js 和 react-dom.js
react.js:React 的核心库,提供了 React.js 的核心功能,比如创建 React 组件、组件的生命周期等react-dom.js:提供了和浏览器交互的 DOM 功能,比如:将组件渲染到页面上
React 和 ReactDOM
我们可以通过官方提供的 CDN 链接引入 react.js 和 react-dom.js 这两个库,从而在 HTML 中使用
<script crossorigin src="https://unpkg.com/react@16/umd/react.production.min.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.production.min.js"></script>
React是 React 库的入口。如果你通过使用<script>标签的方式来加载 React,则可以通过React全局变量对象来获得 React 的顶层 API如果你使用一个
<script>标签引入 react-dom,所有的顶层 API 都能在全局ReactDOM上调用
先来看看 React 和 ReactDOM 是什么:
console.log(React)
console.log(ReactDOM)
React

ReactDOM

可以看到是两个对象,并且拥有很多方法,暂时不必深究每个方法
React 初体验
首先我们在 html 中引入:react.js react-dom.js
<script crossorigin src="https://unpkg.com/react@17/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script>
目前我们的代码写在 html 中,所以都通过 script 标签引入这两个库(后续不再赘述)
接着我们在界面上添加一个根元素:
<div id="root"></div>
如果我们想给这个根元素添加一段文字比如: Hello,React! ,我们可以这么做:
<div id="root">
Hello,React!
</div>
现在用 React 的方式来将这个标题渲染到页面上
我们要用到 ReactDOM 提供的 API :ReactDOM.render()
ReactDOM.render("Hello, React!", document.getElementById("root"), () => {
console.log("渲染完执行回调函数");
});
在线代码(可以点击在线代码查看效果)
事实上,render 方法接受 3 个参数:
- 要渲染的内容("Hello, React!")
- 渲染内容的接收容器(此处的根元素)
- 可选的回调函数(回调函数会在内容被渲染后执行)
创建 React 元素
如果我们想要渲染的内容是一个标题 h1 或者一个段落 p ,甚至是更复杂的元素嵌套该怎么办呢
<!-- 比如 -->
<h1>Hello,React!</h1>
<p>第一次学习React,太简单了吧</p>
<!-- 甚至 -->
<div>
<header>
<h1>Hello,React!</h1>
</header>
<section>
<p>第一次学习React,太简单了吧</p>
</section>
</div>
React 提供了创建并返回 React 元素的 API:
React.createElement(
type,
[props],
[...children]
)
该方法接受 3 个参数:
type:指定元素类型,比如 'h1'、'p'
props:可选参数,元素的属性值对对象,比如
{className: 'bg-red', id: 'title'}可选参数,元素的子元素
创建元素并渲染到指定容器
const h1 = React.createElement("h1", null, "Hello,React!");
const p = React.createElement("p", null, "第一次学react,太简单了吧");
const header = React.createElement("header", { id: "title" }, h1);
const section = React.createElement("section", null, p);
const div = React.createElement("div", null, header, section);
渲染到根元素:
ReactDOM.render(div, document.querySelector("#root"));
注意
- render 方法可以接受 createElement 创建的 React 元素作为渲染对象
- render 方法属于 ReactDOM 对象
- createElement 方法属于 React 对象
JSX
每个 React 元素都用 createElement 创建有点麻烦啊,有没有简单点的办法
事实上,对于:
const h1 = React.createElement("h1", null, "Hello,React!");
const p = React.createElement("p", null, "第一次学react,太简单了吧");
const header = React.createElement("header", { id: "title" }, h1);
const section = React.createElement("section", null, p);
const div = React.createElement("div", null, header, section);
可以这么写:
const h1 = <h1>Hello,React!</h1>;
const p = <p>第一次学react,太简单了吧</p>;
const header = (
<header>
<h1>Hello,React!</h1>
</header>
);
const section = (
<section>
<p>第一次学react,太简单了吧</p>
</section>
);
const div = (
<div>
<header>
<h1>Hello,React!</h1>
</header>
<section>
<p>第一次学react,太简单了吧</p>
</section>
</div>
);
这种标签语法既不是字符串也不是 HTML
它被称为 JSX,是 JavaScript 的语法扩展
事实上,每个 JSX 元素一个语法糖,它们最终还是会调用React.createElement(component, props, ...children) 方法来创建 React 元素。不过我们写起来更加简单且直观
JSX 初体验
我们将所有 createElement 创建的元素改写成 JSX
得到如下完整 HTML 页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>Static Template</title>
<script crossorigin src="https://unpkg.com/react@17/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script>
</head>
<body>
<div id="root"></div>
</body>
<script>
const h1 = <h1>Hello,React!</h1>;
const p = <p>第一次学react,太简单了吧</p>;
const header = (
<header>
<h1>Hello,React!</h1>
</header>
);
const section = (
<section>
<p>第一次学react,太简单了吧</p>
</section>
);
const div = (
<div>
<header>
<h1>Hello,React!</h1>
</header>
<section>
<p>第一次学react,太简单了吧</p>
</section>
</div>
);
ReactDOM.render(div, document.querySelector("#root"));
</script>
</html>
在浏览器中打开,会发现页面上的元素并没有得到正确的渲染
并且控制台输出了错误:Uncaught SyntaxError: Unexpected token '<'
这是因为浏览器并不认识 JSX,JSX 只是 React 团队自己造的东西,我们需要把 JSX 转换成符合 JS 规范的语法,这样浏览器就认识了
这跟将 ES6 语法转换成 ES5 差不多
什么东西能把 ES6 语法转换成 ES5 ?
没错,Babel
同样,借助 Babel 我们可以将 JSX 转换成 JS 语法
在页面中添加如下 script 标签
<script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script>
并将 script 标签(指包含 JSX 语法的 script)的 type 属性改为:text/babel
<script type="text/babel">
const h1 = <h1>Hello,React!</h1>;
</script>
现在,元素可以正确的显示了
现在,我们已经学会了如何用 React 来创建元素和渲染元素,也初步了解了创建元素的方法的语法糖 JSX。
React 也就这样 01——React 元素的创建和渲染的更多相关文章
- react 也就这么回事 01 —— React 元素的创建和渲染
React 是一个用于构建用户界面的 JavaScript 库 它包括两个库:react.js 和 react-dom.js react.js:React 的核心库,提供了 React.js 的核心功 ...
- React 深入系列1:React 中的元素、组件、实例和节点
文:徐超,<React进阶之路>作者 授权发布,转载请注明作者及出处 React 深入系列,深入讲解了React中的重点概念.特性和模式等,旨在帮助大家加深对React的理解,以及在项目中 ...
- react基础语法(一)元素渲染和基础语法规则
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- react 也就这么回事 04 —— 元素渲染
为了便于后续理解,我们再来回顾和总结前面几个章节的内容 1 元素及其创建 元素是构成 React 应用的最小砖块. 元素描述了你在屏幕上想看到的内容. const element = <h1&g ...
- React 与 React Native 底层共识:React 是什么
此系列文章将整合我的 React 视频教程与 React Native 书籍中的精华部分,给大家介绍 React 与 React Native 结合学习的方法,此小节主要介绍 React 的底层原理与 ...
- (转)2019年 React 新手学习指南 – 从 React 学习线路图说开去
原文:https://www.html.cn/archives/10111 注:本文根据 React 开发者学习线路图(2018) 结构编写了很多新手如何学习 React 的建议.2019 年有标题党 ...
- React源码解析之React.Children.map()(五)
一,React.Children是什么? 是为了处理this.props.children(this.props.children表示所有组件的子节点)这个属性提供的工具,是顶层的api之一 二,Re ...
- react系列笔记1 用npx npm命令创建react app
react系列笔记1 用npx npm命令创建react app create-react-app my-app是开始构建新的 React 单页应用程序的最佳方式.它已经为你设置好了开发环境,以便您可 ...
- React:快速上手(6)——掌握React Router
React:快速上手(6)——掌握React Router 引入Router 安装 npm install react-router-dom 基础组件 React Router中有三种类型的组件:路由 ...
随机推荐
- .NET对接极光消息推送
什么是APP消息推送? 很多手机APP会不定时的给用户推送消息,例如一些新闻APP会给用户推送用户可能感兴趣的新闻,或者APP有更新了,会给用户推送是否选择更新的消息等等,这就是所谓的"消息 ...
- 【Python自动化Excel】pandas处理Excel数据的基本流程
这里所说的pandas并不是大熊猫,而是Python的第三方库.这个库能干嘛呢?它在Python数据分析领域可是无人不知.无人不晓的.可以说是Python世界中的Excel. pandas库处理数据相 ...
- 服务性能监控之Micrometer详解
Micrometer 为基于 JVM 的应用程序的性能监测数据收集提供了一个通用的 API,支持多种度量指标类型,这些指标可以用于观察.警报以及对应用程序当前状态做出响应. 通过添加如下依赖可以将 M ...
- hyperf 如何对AMQP消息进行手动消费?
转发自白狼栈:查看原文 在使用 hyperf 官方自带的 AMQP 队列时你会发现,不需要我们再额外启动进程对消息进行消费.这是因为默认情况下,使用 @Consumer 注解时,hyperf 会为我们 ...
- 阿里神器 Seata 实现 TCC模式 解决分布式事务,真香!
今天这篇文章介绍一下Seata如何实现TCC事务模式,文章目录如下: 什么是TCC模式? TCC(Try Confirm Cancel)方案是一种应用层面侵入业务的两阶段提交.是目前最火的一种柔性事务 ...
- CTF-sql-宽字节注入
本文章主要涉及sql宽字节注入注入的原理讲解,如有错误,望指出.(附有目录,如需查看请点右下角) 一.首先介绍一下本篇文章所用到的知识点: 常用到的url编码: 空格:%20 单引号:%27 在sql ...
- Solon 开发
Solon 开发 一.注入或手动获取配置 二.注入或手动获取Bean 三.构建一个Bean的三种方式 四.Bean 扫描的三种方式 五.切面与环绕拦截 六.提取Bean的函数进行定制开发 七.自定义注 ...
- 【解决了一个小问题】vmselect对应的vmstorage端口配置错误导致的问题
从vmselect查询的时候,出现如下错误: error when executing query="up" on the time range (start=1639388706 ...
- qt之线程
第一种创建: mythread1.h: #ifndef MYTHREAD_H #define MYTHREAD_H #include<QThread> #include<QDebug ...
- golang中的标准库数据格式
数据格式介绍 是系统中数据交互不可缺少的内容 这里主要介绍JSON.XML.MSGPack JSON json是完全独立于语言的文本格式,是k-v的形式 name:zs 应用场景:前后端交互,系统间数 ...