资讯专栏INFORMATION COLUMN

JavaScript实现自定义的生命周期

QiShare / 3340人阅读

摘要:,和的流行,让生命周期这个名词常常出现在前端们的口中,以至于面试中最常见的一个问题也是介绍下的生命周期以及使用方法听起来高大上的生命周期,其实也就是一些普通的方法,只是在不同的时期传参调用它们而已。

React,Vue 和 Angular 的流行,让“生命周期”这个名词常常出现在前端们的口中,以至于面试中最常见的一个问题也是:

介绍下React, Vue的生命周期以及使用方法?

听起来高大上的“生命周期”,其实也就是一些普通的方法,只是在不同的时期传参调用它们而已。我们可以照着React的生命周期,自己模拟一个简单的类,并让这个类拥有一些生命周期钩子

我们希望实现一个State类,这个类拥有以下方法和生命周期:

方法:

setState

生命周期:

willStateUpdate (nextState): 状态将要改变

shouldStateUpdate (nextState): 是否要让状态改变,只有返回true才会改变状态

didStateUpdate (prevState): 状态改变后(要是 shouldStateUpdate 返回的不为true则不会调用)

class User extends State {
  constructor(name) {
    super();
    this.state = { name }
  }

  willStateUpdate(nextState) {
    console.log("willStateUpdate", nextState);
  }

  shouldStateUpdate(nextState) {
    console.log("shouldStateUpdate", nextState);
    if (nextState.name === this.state.name) {
      return false;
    }

    return true;
  }

  didStateUpdate(prevState) {
    console.log("didStateUpdate", prevState);
  }
}

const user = new User("deepred");

user.setState({ name: "hentai" });

首先,你需要知道JavaScript的面向对象基础知识,如果还不是很了解,可以先看下这篇文章JavaScript的面向对象

setState的实现
class State {
  constructor() {
    this.state = {};
  }

  setState(nextState) {
    const preState = this.state;
    this.state = {
      ...preState,
      ...nextState,
    };
  }
}
class User extends State {
  constructor(name) {
    super();
    this.state = {
      name
    }
  }
}


const user = new User("tc");

user.setState({age: 10}); // {name: "tc", age: 10}

在React中,setState方法只会改变特定属性的值,因此,我们需要在方法里用一个变量preState保留之前的state,然后通过展开运算符,将新旧state合并

willStateUpdate的实现

willStateUpdatestate状态更新前调用的。因此只要在合并state前调用willStateUpdate就行

class State {
  constructor() {
    this.state = {};
  }

  setState(nextState) {
    // 更新前调用willStateUpdate
    this.willStateUpdate(nextState);
    const preState = this.state;
    this.state = {
      ...preState,
      ...nextState,
    };
  }

  willStateUpdate() {
    // 默认啥也不做
  }

}
class User extends State {
  constructor(name) {
    super();
    this.state = {
      name
    }
  }

  // 覆盖父级同名方法
  willStateUpdate(nextState) {
    console.log("willStateUpdate", nextState);
  }
}

const user = new User("tc");

user.setState({age: 10}); // {name: "tc", age: 10}
shouldStateUpdate的实现

我们规定只有shouldStateUpdate返回true时,才更新state。因此在合并state前,还要调用shouldStateUpdate

class State {
  constructor() {
    this.state = {};
  }

  setState(nextState) {
    this.willStateUpdate(nextState);
    const update = this.shouldStateUpdate(nextState);
    if (update) {
      const preState = this.state;
      this.state = {
        ...preState,
        ...nextState,
      };
    }
  }

  willStateUpdate() {
    // 默认啥也不做
  }

  shouldStateUpdate() {
    // 默认返回true,一直都是更新
    return true;
  }

}
class User extends State {
  constructor(name) {
    super();
    this.state = {
      name
    }
  }

  // 覆盖父级同名方法
  willStateUpdate(nextState) {
    console.log("willStateUpdate", nextState);
  }

