Reactjs 踏坑指南1: 一些概念

Reactjs 踏坑指南1: 知识点

  • 什么是React
  • 虚拟DOM
  • JSX
  • 组件
  • 生命周期和状态
  • 事件
  • 单项数据流
  • Reactjs和Angularjs的对比

React简介

React是一个Facebook开发的UI库。使用这个库可以很方便的开发交互式的、具有表达力的和可重用的UI组件。本身并不是一个框架,可视为是视图层,并且是一个以组件为基础的高效视图。对于React应用而言,你需要分割你的页面,使其成为一个个的组件。也就是说你的应用是由一个个组件构成的。这种分割、复用组件的方式开发页面,我们称之为组件驱动开发

这个库还使用了一种叫做虚拟DOM(Virtual DOM)的概念,这些DOM可以根据状态有选择的渲染。这样,页面就会尽量的减少DOM操作而达到保持页面状态的效果。

  • React JSFiddle 在线编辑工具
  • React 入门示例

虚拟DOM

用于优化视图的渲染和刷新。以前我们更新视图时,需要先清空DOM容器中的内容,然后将最新的DOM和数据追加到容器中,现在React将这一操作放到了内存中。

详细说明一下:

虚拟 DOM 是在 DOM 的基础上建立了一个抽象层,我们对数据和状态所做的任何改动,都会被自动且高效的同步到虚拟 DOM,最后再批量同步到 DOM 中。

React 会在内存中维护一个虚拟 DOM 树,当我们对这个树进行读或写的时候,实际上是对虚拟 DOM 进行的。当数据变化时,然后 React 会自动更新虚拟 DOM,然后拿新的虚拟 DOM 和旧的虚拟 DOM 进行对比,找到有变更的部分,得出一个Patch,然后将这个 Patch 放到一个队列里,最终批量更新这些 Patch 到 DOM 中。

这样的机制可以保证即便是根节点数据的变化,最终表现在 DOM 上的修改也只是受这个数据影响的部分,可以保证非常高效的渲染。

  • 关于虚拟DOM diff算法的详细分析

因为React使用了虚拟DOM,因此借助这种方式使得在服务端渲染输出HTML成为可能。

JSX

JSX在ECMAScript的基础上提供了类似于XML的扩展。

  • JSX in depth

组件

使用ReactDOM的render方法的时候,第一个参数是需要渲染的我们创建的组件,第二个是HTML的DOM节点,组件渲染之后在这里添加。我们可以使用createClass方法创建组件。

var MyComponent = React.createClass({render: function(){return (<h1>Hello, world!</h1>);}
});
复制代码

注意:

  • 类名一定要首字母大写
  • 添加组件属性时,如果要使用class属性和for属性,属性名不能直接用class和for,因为他们两个是javascript的关键字,用className和htmlFor代替

组件创建好之后就可以在文档里渲染出来了:

ReactDOM.render(<MyComponent />,document.getElementById('mount-point')
);
复制代码

创建组件的时候,可以给组件添加一些属性,这些属性都存在于props中。这些属性可以通过this.props在组件内访问,也可以在render方法渲染时使用。

var MyComponent = React.createClass({render: function(){return (<h1>Hello, {this.props.name}!</h1>);}
});ReactDOM.render(<MyComponent name="handsome" />,document.getElementById('mount-point')
);
复制代码

生命周期和状态

生命周期

  • componentWillMount 在渲染之前调用一次。
  • componentDidMount 在渲染之后调用一次。
  • shouldComponentUpdate 返回值决定组件是否需要update。
  • componentWillUnmount 在卸载组件之前调用。

状态

  • getInitialState 返回State的初始值。
  • getDefaultProps 获取props的初始值。
  • mixins 一组对象,主要用来扩展当前组件的功能。

每一个组件都包含一个state对象和一个props对象。State(状态)用setState方法设置。调用setState方法会触发UI的更新,也是实现交互式开发的必要基础。如果我们要在一开始设定初始状态(initial state),可以调用getInitialState方法。

state用来在创建组件的时候设置属性,props用于渲染的时候生成想组件绑定属性?

