一文带你了解React框架

前言

由于 React的设计思想极其独特,属于革命性创新,性能出众,代码逻辑却非常简单。所以,越来越多的人开始关注和使用,认为它可能是将来 Web 开发的主流工具。

这个项目本身也越滚越大,从最早的UI引擎变成了一整套前后端通吃的 Web App 解决方案。衍生的 React Native 项目,目标更是宏伟,希望用写 Web App 的方式去写 Native App。如果能够实现,整个互联网行业都会被颠覆,因为同一组人只需要写一次UI ,就能同时运行在服务器、浏览器和手机。
React主要用于构建UI。你可以在React里传递多种类型的参数,如声明代码,帮助你渲染出UI、也可以是静态的HTML DOM元素、也可以传递动态变量、甚至是可交互的应用组件。

React具备以下优势:
1.声明式设计:React 使创建交互式 UI 变得轻而易举。为你应用的每一个状态设计简洁的视图,当数据变动时 React 能高效更新并渲染合适的组件
2.组件化: 构建管理自身状态的封装组件,然后对其组合以构成复杂的 UI。
3.高效:React通过对DOM的模拟,最大限度地减少与DOM的交互。
4.灵活:无论你现在使用什么技术栈,在无需重写现有代码的前提下,通过引入 React 来开发新功能。

让我们来一起学习吧!

1. React入门

1.1. React的基本认识

1). Facebook开源的一个js库
2). 一个用来动态构建用户界面的js库
3). React的特点Declarative(声明式编码)Component-Based(组件化编码)Learn Once, Write Anywhere(支持客户端与服务器渲染)高效单向数据流
4). React高效的原因虚拟(virtual)DOM, 不总是直接操作DOM(批量更新, 减少更新的次数) 高效的DOM Diff算法, 最小化页面重绘(减小页面更新的区域)

1.2. React的基本使用

1). 导入相关js库文件(react.js, react-dom.js, babel.min.js)
2). 编码:<div id="container"></div><script type="text/babel">var aa = 123#  #var bb = 'test'ReactDOM.render(<h1 id={bb}>{aa}</h1>, containerDOM)</script>

1.3. JSX的理解和使用

1). 理解* 全称: JavaScript XML* react定义的一种类似于XML的JS扩展语法: XML+JS* 作用: 用来创建react虚拟DOM(元素)对象
2). 编码相关* js中直接可以套标签, 但标签要套js需要放在{}中* 在解析显示js数组时, 会自动遍历显示* 把数据的数组转换为标签的数组: var liArr = dataArr.map(function(item, index){return <li key={index}>{item}</li>})
3). 注意:* 标签必须有结束* 标签的class属性必须改为className属性* 标签的style属性值必须为: {{color:'red', width:12}}* 必须只有一个根标签

1.4. 几个重要概念理解

1). 模块与组件

1. 模块:理解: 向外提供特定功能的js程序, 一般就是一个js文件为什么: js代码更多更复杂作用: 复用js, 简化js的编写, 提高js运行效率
2. 组件: 理解: 用来实现特定界面功能效果的代码集合(html/css/js/img)为什么: 一个界面的功能太复杂了作用: 复用编码, 简化项目界面编码, 提高运行效率

2). 模块化与组件化

1. 模块化:当应用的js都以模块来编写的, 这个应用就是一个模块化的应用
2. 组件化:当应用是以多组件的方式实现功能, 这上应用就是一个组件化的应用

2. react组件化开发

2.1. 基本理解和使用

1). 自定义的标签: 组件类(函数)/标签
2). 创建组件类//方式1: 无状态函数(简单组件, 推荐使用)function MyComponent1(props) {return <h1>自定义组件标题11111</h1>}//方式2: ES6类语法(复杂组件, 推荐使用)class MyComponent3 extends React.Component {render () {return <h1>自定义组件标题33333</h1>}}
3). 渲染组件标签ReactDOM.render(<MyComp />,  cotainerEle)
4). ReactDOM.render()渲染组件标签的基本流程React内部会创建组件实例对象/调用组件函数, 得到虚拟DOM对象将虚拟DOM并解析为真实DOM插入到指定的页面元素内部

2.2. 组件的3大属性: state

