博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaScript实现自定义的生命周期
阅读量:6859 次
发布时间:2019-06-26

本文共 4071 字,大约阅读时间需要 13 分钟。

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的面向对象基础知识,如果还不是很了解,可以先看下这篇文章

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类了!

转载地址:http://gjxyl.baihongyu.com/

你可能感兴趣的文章
乐观锁 与 悲观锁 来解决数据库并发问题
查看>>
java.sql.SQLException: Field 'id' doesn't have a default value解决方案
查看>>
设置更改root密码 连接mysql mysql常用命令
查看>>
基于 Token 的身份验证
查看>>
C#从证书存储区读取证书
查看>>
NE555
查看>>
Docker 删除所有无名称的镜像(悬空镜像)
查看>>
URI -URL-URN区别
查看>>
Java 8 lambda表达式示例
查看>>
洛谷P3382 【模板】三分法(三分)
查看>>
简单了解JS中的几种遍历
查看>>
少走弯路的10条忠告
查看>>
一个多maven项目聚合的实例
查看>>
Mac终端解压命令集合
查看>>
事务日志已满,原因为“ACTIVE_TRANSACTION”
查看>>
linux 按照端口一句命令杀死进程,按照进程名称一句命令杀死进程
查看>>
The last packet sent successfully to the server was 0 milliseconds ago.[nutch---mysql ]
查看>>
win10初期版本administrator的限制
查看>>
使用LVS实现负载均衡原理及安装配置详解
查看>>
Laravel 5使用Laravel Excel实现Excel/CSV文件导入导出的功能详解
查看>>