  // 自定义何时更新
  shouldStateUpdate(nextState) {
    if (nextState.name === this.state.name) {
      return false;
    }

    return true;
  }
}


const user = new User("tc");

user.setState({ age: 10 }); // {name: "tc", age: 10}

user.setState({ name: "tc", age: 11 }); // 没有更新
didStateUpdate的实现

懂了willStateUpdate也就知道didStateUpdate如何实现了

class State {
  constructor() {
    this.state = {};
  }

  setState(nextState) {
    this.willStateUpdate(nextState);
    const update = this.shouldStateUpdate(nextState);
    if (update) {
      const preState = this.state;
      this.state = {
        ...preState,
        ...nextState,
      };
      this.didStateUpdate(preState);
    }
  }

  willStateUpdate() {
    // 默认啥也不做
  }

  didStateUpdate() {
    // 默认啥也不做
  }

  shouldStateUpdate() {
    // 默认返回true,一直都是更新
    return true;
  }

}
class User extends State {
  constructor(name) {
    super();
    this.state = {
      name
    }
  }

  // 覆盖父级同名方法
  willStateUpdate(nextState) {
    console.log("willStateUpdate", nextState);
  }

  // 覆盖父级同名方法
  didStateUpdate(preState) {
    console.log("didStateUpdate", preState);
  }

  shouldStateUpdate(nextState) {
    console.log("shouldStateUpdate", nextState);
    if (nextState.name === this.state.name) {
      return false;
    }

    return true;
  }
}


const user = new User("tc");

user.setState({ age: 10 }); 

user.setState({ name: "tc", age: 11 });

通过几十行的代码,我们就已经实现了一个自带生命周期的State类了!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/101028.html

相关文章

  • 如何编写一个React组件

    摘要:例如下面的代码组件生命周期钩子函数在组件挂载完成后立即被调用组件挂载完成渲染结果以上就是一个常规的组件编写方式,不过我们还可以通过观察上面的代码,发现几个有趣的地方中有一个函数是组件生命周期钩子函数。 如何编写一个React组件 在React的世界里,通常是用class来声明一个组件的,它必须继承自React.Component。例如下面的代码: // MyFirstComponent...

    sPeng 评论0 收藏0
  • vue生命周期解析并通过表单理解MVVM(不仅理论,图文并茂)

    摘要:在前端页面中,把用纯对象表示,负责显示,两者做到了最大限度的分离。的显示与否和的布尔值有关,还是只关注数据的变化。两个组件的布尔值通过两个临近的按钮控制,初始值和的结果都是。组件的声明在组件上,则完全没有进入生命周期。 开始前说一说 吐槽 首先, 文章有谬误的地方, 请评论, 我会进行验证修改。谢谢。 vue真是个好东西,但vue的中文文档还有很大的改进空间,有点大杂烩的意思,对于怎么...

    silvertheo 评论0 收藏0
  • 从入门到上线一个天气小程序

    摘要:天气预报小程序说了很多小程序开发的基础准备,下面就结合个人实际练手项目天气预报小程序简单说明。物料准备从需求结果导向,天气程序首先要能获取到当前所在地天气状况,再次可以自由选择某地,知道其天气状况。 前言 学习了一段时间小程序,大致过了两遍开发文档,抽空做个自己的天气预报小程序,全当是练手,在这记录下。小程序开发的安装、注册和接入等流程就不罗列了,在小程序接入指南已经写得很清楚了,以下...

    Anshiii 评论0 收藏0
  • 为什么 React16 对开发人员来说是一种福音

    摘要:就像人们对更新移动应用程序和操作系统感到兴奋一样,开发人员也应该对更新框架感到兴奋。错误边界是一种组件。注意将作为值传递进去并不会导致使用。如果两者不同,则返回一个用于更新状态的对象,否则就返回,表示不需要更新状态。 就像人们对更新移动应用程序和操作系统感到兴奋一样,开发人员也应该对更新框架感到兴奋。不同框架的新版本具有新特性和开箱即用的技巧。 下面是将现有应用程序从 React 15...

    BicycleWarrior 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<