1. 组件被称为"状态机", 页面的显示是根据组件的state属性的数据来显示
2. 初始化指定:constructor() {super()this.state = {stateName1 : stateValue1,stateName2 : stateValue2}}
3. 读取显示: this.state.stateName1
4. 更新状态-->更新界面 : this.setState({stateName1 : newValue})

2.2. 组件的3大属性: props

所有组件标签的属性的集合对象
给标签指定属性, 保存外部数据(可能是一个function)
在组件内部读取属性: this.props.propertyName
作用: 从目标组件外部向组件内部传递数据
对props中的属性值进行类型限制和必要性限制Person.propTypes = {name: React.PropTypes.string.isRequired,age: React.PropTypes.number.isRequired}
扩展属性: 将对象的所有属性通过props传递<Person {...person}/>

2.2. 组件的3大属性: refs

组件内包含ref属性的标签元素的集合对象
给操作目标标签指定ref属性, 打一个标识
在组件内部获得标签对象: this.refs.refName(只是得到了标签元素对象)
作用: 找到组件内部的真实dom元素对象, 进而操作它

2.3. 组件中的事件处理

1. 给标签添加属性: onXxx={this.eventHandler}
2. 在组件中添加事件处理方法eventHandler = (event) => {}
3. 使自定义方法中的this为组件对象在constructor()中bind(this)使用箭头函数定义方法
4. 事件监听绑定事件监听事件名回调函数触发事件用户对对应的界面做对应的操作编码

2.4. 组件的组合使用

1)拆分组件: 拆分界面,抽取组件
2)实现静态组件: 使用组件实现静态页面效果
3)实现动态组件① 动态显示初始化数据② 交互功能(从绑定事件监听开始)

2.5. 组件收集表单数据

受控组件: 输入过程中自动收集数据
非受控组件: 提交时手动读取数据

2.6. 组件的生命周期

1. 组件的三个生命周期状态:Mount:插入真实 DOMUpdate:被重新渲染Unmount:被移出真实 DOM
2. 生命周期流程:* 第一次初始化显示: ReactDOM.render(<Xxx/>, containDom)constructor()componentWillMount() : 将要插入回调render() : 用于插入虚拟DOM回调componentDidMount() : 已经插入回调* 每次更新state: this.setState({})componentWillReceiveProps(): 接收父组件新的属性componentWillUpdate() : 将要更新回调render() : 更新(重新渲染)componentDidUpdate() : 已经更新回调* 删除组件: ReactDOM.unmountComponentAtNode(div): 移除组件componentWillUnmount() : 组件将要被移除回调
3. 常用的方法render(): 必须重写, 返回一个自定义的虚拟DOMconstructor(): 初始化状态(state={}), 绑定this(可以箭头函数代替)componentDidMount() : 只执行一次, 已经在dom树中, 适合启动/设置一些监听

在这里插入图片描述

2.7. 虚拟DOM与DOM diff算法

1). 虚拟DOM是什么?

一个虚拟DOM(元素)是一个一般的js对象, 准确的说是一个对象树(倒立的)
虚拟DOM保存了真实DOM的层次关系和一些基本属性,与真实DOM一一对应
如果只是更新虚拟DOM, 页面是不会重绘的

2). Virtual DOM 算法的基本步骤

用JS对象树表示DOM树的结构;然后用这个树构建一个真正的DOM树插到文档当中
当状态变更的时候,重新构造一棵新的对象树。然后用新的树和旧的树进行比较,记录两棵树差异
把差异应用到真实DOM树上,视图就更新了

3). 进一步理解

Virtual DOM 本质上就是在 JS 和 DOM 之间做了一个缓存。
可以类比 CPU 和硬盘,既然硬盘这么慢,我们就在它们之间加个缓存:既然 DOM 这么慢,我们就在它们 JS 和 DOM 之间加个缓存。CPU(JS)只操作内存(Virtual DOM),最后的时候再把变更写入硬盘(DOM)。
在这里插入图片描述

2.8. 命令式编程与声明式编程

声明式编程只关注做什么, 而不关注怎么做(流程),  类似于填空题
命令式编程要关注做什么和怎么做(流程), 类似于问答题var arr = [1, 3, 5, 7]
// 需求: 得到一个新的数组, 数组中每个元素都比arr中对应的元素大10: [11, 13, 15, 17]
// 命令式编程
var arr2 = []
for(var i =0;i<arr.length;i++) {arr2.push(arr[i]+10)
}
console.log(arr2)
// 声明式编程
var arr3 = arr.map(function(item){return item +10
})
// 声明式编程是建立命令式编程的基础上// 数组中常见声明式方法map() / forEach() / find() / findIndex()

