一、React 初识
1、演示
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Hello React</title>
</head>
<body>
<div id="test"></div>
</body>
<script src="../js/react/react.development.js" type="text/javascript"></script>
<script src="../js/react/react-dom.development.js" type="text/javascript"></script>
<script src="../js/react/babel.min.js" type="text/javascript"></script>
<!-- 此处一定要写 babel -->
<script type="text/babel">
const VDOM = <h1>Hello React</h1>;
ReactDOM.render(VDOM, document.getElementById("test"));
</script>
</html>
- 准备好容器
html
<div id="test"></div>
- 引入依赖
html
<script src="../js/react/react.development.js" type="text/javascript"></script>
<script src="../js/react/react-dom.development.js" type="text/javascript"></script>
<script src="../js/react/babel.min.js" type="text/javascript"></script>
| 依赖 | 说明 |
|---|---|
react.development.js |
React 核心库 |
react-dom.development.js |
用于支持 React 操作 DOM |
babel.min.js |
用于将 jsx 转为 js |
- 创建并渲染虚拟 DOM
js
// 1. 创建虚拟 DOM,这里不需要加引号("")
const VDOM = <h1>Hello React</h1>;
// 2. 渲染虚拟 DOM
ReactDOM.render(VDOM, document.getElementById("test"));
- 注:如果有多个渲染同一个容器,后面的会将前面的覆盖掉
js
const VDOM2 = <h1>Hello React2</h1>;
ReactDOM.render(VDOM2, document.getElementById("test"));
二、创建虚拟 DOM 的两种方式
1、使用 jsx 创建虚拟 DOM
js
const VDOM = <h1 id="title">Hello React</h1>;
js
const VDOM = <h1 id="title"><span>Hello React123</span></h1>;
js
const VDOM = (
<h1 id="title">
<span>Hello React123</span>
</h1>
);
2、使用 JS 创建虚拟 DOM
js
React.createElement(【标签名】, 【标签属性】, 【标签内容】)
js
const VDOM = React.createElement("h1", { id: "title" }, "Hello React");
js
const VDOM = React.createElement("h1", { id: "title" }, React.createElement("span", {}, "Hello React123"));
- 注:因为是使用 JS 创建虚拟 DOM,所以不需要引入 Babel
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>使用 JS 创建虚拟 DOM</title>
</head>
<body>
<div id="test"></div>
</body>
<script src="../js/react/react.development.js" type="text/javascript"></script>
<script src="../js/react/react-dom.development.js" type="text/javascript"></script>
<script type="text/javascript">
const VDOM = React.createElement("h1", { id: "title" }, React.createElement("span", {}, "Hello React123"));
ReactDOM.render(VDOM, document.getElementById("test"));
</script>
</html>
3、虚拟 DOM 与真实 DOM
(1)基本介绍
-
本质是 Object 类型的对象(一般对象)
-
虚拟 DOM 比较轻,真实 DOM 比较重,因为虚拟 DOM 是 React 内部使用,无需真实 DOM 上那么多属性
-
虚拟 DOM 最终会被 React 转化为真实 DOM 呈现在页面上
(2)演示
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>虚拟 DOM 与真实 DOM</title>
</head>
<body>
<div id="test"></div>
<div id="demo"></div>
</body>
<script src="../js/react/react.development.js" type="text/javascript"></script>
<script src="../js/react/react-dom.development.js" type="text/javascript"></script>
<script src="../js/react/babel.min.js" type="text/javascript"></script>
<script type="text/babel">
const VDOM = (
<h1 id="title">
<span>Hello React123</span>
</h1>
);
ReactDOM.render(VDOM, document.getElementById("test"));
console.log(VDOM);
console.log(typeof VDOM);
console.log(VDOM instanceof Object);
console.log("------------------------------");
const TDOM = document.getElementById("demo");
console.dir(TDOM);
</script>
</html>
# 输出结果
Object
object
true
------------------------------
div#demo
三、jsx 语法规则
1、基本介绍
-
定义虚拟 DOM,不写引号
-
标签中混入 JS 表达式时,使用花括号(
{}) -
样式的类名指定不用 class,用 className
-
内联样式,要用
style={``{【key】: 【value】}}的形式写 -
只能有一个根标签
-
标签必须闭合
-
标签首字母规则如下
-
若小写字母开头,则将该标签转为 HTML 中同名元素,若 HTML 中无该标签对应的同名元素,则报错
-
若大写字母开头,React 就去渲染对应的组件,如果组件没有定义,则报错
-
2、jsx 练习
js
const myId = "title";
const myData = "Hello React123";
const VDOM = (
<div>
<h1 className="title" id={myId}>
<span style={{ color: "white", fontSize: "20px" }}>{myData.toLocaleLowerCase()}</span>
</h1>
<h2>Hello World</h2>
<input type="text" />
</div>
);
js
const data = ["Angular", "React", "Vue"];
const VDOM = (
<div>
<h1>前端框架</h1>
<ul>
{
data.map((item, index) => {
return <li key={index}>{item}</li>
})
}
</ul>
</div>
);
3、JS 表达式与 JS 语句
-
JS 表达式:一个表达式会产生一个值,可以放在任何一个需要值的地方,下面这些都是 JS 表达式
-
a
-
a + b
-
demo(1)
-
arr.map()
-
function test() {}
-
-
JS 语句:下面这些都是 JS 语句
-
if() {}
-
for() {}
-
switch() {}
-
四、React 定义组件
1、函数式组件
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>函数式组件</title>
</head>
<body>
<div id="test"></div>
</body>
<script src="../js/react/react.development.js" type="text/javascript"></script>
<script src="../js/react/react-dom.development.js" type="text/javascript"></script>
<script src="../js/react/babel.min.js" type="text/javascript"></script>
<script type="text/babel">
function Demo() {
console.log(this); // 此处的 this 是 undefined,因为 Babel 编译后开启了严格模式
return <h2>我是用函数定义的组件(适用于简单组件定义)</h2>;
}
ReactDOM.render(<Demo />, document.getElementById("test"));
</script>
</html>
# 输出结果
undefined
- 执行 ReactDOM 的 render 方法时做了什么
-
React 解析组件标签,找到了 Demo 组件
-
发现组件是使用函数定义的,随后调用该函数,将返回的虚拟 DOM 转为真实 DOM 并呈现
2、类式组件
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>类式组件</title>
</head>
<body>
<div id="test"></div>
</body>
<script src="../js/react/react.development.js" type="text/javascript"></script>
<script src="../js/react/react-dom.development.js" type="text/javascript"></script>
<script src="../js/react/babel.min.js" type="text/javascript"></script>
<script type="text/babel">
class MyComponent extends React.Component {
// render 方法是在类的(MyComponent)原型对象上的,供实例使用
// render 方法中的 this 是 MyComponent 的实例对象(MyComponent 组件实例对象)
render() {
console.log(this);
return <h2>我是用类定义的组件(适用于复杂组件定义)</h2>;
}
}
console.log(MyComponent.prototype);
ReactDOM.render(<MyComponent />, document.getElementById("test"));
</script>
</html>
# 输出结果
Component
MyComponent
- 执行 ReactDOM 的 render 方法时做了什么
-
React 解析组件标签,找到了 MyComponent 组件
-
发现组件是使用类定义的,随后 new 出来该类的实例,并通过该实例调用到原型上的 render 方法
-
将 render 返回的虚拟 DOM 转为真实 DOM 并呈现