![React.js 16从入门到实战](https://wfqqreader-1252317822.image.myqcloud.com/cover/135/29977135/b_29977135.jpg)
4.5 自我更新的时钟UI类
在前一节中,我们实现了可封装的React时钟UI的自动更新,主要是通过定时器功能实现的。不过,对于完美主义者还是不够理想,与React框架的设计理念也有很大的差距。
我们理想的形式是仅仅定义一个时钟组件,该时钟组件可以自我更新,将其渲染到页面中就是一个真正的时钟UI。因此,具体的代码形式大致如下:
【代码4-8】
![](https://epubservercos.yuewen.com/27D3F5/16499866705998906/epubprivate/OEBPS/Images/Figure-P81_11973.jpg?sign=1739420947-9ZJcfc83XfSu1rYikQTQzpThvaS5VdTJ-0-0bdc139e2120ca3f230988a1b04fd188)
关于【代码4-8】的说明:
●第04行代码定义的<Clock />就是我们想要的、可封装、可重用的时钟组件。这个时钟组件在渲染到页面中之后,是完全可以自我更新的。
为了实现这个可自我更新的时钟UI,我们需要将函数组件转换为ES6类组件,这个类组件具有自我更新的功能。
(1)需要创建一个ES6组件类,并且继承于React.Component,具体的代码形式如下:
【代码4-9】
![](https://epubservercos.yuewen.com/27D3F5/16499866705998906/epubprivate/OEBPS/Images/Figure-P82_12009.jpg?sign=1739420947-6JEZJSbWYgaLPgDQhGBbCGlM685ITFNJ-0-a3b595e1b08eb23b181c54b935b4db62)
关于【代码4-9】的说明:
●第02行代码,定义的时钟组件类(ClockReactComp)。
●第04行代码,通过render()方法将时钟组件类(ClockReactComp)渲染到页面中进行显示。
(2)在刚刚创建的时钟组件类(ClockReactComp)中定义render()方法,并将之前时钟函数组件的内容加进去,具体的代码形式如下:
【代码4-10】
![](https://epubservercos.yuewen.com/27D3F5/16499866705998906/epubprivate/OEBPS/Images/Figure-P82_12035.jpg?sign=1739420947-UUEUWAECv6rbM735uUwCART4D2CaL6bl-0-1676a38e7b6351d97c183e08677982a7)
关于【代码4-10】的说明:
●第03~10行代码,通过render()方法定义的、所渲染的时钟函数组件的内容。
●另外,由于在ES6组件类中无法显式地定义Props参数,需要在props参数前使用this关键字引用。
(3)到这步为止,一个可自我更新的时钟组件类(ClockReactComp)的雏形就基本完成了,然后借助【代码4-7】的机制通过定时器来实现时钟的自我更新,完整的代码形式如下:
【代码4-11】(详见源代码目录ch04-react-state-clock-class.html文件)
![](https://epubservercos.yuewen.com/27D3F5/16499866705998906/epubprivate/OEBPS/Images/Figure-P83_12127.jpg?sign=1739420947-DuvGdbBMsk5zQMxjpnpzwNCpmVUd1Hzx-0-99efe7d8786e34f929e545d62568290b)
关于【代码4-11】的说明:
●第29~34行代码是autoClock()函数的实现过程,通过调用时钟组件类(ClockReactComp())来显示页面时钟,并借助Props参数来传递时间。
●在第36行代码中,通过定义计时器来实现时钟组件类(ClockReactComp())的自我更新。
测试网页的效果如图4.3所示。如图中的箭头所示,通过可自我更新的时钟组件类也可以实现同样的效果。同时,关键的地方是【代码4-11】通过ES6 Class形式定义的时钟组件,更接近我们理想中的React时钟组件了。
![](https://epubservercos.yuewen.com/27D3F5/16499866705998906/epubprivate/OEBPS/Images/Figure-P84_12391.jpg?sign=1739420947-gUKxxpPoAHxomztAQz69prOVw34ljN8I-0-652091421b19ef0393f07c53bc629c1e)
图4.3 React时钟组件类