面试法宝

很多伙伴找到我询问面试题,问我针对于前端有没有比较体系化的面试题总结,今天就给大家推荐这款面试法宝
点击链接直达

https://www.nowcoder.com/link/jihexinliang260

就是我们的牛客网,各大互联网大厂面试真题。从基础到入阶乃至原理刨析类面试题 应有尽有,赶快来装备自己吧!助你面试稳操胜券,solo全场面试官
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/248486.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Web前端JQuery面试题(一)

Web前端JQuery面试题&#xff08;一&#xff09; 一&#xff1a;选择器 基本选择器 什么是#id&#xff0c;element&#xff0c;.class&#xff0c;*&#xff0c;selector1, selector2, selectorN&#xff1f;答&#xff1a; 根据给定的id匹配一个元素&#xff0c;用于搜索&…

前端云原生——微信小程序云服务配置

前端同样涉及云原生前言创建使用云开发项目搭建云环境测试云服务1. 获取openid&#xff08;上传本地login云函数&#xff09;1.1 创建部署login文件时报错2. 自定义sum函数并创建部署3. 上传图片4. 前端操作数据库5. 即时通信demo面试法宝欢迎各位小伙伴们&#xff01; 为大家推…

45天带你玩转Node(第一天)初探Node.js

45天带你玩转Node 粉丝要求博主系统的写一篇关于Node.js的学习资料&#xff0c;但其实我们的Node.js知识点并不少&#xff0c;所以博主为大家搭建了一个专栏&#xff0c;为了方便大家系统的学习Node.js&#xff0c;大家记得订阅哦&#xff01;虽然我们的Node.js还很年轻&#…

【转载】 安卓版手机微信如何清理微信空间

在手机微信的使用过程中&#xff0c;随着手机微信使用的时间越长&#xff0c;手机微信占用的空间越大&#xff0c;其实手机微信存储了很多聊天记录包括图片、视频等大文件信息&#xff0c;此时如果手机存储空间比较紧张&#xff0c;可以使用微信自带的清理工具对手机微信空间进…

45天带你玩转Node(第二天)走进Node.js

45天带你玩转Node 粉丝要求博主系统的写一篇关于Node.js的学习资料&#xff0c;但其实我们的Node.js知识点并不少&#xff0c;所以博主为大家搭建了一个专栏&#xff0c;为了方便大家系统的学习Node.js&#xff0c;大家记得订阅哦&#xff01;虽然我们的Node.js还很年轻&#…

深入Vue原理_数据响应式

欢迎各位小伙伴们&#xff01; 为大家推荐一款刷题神奇哦 点击链接访问牛客网 各大互联网大厂面试真题。从基础到入阶乃至原理刨析类面试题 应有尽有&#xff0c;赶快来装备自己吧&#xff01;助你面试稳操胜券&#xff0c;solo全场面试官 数据响应式响应式是什么如何实现数据响…

python scipy样条插值函数大全(interpolate里interpld函数)

scipy样条插值 scipy样条插值1、样条插值法是一种以可变样条来作出一条经过一系列点的光滑曲线的数学方法。插值样条是由一些多项式组成的&#xff0c;每一个多项式都是由相邻的两个数据点决定的&#xff0c;这样&#xff0c;任意的两个相邻的多项式以及它们的导数(不包括仇阶导…

EKS独领风骚

前言 随着公司的逐渐发展&#xff0c;开拓了更加多的子项目与小程序&#xff0c;这些都需要进行宣传&#xff0c;但是管理以及部署新的应用是一个繁琐的工程&#xff0c;部署麻烦而且更新业务的时候非常不方面。尤其面向用户的时候&#xff0c;体验感很差。于是想要使用docker…

Linux进程管理之ps的使用

主题Linux进程管理之ps工具的使用 一ps工具的介绍 ps: process state 进程状态ps - report a snapshot of the current processesLinux系统各进程的相关信息均保存在/proc/PID目录下的各文件中 默认显示的内容很少 [rootcentos65 ~]# psPID TTY TIME CMD2018 pts/0 …