var MyComponent = React.createClass({getInitialState:function(){return {count: 5};},render: function(){return (<h1>Hello, {this.state.count}!</h1>);}
});
复制代码

事件

作为属性包含在组件中

var Counter = React.createClass({incrementCount: function(){this.setState({count: this.state.count + 1});},getInitialState: function(){return {count: 0}},render: function(){return (<div class="my-component"><h1>Count: {this.state.count}</h1><button type="button" onClick={this.incrementCount}>Increment</button></div>);}
});ReactDOM.render(<Counter />,document.getElementById('mount-point')
);
复制代码

单向数据流

在jquery时代,我们都是基于事件驱动,对于简单的交互需求而言,这确实足够了,而且开发起来非常迅速。但业务一旦复杂,这种基于事件驱动的东西就会变得很乱,页面需要更新的DOM很多,就容易出错。

单向数据流的概念就出现了。更新 DOM 的数据总是从顶层流下来,用户事件不直接操作 DOM,而是操作顶层数据。这些数据从顶层流下来同时更新了DOM。你的代码就很少会直接处理DOM,而是只处理数据的变更。这样会很大程度上简化代码和逻辑。

举个例子:我点击一个button,然后页面上一个span里数字+1,原有的思考逻辑是“点击发生,然后数据变化,然后UI跟着变化+1”。而现在的思考逻辑是我的数据变化了,那么我的UI会自动更新,那么我只用考虑“点击发生,数据变化”。甚至可以把UI和数据变化分层然后处理。

具体地说:

在一个多组件结构里,一个父组件需要负责管理状态,并把数据通过props向下发放。

组件的状态通过setState方法更新。数据通过设置子组件的属性来传递给子组件,子组件通过this.props来获取这些数据

例子1: 实现一个动态查找框

var FilteredList = React.createClass({filterList: function(event){var updatedList = this.state.initialItems;updatedList = updatedList.filter(function(item){return item.toLowerCase().search(event.target.value.toLowerCase()) !== -1;});this.setState({items: updatedList});},getInitialState: function(){return {initialItems: ["Apples","Broccoli","Chicken","Duck","Eggs","Fish","Granola","Hash Browns"],items: []}},componentWillMount: function(){this.setState({items: this.state.initialItems})},render: function(){return (<div className="filter-list"><input type="text" placeholder="Search" onChange={this.filterList}/><List items={this.state.items}/></div>);}
});var List = React.createClass({render: function(){return (<ul>{this.props.items.map(function(item) {return <li key={item}>{item}</li>})}</ul>)  }
});ReactDOM.render(<FilteredList/>, document.getElementById('mount-point'));
复制代码

React和Angular的对比

Angular是框架,React是类库。ng是一个完整的框架,提供了比 React 多得多的建议和功能,你只需要直接使用就可以了。而要用React,开发者通常还需要借助别的类库来打造一个真正的应用。比如你可能需要react-router库来处理路由、redux或flux管理state、额外的库做测试以及管理依赖等等。 "如果仅从框架这一点来看,选择Angular还是React就像选择直接购买成品电脑还是买零件自己组装一样。"

在大小方面,由于ng是一个大而全的框架,自带了更多的功能。而React只加载你需要的部件,react要比ng小得多。很多应用其实用不到这种大型框架提供的所有功能。在这个越来越拥抱微服务、微应用、单一职责模块(single-responsibility packages)的时代,React 通过让你自己挑选必要模块,让你的应用大小真正做到量身定做。

React以JavaScript为中心,把"HTML"放到JS里,JavaScript远比HTML要强大。因此,增强JavaScript让其支持标签要比增强HTML让其支持逻辑要合理得多。无论如何,HTML与JavaScript 都需要某种方式以粘合在一起。 Angular是以HTML而非JavaScrip为中心的,把“JS”放到HTML里。你必须学习学一大堆Angular特有的语法(标签),即ng框架特有的HTML补丁(shim),比如为HTML加入了循环语义的HTML特性。而React只需要你懂JS。

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

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

相关文章

Linux为什么受欢迎?

