React基本认识(七日打卡)

546 阅读4分钟

在学习和使用React之前,对React有一个基本的认识,会让你更快地学习React的内容,也会更快地掌握React的使用方式。

React是什么

React 是一个声明式,高效且灵活的用于构建用户界面的 JavaScript 库。

React 起源于 Facebook 的内部项目,因为该公司对市场上所有 JavaScript MVC 框架,都不满意,就决定自己写一套,用来架设Instagram 的网站。做出来以后,发现这套东西很好用,就在2013年5月开源了。(源于百度百科)

在当前的前端比较流行的框架(React,Vue,Angular)当中,React占据了相当一部分比重。

删 React遵循组件设计模式、声明式编程范式和函数式编程概念,以使前端应用程序更高效。它使用虚拟DOM来有效地操作DOM。它遵循从高阶组件到低阶组件的单向数据流。

React拥有以下几个特点:

  1. 声明式设计:声明范式
  2. 高效:使用VDOM,减少DOM的交互
  3. 灵活:与已知的库或框架完好配合
  4. JSX:一种独立的语言,试图解决很多JS的缺陷,ES6包含了几乎所有JSX的特性
  5. 组件:代码复用
  6. 单向响应数据流:比双向绑定更简单,更快。

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算法的有效识别。

(暂时分析这么多,如果有错误希望能被指出,健康你我他)