官方定义:React是一个用于构建用户界面的javaScript库
对于前端开发人员来说,其工作内容就是构建用户界面,而构建用户界面离不开三个技术:
HTML:构建页面的结构
CSS:构建页面的样式
JavaScript:构建页面动态内容和页面交互
原生js开发页面到渐进式框架开发页面的过程
最早是用原生JS开发页面,但是原生js开发存在以下几个问题:
之后通过jQuery库进行开发,jQuery成为了最流行和使用最多的JavaScript库,虽然简化了DOM操作但是核心还是操作DOM
现在用类似Vue和React这样的框架,之所以框架开发页面应用的目的只有一个:那就是用框架可以帮助我们前端开发人员更加高效和快速的构建用户页面,国内流行的三个前端框架都是构建用户页面的。
React是2013年Facebook开源的JavaScript库,之所以出现这个库,是源于一个bug。这个bug就是当数据变化的时候过多的操作DOM就会很容易产生bug
问题1:传统的开发模式中,我们过去都是过多的操作了界面的细节,比如需要掌握和使用大量操作DOM的api,虽然可以通过jQuery来简化。
问题2:关于数据也就是状态,会分散到各个地方,不方便管理和维护,页面状态不方便维护
FB团队通过React的解决方案:
组件化开发
组件化开发是前端开发的流行趋势,将复杂的界面拆分成为一个个小的组件
合理的进行组件的划分和设计也是一个重点
多平台适配
2013年 React.js布之处可以开发Web页面
2015年 React Native可以开发移动端跨平台应用(比不上flutter和uni-app)
2017年 React VR可以开发虚拟现实Web应用程序
举例1: 比如React Hooks这个开创性的新功能,最新版本的Vue3.0中的Vue Function Based API就是借鉴了React Hooks的思想
举例2: Flutter的官网上的一句话说明了它的设计灵感来自于React框架,比如Flutter中的Widget - Element - RenderObject,对应的就是React中的JSX - 虚拟DOM - 真实DOM
一个优秀的前端开发人员必须学会React和Vue这两大框架
HackerRank中统计最想学习的framework框架,排名第一的是React
国内外很多大厂都使用React进行开发,要想进入大厂,React必须要精通。
React是前端高级工程师的必备技能
React是前端的先驱者,它总是会引领前端的潮流。
react:包含react所必须的核心代码
react-dom:react-dom可以根据不同的平台去渲染不同平台对应的组件
如果开发web端,react-dom会见jsx最终渲染为真实的DOM,最终显示在浏览器中
如果开发native端,react-dom会将jsx渲染为移动端原生的控件,比如Android的Button,IOS中的UIButton
babel:最主要的作用是将jsx转化为React代码的工具
又名babel.js,是目前前端使用最多的代码转化器,因为很多我们平时开发中写在项目中的ES6+代码,浏览器本身是并不支持的,但是ES6+语法又非常的简洁,为了解决这个问题,我们一般在写源码的时候通过ES6进行编写,之后通过babel工具,将ES6代码转化为大多数浏览器都可以识别的ES5的语法。
为什么要三个库?Vue不是只需要引入一个vue.js就可以了么?
三个库各司其职,其实是从底层进行了解耦,Vue之所以引入一个只不过是把三个融合到了一个里面
而且一开始三个库并没有拆分,而是后来出现了React-native之后,才将一个react.js拆分为现在的react以及react-dom两个库。
在三个库引入的前提下,在HTML页面中开发react.js的两种方式
两种方法它们底层的原理是一样的,但是很明显后者要比前者简单很多!
不用babel工具,用React.renderElement()
直接用React.renderElement()这种方法开发界面,比如在页面上渲染一个h2标签,这种方式太复杂,这种api开发的方式虽然复杂,好处在于React.renderElement()这种代码是可以直接被浏览器所识别并执行的,并且是可以被react库中相关代码所使用并最终生成虚拟DOM的。
充分利用babel工具 使用JSX(JavaScript XML)
用类似与HTML的方式开发界面,然后通过babel转化为React.renderElement()来创建页面
在HTML中使用jSX语法开发的时候,必须要在script标签声明type=“text/babel”才可以将浏览器无法识别的jsx代码编译为可以执行的代码。
JSX其实是一个语法糖,只要写了JSX这个语法糖,那么就会基于babel将jsx代码转化成为React.renderElement()相关代码
<script src="https://unpkg.com/react@16/umd/react.development.js" crossorigin></script>
<script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js" crossorigin></script>
<script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script>
需求:在界面显示一个hello world,点击按钮,文本变为Hello React
<div id="app"></div>
编程范式:命令式编程,每做一个操作都是给浏览器一步步的命令,浏览器按照我们一步步的命令去执行
const value = ‘hello react !!!‘;
const btn = document.getElementByTagNames(‘button‘)[0];
btn.addEventListener(‘click‘,()=>{
btn.innerHTML = value;
})
编程范式:声明式编程。通过操作数据层或者DOM层去修改数据,UI界面响应数据变化而变化
<script type="text/babel">
let message = ‘hello world‘;
function btnClick(){
console.log(message);
message = ‘Hello React‘;
// 当事件触发的时候,再次调用renderNow方法,将数据的更新反馈到视图上
renderNow();
}
<!-- 将ReactDOM.render函数封装在renderNow函数中,方便多次调用 -->
function renderNow(){
ReactDOM.render((
<div>
<h2>{message}</h2>
<button onClick={btnClick}>改变文字</button>
</div>
),document.getElementById("app"));
}
<!-- 页面加载后第一次调用renderNow,此时渲染页面DOM结构 -->
renderNow();
</script>
第二个参数:Container 也就是要挂载的DOM元素对象
可以理解为将渲染的内容放的一个容器
不管之前这个DOM元素中有多少内容,在此API调用之后,都会将之前的内容全部覆盖
第三个参数:Callback 回调函数
原理:当数据发生改变的时候,要想让界面发生改变,必须重新渲染jsx(DOM),这时候原先写在jsx语法中的变量才可以拿到最新的数据,然后页面才可以渲染最新的数据,这一点和Vue是不一样的
核心:核心就是驱动render函数多次执行,在这里只能封装起来多次调用。
ReactDOM对象来源:
下载react源码文件
找到react-dom文件夹下的index.js文件
index.js中向外部暴露了来自于src/client/ReactDOM导出的对象,所有引入了react三个依赖的页面都可以直接使用
export * from ‘./src/client/ReactDOM‘
src/client/ReactDOM.js文件中暴露出了一个对象,这个对象转化成为ES5语法的时候,这个对象就叫做ReactDOM,它上面有一个render函数
render函数来源:
render函数写在ReactDOMLegery.js文件中,它是上面导出的ReactDOM对象上的一个方法,所以外部可以直接通过ReactDOM.render()函数来进行渲染DOM。
第一步:先通过继承自React.Component类创建一个组件
React.Component类来自于react文件夹下index.js中export导出一个大对象中有一个类Component
React中创建组件有很多方法,最常用的就是基于ES6的类的继承来创建一个新组件的
constructor:构造器
render:渲染dom
自定义方法:实现功能
数据响应
通过setState({key:value})的方法来修改数据,再React中永远不要去手动调用render方法修改数据
第二步:再通过ReactDOM.render()渲染创建好的组件
<!-- 创建组件 -->
class App extends React.Component {
constructor(){
super();
this.state={
message = ‘hello world‘;
}
}
render(){
return (
<div>
<h2>{this.state.message}</h2>
<button onClick={this.btnClick.bind(this)}>改变文字</button>
</div>
)
}
btnClick(){
console.log(this);
this.setState({message:‘Hello React‘})
}
}
<!-- 渲染组件 -->
ReactDOM.render(</App>,document.getElementById(‘app‘));
原文:https://www.cnblogs.com/gaokai/p/15027620.html