1、Linux以高效和灵活著称&#xff0c;实现了几乎全部的Unix特性&#xff0c;同时具备多任务&#xff0c;多用户的能力&#xff0c;支持多线程&#xff0c;多CPU架构。 2、Linux操作系统软件包&#xff1a;包含了文本编辑器&#xff0c;高级语言编译器&#xff0c;以及X-Windo…

直播的学习与使用-----采集

// 捕获音视频 - (void)setupCaputureVideo { // 1.创建捕获会话,必须要强引用&#xff0c;否则会被释放 AVCaptureSession *captureSession [[AVCaptureSession alloc] init]; _captureSession captureSession; // 2.获取摄像头设备&#xff0c;默认是后置摄像头 AVCaptureD…

html css js编程顺序,html css js先学哪个呢?

前端开发三剑客为 HTML、CSS、JavaScript。这三门语言的掌握对前端开发程序员来说是必须的&#xff0c;但有不少同学不懂得先学习哪一门语言。那么这篇文章 w3cschool 小编就来为你解答一下 HTML、CSS、JavaScript 先学哪个的问题。首先需要学习的是 HTML&#xff0c;HTML 是开…

苹果手机收不到推送信息_iPhone手机收不到正式版系统更新推送怎么办?(附解决方法)...

有不少热衷于升级系统的小伙伴&#xff0c;希望在第一时间升级到最新版 iOS 系统进行体验&#xff0c;但难免也会遇到无法收到更新推送的问题。主要有以下原因。iPhone手机收不到正式版系统更新推送怎么办?网络状况不佳如果当前网络状况不好&#xff0c;可能无法收到来自苹果官…

Linux系统特点介绍集合

1、开源代码程序&#xff0c;可自由修改。 2、Unix系统兼容&#xff0c;具备Unix几乎所有优秀特性&#xff0c;同Unix指令集。 3、可自由传播&#xff0c;无任何商业版权制约。 4、适合Intel等x86 CPU系列架构的计算机。 5、一个完善的多用户&#xff0c;多任务&#xff0c…

火狐 移动 html 元素,python中的Firefox+Selenium:如何交互式地获取元素html?

Im使用PythonSeleniumSplinterFirefox创建一个交互式web爬虫。在python脚本提供了选项&#xff0c;然后Selenium打开Firefox并发送一些命令。在现在&#xff0c;我需要让python脚本知道用户想要与之交互的web元素。在我目前使用的方法是&#xff1a;Right-click the item in th…

瘦子的肠道菌群和胖子的区别_瘦子和病态肥胖患者肠道菌群组成和潜在功能的显著差异...

10.1111/joim.1313707-07, ArticleAbstract & Authors:展开Abstract:收起Introduction:The gut microbiome may contribute to the development of obesity. So far, the extent of microbiome variation in people with obesity has not been determined in large cohorts…

Centos下载地址

下载地址&#xff1a; 从阿里镜像网站上下载 http://mirrors.aliyun.com/centos/ 建议选用Centos 6.x windows电脑配置&#xff1a;至少4G内存&#xff0c;i5处理器或以上。 Linux虚拟机分配&#xff1a;内存128M~1024M&#xff0c;cpu 1核心&#xff0c;硬盘8g即可。

html分块时边距的设置,html – 文本节点后第一个块的边距(垂直空间)?

我不确定你是否会认为这是对你的问题的完整答案,因为我知道你正在使用< td>在您的示例中,< td>之间存在一个差异.和< dd>或者< li>元素是< td>的事实.在不破坏< table>的情况下,元素不能与其周围元素相抵消具体行为.但至少我可以回答你的第…

实现连麦_微信重磅更新,视频号直播连麦打赏美颜上线,新增巨大流量入口

12月23日晚&#xff0c;微信迎来重大改版&#xff01;在最新7.0.20版本的微信中&#xff0c;视频号大招不断&#xff0c;不仅上线了连麦功能&#xff0c;支持美颜瘦脸、打赏等功能。此外&#xff0c;微信还给视频号开放了两个重大入口&#xff0c;包括微信个人名片和“发现”ta…

