React 初探(二) - 组件、DOM diff 、setSt

2019-01-07  本文已影响21人  bowen_wu

概述

当页面中东西很多时,我们需要写大量的 JSX 到我们的 ReactDom.render() 中,这样会造成页面的冗长,所以需要组件来解决这个问题。

组件可以将 UI 拆分成独立的、可复用的部分,并且单独考虑每个部分。组件从概念上看就像是函数,它可以接收任意的输入值(称之为 props),并返回一个需要在页面上展示的 React 元素

写一个组件

在线运行

function component

当有了组件之后,我们便有很多的可能性。demo2在线运行,注意:组件的返回值只能有一个根元素。

function component 嵌套

这里我们使用三个组件,App 组件引用了 Box1Box2 组件。

注意:

props 传参

demo在线运行

props 传参
当调用自定义组件时,React 会将 JSX 属性作为对象(props) 传递给该组件。

注意:

React 独到的点:标签就是函数,函数就是对象,标签的属性就是函数的参数。

class component

上述的 demo 在运行的时候发现只要更改一个,另外一个也会进行相应的更改,原因在于两个组件引用了相同的 text,导致一个在改变 text 时,另一个也会改变.不可以通过 props 向两个组件传递 text 的值,因为组件不能修改自己的 props 。那么就需要创建一个作用域,将 text 放进作用域里面,那么将 text 放进函数中是否可以呢?

function component

在实际的运行过程中,却发现更改不了 text 的值,原因在于当更改了 text 的值之后,再次 render,造成了 text 的 init。点击前打开控制台,便可以看到,先 logchange,之后再 loginit,上述主要是 render 的时候 render 了整个 App那么如何做到即有自己的局部变量又可以进行局部 render 呢?这时便需要 class component 来解决了

class component demo

在线运行

class component

注意:

知道了如何进行 class component 的写法,就可以写出上面的例子了,demo代码在线运行,当使用 class component 的时候,可以有自己的局部变量,并可以进行局部更新

DOM diff

上述的例子中,当点击 change 按钮时,会调用绑定的 onButtonClick 函数,函数中会进行 setState,得到新的 state,新的 state 更新之后会调用 render 函数,render 函数只会更新 span,并且仅仅会更新更改的地方,其他的地方是不会进行更改的。每次 render 都会进行对比,和上一次的结果进行比较,只更改 state 变化的部分,这个找到哪里变化的过程,叫做DOM diff,找两次 render 结果不同之处的过程即是DOM diff

API

setState()

setState(updater[, callback])

关于 setState 需要知道以下几点:

优缺点

上一篇 下一篇

猜你喜欢

热点阅读