在学习和使用React之前,对React有一个基本的认识,会让你更快地学习React的内容,也会更快地掌握React的使用方式。
React是什么
React 是一个声明式,高效且灵活的用于构建用户界面的 JavaScript 库。
React 起源于 Facebook 的内部项目,因为该公司对市场上所有 JavaScript MVC 框架,都不满意,就决定自己写一套,用来架设Instagram 的网站。做出来以后,发现这套东西很好用,就在2013年5月开源了。(源于百度百科)
在当前的前端比较流行的框架(React,Vue,Angular)当中,React占据了相当一部分比重。
删 React遵循组件设计模式、声明式编程范式和函数式编程概念,以使前端应用程序更高效。它使用虚拟DOM来有效地操作DOM。它遵循从高阶组件到低阶组件的单向数据流。
React拥有以下几个特点:
- 声明式设计:声明范式
- 高效:使用VDOM,减少DOM的交互
- 灵活:与已知的库或框架完好配合
- JSX:一种独立的语言,试图解决很多JS的缺陷,ES6包含了几乎所有JSX的特性
- 组件:代码复用
- 单向响应数据流:比双向绑定更简单,更快。
React也有不好的地方,那就是对于一直使用JS,jQuery的传统前端,React非常不友好,React强调组件和状态管理;而且React的学习成本较Vue.js高。
React有些什么内容
1. jsx
jsx算是React的一大特点,特别之处在于jsx可以让我们在js中写html语言。大致像这样:
const username = (<span>{username}</span>);
这种形式有一个好处就是,可以部分防范XSS攻击(跨站脚本注入攻击)。因为当你尝试通过{html}进行插入html代码时, React会自动将html转为字符串;而且jsx是通过传入函数作为事件处理方式,而不是传入字符串,字符串可能包含恶意代码。
2. 组件
使用 React 可以将一些简短、独立的代码片段组合成复杂的 UI 界面,这些代码片段被称作“组件”。React 应用都是构建在组件之上。
组件中有两个核心概念,一个是state,另一个是props。
state是组件当前的状态。什么叫状态呢?状态大致可以理解为组件当前的行为。比如一个人现在正在躺着,那么躺着这就是他的状态,那他要是改变状态了,他翻了个身,那么他的姿势就不是刚才的姿势了,所以就需要对state进行改变。
值得注意的是,state不建议被直接进行修改。官方规定需要使用setState({ state: newState })这个方法来对state进行修改。否则会造成不可预测的错误。
那么什么样的数据属性可以当作状态?
当更改这个状态(数据)需要更新组件 UI 的就可以认为是 state,下面这些可以认为不是状态:
- 可计算的数据:比如一个数组的长度
- 和 props 重复的数据:除非这个数据是要做变更的
props是组件接收到的属性,是由外部通过 JSX 属性传入设置,一旦初始设置完成,就可以认为 this.props 是不可更改的,所以不要轻易更改设置 this.props 里面的值。如何接收到外部传入的props呢?需要我们在定义constructor的时候,使用super(props)进行接收。并且是只要有定义constructor,那么必须使用super去接收props。不定义构造器的话,组件也会默认生成一个构造器。
还有一种组件是不存在state的,叫做无状态组件。这种组件没有状态,没有生命周期,只是简单的接受 props 渲染生成 DOM 结构。无状态组件非常简单,开销很低,如果可能的话尽量使用无状态组件。比如使用箭头函数定义:
const addSum = (props) =>
<span>
{props.num1 + props.num2 = (props.num1 + props.num2)}
</span>;
render(<HelloMessage num1={1} num2={2} />, mountNode);
因为无状态组件只是函数,所以它没有实例返回。
3. Virtual DOM
Virtual DOM是一个 JavaScript DOM 模型,支持元素创建,区别计算和分支操作,提供高效的渲染。 Virtual DOM的核心思想是:批量操作DOM和作用最少的diff
首先我们得意识到,直接更新DOM很影响性能。Virtual DOM本质上就是在JS和DOM之间做了一个缓存。
React只在调用setState时会更新virtual DOM,当要更新组件的时候,会通过 diff 寻找到要变更的 DOM 节点,再把这个修改更新到浏览器实际的 DOM 节点上。所以偶尔组件并没有实现更新,很有可能是由于diff算法并不能识别节点是否发生了变化,所以需要对组件添加key属性,有助于diff算法的有效识别。
(暂时分析这么多,如果有错误希望能被指出,健康你我他)