VMware Workstation 网络设置解释三种

一、NAT Network Address Translation&#xff0c;网络地址转换&#xff0c;NAT模式是比较简单的实现虚拟机上网的方式&#xff0c;NAT模式的虚拟机时通过物理电脑上网和交换数据的。 在NAT模式下&#xff0c;虚拟机的网卡连接到物理机的VMware上&#xff0c;此时VMware软件的…

cuda 核函数 for循环_【CUDA 基础】4.4 核函数可达到的带宽

Abstract: 本文通过矩阵转置这一个例子&#xff0c;调整&#xff0c;优化核函数&#xff0c;使其达到最优的内存带宽Keywords: 带宽&#xff0c;吞吐量&#xff0c;矩阵转置开篇废话下面是废话&#xff0c;与本文知识无关&#xff0c;可以直接跳到下面红字处开始本文知识的学习…

小程序 - swiper除了左右切换还有上下滚动超出屏幕的内容

本来呢&#xff0c;我是有专门整理小程序恶心bug的文章的&#xff0c;每次只要添加汇总就好&#xff0c; 但是呢&#xff0c;鉴于这个问题的恶心程度&#xff0c;所以我把他单独拿出来说了。 ——————————————--------------------------------------------------产…

学徒学计算机,那个有能力的高人愿意收我做学徒啊,我是学计算机的

类似问题答案我学的是计算机专业&#xff0c;南京有那些学校招这个专业啊&#xff1f;跟随 已跟随 取消 确定 你是说去学习还是去工作&#xff1f; 如果工作&#xff0c;现在很多对学位有一定要求&#xff0c;一般都要本科以上&#xff1b; 如果是学习&#xff0c;那也得看你自…

Linux磁盘分区及要求

一、分区 1、磁盘分区有主分区&#xff0c;扩展分区和逻辑分区之分。一块磁盘最多有4个主分区&#xff0c;其中一个主分区的位置可以用一个扩展分区替换&#xff0c;在这个扩展分区内可以划分多个逻辑分区。 2、一块磁盘最多只能有一个扩展分区&#xff0c;扩展分区不能直接使…

二分查找和二叉查找树

2019独角兽企业重金招聘Python工程师标准>>> 1 二分查找 算法思想&#xff1a; 二分查找要求元素排列有序。首先&#xff0c;假设表中元素是按升序排列&#xff0c;将数组中间位置的元素与查找关键字比较&#xff0c;如果两者相等&#xff0c;则查找成功&#xff1…

springboot判断有没有库_Springboot 使用JPA @Query 注解 查询语句条件 有可能为空,Oracle数据库...

网上查了很多资料都是下面的方法,但是不适用于OracleQuery(value "select * from xxx where if(?1 !,x1?1,11) and if(?2 !,x2?2,11)" "and if(?3 !,x3?3,11) ",nativeQuery true)List find(String X1,String X2,String X3);——————————…

台式计算机技术方案,2017年4月自考02316计算机应用技术真题及答案

本文提供的是2017年4月自考02316计算机应用技术真题及答案&#xff0c;真题不仅能帮助考生复习巩固学到的知识&#xff0c;还能让考生了解以往考试难易程度&#xff0c;真正掌握一套真题那么考试也不用担心了。要考试的你一定要多多练习啊。2017 年 4 月高等教育自学考试全国统…

Linux磁盘编号

一、IDE接口磁盘 Linux的编码规则是 /dev/hd* -------------------------------hda 第一块盘 -------------------------------------------hda1 第一分区&#xff0c;hda2 第二分区&#xff0c;hda3 第三分区..... -------------------------------hdb 第二块盘 …

Linux挂载点和文件系统类型介绍

一、挂载点 Mount Point 这是Linux下访问磁盘分区的入口&#xff0c;即如果要往分区里写入数据&#xff0c;就必须通过/boot入口来写入&#xff0c;这一点和windows是不同的&#xff0c;因为在安装Linux时&#xff0c;Mount Point项填写 /boot二、文件系统类型 1、ext2/3/4&…