一、什么是react
React
是一个由Facebook
开源的JavaScript
库,用于构建用户界面。它基于组件化的思想,将界面拆分成多个独立的、可复用的组件,并通过组件之间的交互构建整个用户界面。React
使用虚拟DOM
(Virtual DOM
)来实现高效的页面更新,通过比对更新前后的虚拟DOM
树的差异,只对实际需要更新的部分进行操作,从而提高页面性能。
React
还引入了JSX
语法,使得开发者可以在JavaScript
代码中直接编写HTML
标签和组件,提高了代码的可读性和开发效率。React
还提供了丰富的生命周期方法和状态管理机制,方便开发者管理和控制组件的生命周期和状态变化。
React
具有跨平台的特点,可以用于开发Web
应用、移动应用以及其他平台上的用户界面。它被广泛应用于各种规模的项目中,是目前最流行的前端开发框架之一。
二、React的发展史
React的发展历史可分为以下几个阶段:
-
诞生和引入:React最初由Facebook的工程师Jordan Walke于2011年创建。最初的版本是一个用于在Facebook内部使用的工具,用于解决其大规模应用中复杂的UI渲染问题。
-
开源:在2013年,Facebook将React开源,使其能够被更广泛的开发者使用和贡献。这一举措使React开始在开发者社区中流行起来。
-
React Native:2015年,Facebook发布了React Native,这是一个使用React构建原生移动应用的框架。React Native使开发者可以使用React的编程模型和技术来构建跨平台的移动应用,从而大大简化了移动应用的开发过程。
-
Hooks引入:2018年,React 16.8版本引入了Hooks,这是一种新的特性,使开发者可以在不使用类组件的情况下共享状态和逻辑代码。Hooks提供了更简单、更具可重用性的代码编写方式,进一步提升了React的开发效率。
-
Concurrent Mode和Suspense:2021年,React 18版本引入了Concurrent Mode和Suspense。Concurrent Mode支持并发渲染,能够使React应用更加响应和流畅。Suspense则提供了一种简单的方式来处理异步加载和代码分割,使开发者可以更好地管理应用的性能和用户体验。
总体来说,React在过去的几年里经历了快速的发展和演进。它通过提供简单且高效的开发方式,成为了构建现代Web应用和移动应用的首选技术之一。同时,React的开源社区也非常活跃,不断为React提供新的功能和优化,使其能够满足不断变化的开发需求。
三、React特点
React是一个用于构建用户界面的JavaScript库,具有以下特点:
-
组件化:React的核心思想是将UI拆分成独立的可复用组件,并通过组件的组合构建复杂的用户界面。每个组件可以管理自己的状态,并通过props(属性)接收父组件传递的数据。
-
虚拟DOM:React使用虚拟DOM(Virtual DOM)机制来优化性能。它会将组件的状态变化转化为虚拟DOM的变化,并通过Diff算法计算最小的DOM操作,然后批量更新到真实DOM中,以减少DOM操作带来的性能损耗。
-
单向数据流:React采用了单向数据流的模式,即数据的流动是单向的,自上而下的单向流动。父组件通过props传递数据给子组件,子组件不能直接修改props中的数据,只能通过回调函数间接传递数据给父组件。
-
JSX语法:React使用JSX语法,将HTML标记和JavaScript代码集成在一起,可以在JavaScript代码中直接写HTML标记,提高了代码的可读性和可维护性。
-
高效灵活:React具有高效和灵活的特点。它只更新必要的组件或DOM部分,提高了性能。同时,React可以与其他库或框架结合使用,如React Native用于构建移动应用。
-
生态丰富:React拥有庞大的开发者社区和丰富的插件生态系统,提供了大量的第三方库和资源,方便开发人员快速构建复杂的应用。
总的来说,React具有组件化、虚拟DOM、单向数据流、JSX语法、高效灵活和丰富的生态等特点,使得它成为构建用户界面的强大工具。
四、第一个react程序
html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Hello react</title>
<script src="https://unpkg.com/react@18/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script>
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
</head>
<body>
<div id="root"></div>
<script type="text/babel">
function MyApp() {
return <h1>Hello, react!</h1>;
}
const container = document.getElementById('root');
const root = ReactDOM.createRoot(container);
root.render(<MyApp />);
</script>
</body>
</html>
以上代码的运行效果是:
<script>
标签引入了React、ReactDOM和Babel的库文件。
html
<script src="https://unpkg.com/react@18/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script>
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
-
<div id="root"></div>
是一个用于渲染React组件的容器。 -
<script type="text/babel">
标签中的代码是使用Babel解析的JavaScript代码。 -
function MyApp()
是一个React函数组件,它返回一个包含<h1>
标签的内容。 -
const container = document.getElementById('root');
获取了具有'id'为'root'的元素的引用。 -
const root = ReactDOM.createRoot(container);
创建了一个根(Root)对象。 -
root.render(<MyApp />);
使用ReactDOM.createRoot()
的render()
方法将<MyApp />
组件渲染到指定的容器中。
所以,这段代码的作用是在Web页面上渲染一个包含"Hello, react!"文本的H1标签。
五、bable能干什么
Babel是一个用于JavaScript编译的工具,它可以将新版本的JavaScript代码转换为向后兼容的旧版本,以保证在不同浏览器和环境下的运行。
举例来说,Babel可以将ES6(ES2015)或更新的JavaScript代码转换为ES5代码,这样在不支持ES6语法的旧浏览器中也可以正常运行。以下是一些Babel的应用示例:
-
语法转换 :Babel可以将ES6/ES7的语法转换为ES5语法,如使用箭头函数、解构赋值等。
示例代码:
javascript// ES6箭头函数转换为普通函数 const sum = (a, b) => a + b; // 转换后的ES5代码 var sum = function(a, b) { return a + b; };
-
模块转换 :Babel可以将使用ES6模块的代码转换为CommonJS或AMD模块,以便在旧的模块系统下使用。
示例代码:
javascript// 使用ES6模块系统导出和导入模块 export const foo = 'bar'; import { foo } from './module'; // 转换后的CommonJS模块代码 exports.foo = 'bar'; const { foo } = require('./module');
-
Polyfill :Babel可以根据浏览器的特性支持程度,自动添加缺失的API和功能,以实现向后兼容。
示例代码:
javascript// 在不支持Promise的浏览器中使用Promise // 安装"@babel/preset-env"并配置目标浏览器 new Promise((resolve, reject) => { setTimeout(() => resolve('Hello, Babel!'), 1000); }) .then(message => console.log(message)); // Babel会将上面的代码转换为使用Promise的polyfill
-
Babel可以编译JSX 。
JSX是一种JavaScript的扩展语法,它允许开发者在JavaScript中编写类似HTML的结构,用于构建用户界面。下面是一个使用Babel编译JSX的示例:
假设有如下的JSX代码:
jsx
const element = <h1>Hello, world!</h1>;
通过Babel进行编译,可以将其转换为普通的JavaScript代码:
jsx
const element = React.createElement("h1", null, "Hello, world!");
在这个例子中,JSX代码被Babel转换为了React.createElement函数的调用
。这个函数用于创建一个React元素,表示一个虚拟的DOM节点
需要注意的是,Babel
只是将JSX
转换为普通的JavaScript
代码,并不能直接运行。如果想要在浏览器中运行JSX代码,还需要引入对应的库,如React,并在项目中配置相应的构建工具,如Webpack。这样,JSX代码在构建过程中会被Babel转换为可以在浏览器中运行的代码。
总之,Babel作为一个强大的JavaScript编译工具,可以帮助开发者轻松编写兼容性更好的JavaScript代码。
六、jsx
JSX(JavaScript XML)
是一种使用类似XML的语法扩展JavaScript
的方式,用于构建React
组件。它允许在JavaScript
代码中编写类似HTML的标记,使得组件的结构更加清晰和易于理解。
举个例子,下面是一个使用JSX语法编写的React组件:
js
import React from 'react';
function Greeting() {
return (
<div>
<h1>Hello, world!</h1>
<p>Welcome to my website.</p>
</div>
);
}
export default Greeting;
在这个例子中,我们使用了<div>
、<h1>
和<p>
等HTML标签来构建组件的结构。JSX语法允许我们直接在JavaScript代码中使用这些标签,使得编写React组件更加直观和方便。
注意,上述代码中的JSX标记要用{}
包裹起来,这样可以将JavaScript表达式嵌入到JSX语法中。例如,可以在标签中使用变量、表达式或函数调用,以动态地生成组件内容:
js
import React from 'react';
function Greeting(props) {
const name = props.name;
return (
<div>
<h1>Hello, {name}!</h1>
<p>Welcome to my website.</p>
</div>
);
}
export default Greeting;
在这个例子中,我们通过props
对象传递了一个name
属性给组件。并且用{name}
的方式将该属性的值动态展示在组件中。
七、虚拟dom
React中的虚拟DOM(Virtual DOM)是一种用于改进Web应用性能的技术。它是一个轻量级的JavaScript对象表示,它映射了真实的DOM结构。当状态发生变化时,React会根据新状态生成新的虚拟DOM,并将其与旧的虚拟DOM进行比较,找出差异。然后,React会通过最小化DOM操作的方式,将差异应用于真实的DOM中,从而更新页面。
虚拟DOM具有以下优点:
- 提高性能:虚拟DOM可以批量更新真实DOM,而不是每次都进行单个更新,从而减少了真实DOM的操作次数,提高了效率。
- 实现简洁的编程模型:React将真实DOM的复杂性抽象成虚拟DOM的树结构,使开发者可以用声明式的方式来描述如何更新UI,而不需要手动操作DOM。
- 跨平台支持:虚拟DOM可以在浏览器以外的环境(如服务器端)中运行,实现了跨平台的开发和渲染。
虽然虚拟DOM可以提高性能,但在某些情况下会引入额外的开销。因此,React中的虚拟DOM的设计考虑了权衡,以平衡性能和开发体验。
以下图例,描述了使用虚拟DOM和直接操作真实DOM的区别:
列表组件 渲染虚拟DOM 比较新旧虚拟DOM 生成差异对象 更新真实DOM 直接操作真实DOM 手动更新DOM
这个图例中,左边部分描述了使用虚拟DOM的过程:首先在A步骤中创建列表组件,然后在B步骤中渲染虚拟DOM,接着在C步骤中比较新旧虚拟DOM的差异,生成差异对象,最后在E步骤中根据差异对象更新真实DOM。
右边部分描述了直接操作真实DOM的过程:在F步骤中直接操作真实DOM,然后手动更新DOM,即G步骤。
通过对比这两个过程,可以明显看出使用虚拟DOM的优势:通过在内存中创建虚拟节点并比较新旧节点的差异,React可以只对差异部分进行DOM操作,从而减少直接操作DOM带来的性能损耗。同时,虚拟DOM将底层的DOM操作抽象化,使得开发者可以更加专注于业务逻辑的编写。