为了让代码更灵活,可以写更多的组件,我们把这种模式抽象出来,放到一个 Component 类当中:

  1. class Component {
  2. setState (state) {
  3. const oldEl = this.el
  4. this.state = state
  5. this.el = this._renderDOM()
  6. if (this.onStateChange) this.onStateChange(oldEl, this.el)
  7. }
  8. _renderDOM () {
  9. this.el = createDOMFromString(this.render())
  10. if (this.onClick) {
  11. this.el.addEventListener('click', this.onClick.bind(this), false)
  12. }
  13. return this.el
  14. }
  15. }

这个是一个组件父类 Component,所有的组件都可以继承这个父类来构建。它定义的两个方法,一个是我们已经很熟悉的 setState;一个是私有方法 _renderDOM_renderDOM 方法会调用 this.render 来构建 DOM 元素并且监听 onClick 事件。所以,组件子类继承的时候只需要实现一个返回 HTML 字符串的 render 方法就可以了。

还有一个额外的 mount 的方法,其实就是把组件的 DOM 元素插入页面,并且在 setState 的时候更新页面:

  1. const mount = (component, wrapper) => {
  2. wrapper.appendChild(component._renderDOM())
  3. component.onStateChange = (oldEl, newEl) => {
  4. wrapper.insertBefore(newEl, oldEl)
  5. wrapper.removeChild(oldEl)
  6. }
  7. }

这样的话我们重新写点赞组件就会变成:

  1. class LikeButton extends Component {
  2. constructor () {
  3. this.state = { isLiked: false }
  4. }
  5. onClick () {
  6. this.setState({
  7. isLiked: !this.state.isLiked
  8. })
  9. }
  10. render () {
  11. return `
  12. <button class='like-btn'>
  13. <span class='like-text'>${this.state.isLiked ? '取消' : '点赞'}</span>
  14. <span>
  15. React.js 小书 Lesson4 - 前端组件化(三):抽象出公共组件类的更多相关文章

      1. React.js 小书 Lesson17 - 前端应用状态管理 —— 状态提升
      1. 作者:胡子大哈 原文链接:http://huziketang.com/books/react/lesson17 转载请注明出处,保留原文链接和作者信息. 上一个评论功能的案例中,可能会有些同学会对一个 ...

      1. React.js 小书 Lesson2 - 前端组件化(一):从一个简单的例子讲起
      1. 作者:胡子大哈 原文链接:http://huziketang.com/books/react/lesson2 转载请注明出处,保留原文链接和作者信息. 很多课程一上来就给大家如何配置环境.怎么写 Re ...

      1. React.js 小书 Lesson3 - 前端组件化(二):优化 DOM 操作
      1. 作者:胡子大哈 原文链接:http://huziketang.com/books/react/lesson3 转载请注明出处,保留原文链接和作者信息. 看看上一节我们的代码,仔细留意一下 change ...

      1. React.js 小书 Lesson24 - PropTypes 和组件参数验证
      1. 作者:胡子大哈 原文链接:http://huziketang.com/books/react/lesson24 转载请注明出处,保留原文链接和作者信息. 我们来了到了一个非常尴尬的章节,很多初学的朋友 ...

      1. React.js 小书 Lesson22 - props.children 和容器类组件
      1. 作者:胡子大哈 原文链接:http://huziketang.com/books/react/lesson22 转载请注明出处,保留原文链接和作者信息. 有一类组件,充当了容器的作用,它定义了一种外层 ...

      1. React.js 小书 Lesson20 - 更新阶段的组件生命周期
      1. 作者:胡子大哈 原文链接:http://huziketang.com/books/react/lesson20 转载请注明出处,保留原文链接和作者信息. 从之前的章节我们了解到,组件的挂载指的是将组件 ...

      1. React.js 小书 Lesson19 - 挂载阶段的组件生命周期(二)
      1. 作者:胡子大哈 原文链接:http://huziketang.com/books/react/lesson19 转载请注明出处,保留原文链接和作者信息. 这一节我们来讨论一下对于一个组件来说,cons ...

      1. React.js 小书 Lesson18 - 挂载阶段的组件生命周期(一)
      1. 作者:胡子大哈 原文链接:http://huziketang.com/books/react/lesson18 转载请注明出处,保留原文链接和作者信息. 我们在讲解 JSX 的章节中提到,下面的代码: ...

      1. React.js 小书 Lesson8 - 组件的组合、嵌套和组件树
      1. 作者:胡子大哈 原文链接:http://huziketang.com/books/react/lesson8 转载请注明出处,保留原文链接和作者信息. 继续拓展前面的例子,现在我们已经有了 Heade ...

    1. 随机推荐

        1. android中SharedPreferences 读取不到数据的问题
        1. 在两个不同的 Activity中,A中SharedPreferences保存了数据,在A中可以读取到,但是在 B中却读取不到了,一直是空值,好是不爽,由于是按照书本上的例子写的, 怎么也找不到原因,后 ...

        1. webapi 返回json
        1. web api 默认的已 xml 格式返回数据 现在开发一般都是以 json 格式为主 下面配置让 webapi 默认返回 json ,在需要返回 xml 时只需要加一个查询参数 datatype=x ...

        1. JavaScript面向对象编程入门
        1. 来源极客网 function Person() { var _this = {} //创建一个空的对象,接着我们利用这个"空的对象"承载Person的属性和方法 _this.say ...

        1. gRPC官方文档(通讯协议)
        1. 文章来自gRPC 官方文档中文版 HTTP2 协议上的 gRPC 本文档作为 gRPC 在 HTTP2 草案17框架上的实现的详细描述,假设你已经熟悉 HTTP2 的规范.产品规则采用的是ABNF 语 ...

        1. UWP&WP8.1 基础控件——Border
        1. border 是边框控件 border是UWP和WP8.1最常用的控件之一. border字面意义是用来添加边框的. 基础用法 <border BorderThickness="1&q ...

        1. Hawk-and-Chicken 强连通
        1. 题意:一群人投票  票具有传递性  求出累计和最大的数和 哪几个人最大 强连通好题!!! 毫无疑问先强连通缩点 一开始打算拓扑排序求dis  但是发现拓扑排序会有重复累加的情况 那么就反向建图   当 ...

        1. 51nod1445(最短路)
        1. 题目链接: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1445 题意: 中文题诶~ 思路: 可以将每种颜色看作一个节点 ...

        1. 在PowerShell中操作SharePoint对象
        1. 1. 用PowerShell创建一个SharePoint内容对象创建一个自定义列表:$SPSite = New-Object Microsoft.SharePoint.SPSite("htt ...

        1. Android自动化----adb shell,appium,uiautomator2
        1. 1.区别 1,adb shell脚本的方式 不但可以在有电脑的情况下使用,通过数据线连接电脑然后adb shell命令,而且还可以打包成app,在手机的终端使用adb shell命令. 2,appiu ...

        1. Canvas制作动态进度加载水球
        1. <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...