openstack Q版部署-----安装报错问题

1、实例开机提示找不到磁盘Booting from Hard Disk... GRUB. 开启 CPU 虚拟化支持。 将计算节点 nova.conf 配置修改如下即可&#xff1a; [libvirt] cpu_mode none virt_type qemu重启服务 systemctl restart libvirtd.service openstack-nova-compute.service 2、错误: 超过…

深入Vue原理_双向数据绑定(视图/数据)

欢迎各位小伙伴们&#xff01; 为大家推荐一款刷题神奇哦 点击链接访问牛客网 各大互联网大厂面试真题。从基础到入阶乃至原理刨析类面试题 应有尽有&#xff0c;赶快来装备自己吧&#xff01;助你面试稳操胜券&#xff0c;solo全场面试官 文章目录数据的变化反应到视图命令式操…

大厂直通车【C认证】踵磅来袭

欢迎各位小伙伴们&#xff01; 首先为大家推荐一款刷题神奇哦 点击链接访问牛客网 各大互联网大厂面试真题。从基础到入阶乃至原理刨析类面试题 应有尽有&#xff0c;赶快来装备自己吧&#xff01;助你面试稳操胜券&#xff0c;solo全场面试官 你还在以为CSDN仅仅是一个简简单单…

深入Vue原理_全面剖析发布订阅模式

文章目录发布订阅模式优化优化思路思考理解发布订阅模式(自定义事件)收集更新函数触发更新函数6.5 总结总结写在最后本期推荐欢迎各位小伙伴们&#xff01; 为大家推荐一款刷题神奇哦 点击链接访问牛客网 各大互联网大厂面试真题。从基础到入阶乃至原理刨析类面试题 应有尽有&a…

web前端发展历程

总览前端发展史前言浏览器的发展史走进前端HTMLCSSjavaScript小前端时代大前端时代写在最后前言 目前在IT公司中前端的岗位越来越成为不可或缺的&#xff0c;前端的地位也愈见明显&#xff0c;很多学校已经体系的传授前端课程&#xff0c;众多培训机构也将前端知识作为了主流课…

修改wordpress上传文件大小限制

1. 登陆wordpress使用的数据库&#xff0c;切换到使用的database 2. 操作如下&#xff1a; > select meta_key from wp_sitemeta; > select meta_key,meta_value from wp_sitemeta where meta_keyfileupload_maxk; 修改为20M: > update wp_sitemeta set meta_value204…

php的符号的排序大小

转载于:https://www.cnblogs.com/cjjjj/p/10433334.html

浅谈 HTTP 和 HTTPS

很多前端伙伴问题有没有体系的面试题&#xff1f; 今天为大家推荐一款刷题神奇哦 点击链接访问牛客网 各大互联网大厂面试真题。从基础到入阶乃至原理刨析类面试题 应有尽有&#xff0c;赶快来装备自己吧&#xff01;助你面试稳操胜券&#xff0c;solo全场面试官 浅谈 HTTP 和 …

Ubuntu 搭建 GitLab 笔记 ***

简介 GitLab 社区版可以提供许多与 GitHub 相同的功能&#xff0c;且部署在属于自己的机器上&#xff0c;我们会因为网络及其他一些问题而不便使用 GitHub &#xff0c;这时部署一个 GitLab 是最好的选择。 下载 GitLab 并安装 我的环境是 Ubuntu 16.04 下进行部署操作。 GitLa…

在浏览器输入URL到页面展示发生了什么?

输入URL后查询缓存DNS服务器TCP三次握手HTTP协议包浏览器处理HTML文档TCP 和 UDP 的区别写在最后很多前端伙伴问题有没有体系的面试题&#xff1f; 今天为大家推荐一款刷题神奇哦 点击链接访问牛客网 各大互联网大厂面试真题。从基础到入阶乃至原理刨析类面试题 应有尽有&#…

iOS 高级去水印,涂鸦去水印

目前在研究一下图像的处理&#xff0c;看了一下相关的软件&#xff0c;比如&#xff1a;《去水印大师》&#xff0c;究竟去水印是怎么处理的呢&#xff1f;看图分析。 一共是三个功能&#xff1a;快速去水印、高级去水印、涂鸦去水印 快速去水印&#xff1a;暂时没找到好的处理…