成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

JavaScript實(shí)現(xiàn)自定義的生命周期

QiShare / 3526人閱讀

摘要:,和的流行,讓生命周期這個(gè)名詞常常出現(xiàn)在前端們的口中,以至于面試中最常見的一個(gè)問題也是介紹下的生命周期以及使用方法聽起來高大上的生命周期,其實(shí)也就是一些普通的方法,只是在不同的時(shí)期傳參調(diào)用它們而已。

React,Vue 和 Angular 的流行,讓“生命周期”這個(gè)名詞常常出現(xiàn)在前端們的口中,以至于面試中最常見的一個(gè)問題也是:

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

聽起來高大上的“生命周期”,其實(shí)也就是一些普通的方法,只是在不同的時(shí)期傳參調(diào)用它們而已。我們可以照著React的生命周期,自己模擬一個(gè)簡(jiǎn)單的類,并讓這個(gè)類擁有一些生命周期鉤子

我們希望實(shí)現(xiàn)一個(gè)State類,這個(gè)類擁有以下方法和生命周期:

方法:

setState

生命周期:

willStateUpdate (nextState): 狀態(tài)將要改變

shouldStateUpdate (nextState): 是否要讓狀態(tài)改變,只有返回true才會(huì)改變狀態(tài)

didStateUpdate (prevState): 狀態(tài)改變后(要是 shouldStateUpdate 返回的不為true則不會(huì)調(diào)用)

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的面向?qū)ο蠡A(chǔ)知識(shí),如果還不是很了解,可以先看下這篇文章JavaScript的面向?qū)ο?/p> setState的實(shí)現(xiàn)

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方法只會(huì)改變特定屬性的值,因此,我們需要在方法里用一個(gè)變量preState保留之前的state,然后通過展開運(yùn)算符,將新舊state合并

willStateUpdate的實(shí)現(xiàn)

willStateUpdatestate狀態(tài)更新前調(diào)用的。因此只要在合并state前調(diào)用willStateUpdate就行

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

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

  willStateUpdate() {
    // 默認(rèn)啥也不做
  }

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

  // 覆蓋父級(jí)同名方法
  willStateUpdate(nextState) {
    console.log("willStateUpdate", nextState);
  }
}

const user = new User("tc");

user.setState({age: 10}); // {name: "tc", age: 10}
shouldStateUpdate的實(shí)現(xiàn)

我們規(guī)定只有shouldStateUpdate返回true時(shí),才更新state。因此在合并state前,還要調(diào)用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() {
    // 默認(rèn)啥也不做
  }

  shouldStateUpdate() {
    // 默認(rèn)返回true,一直都是更新
    return true;
  }

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

  // 覆蓋父級(jí)同名方法
  willStateUpdate(nextState) {
    console.log("willStateUpdate", nextState);
  }

  // 自定義何時(shí)更新
  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的實(shí)現(xiàn)

懂了willStateUpdate也就知道didStateUpdate如何實(shí)現(xiàn)了

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() {
    // 默認(rèn)啥也不做
  }

  didStateUpdate() {
    // 默認(rèn)啥也不做
  }

  shouldStateUpdate() {
    // 默認(rèn)返回true,一直都是更新
    return true;
  }

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

  // 覆蓋父級(jí)同名方法
  willStateUpdate(nextState) {
    console.log("willStateUpdate", nextState);
  }

  // 覆蓋父級(jí)同名方法
  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 });

通過幾十行的代碼,我們就已經(jīng)實(shí)現(xiàn)了一個(gè)自帶生命周期的State類了!

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/101028.html

相關(guān)文章

  • 如何編寫一個(gè)React組件

    摘要:例如下面的代碼組件生命周期鉤子函數(shù)在組件掛載完成后立即被調(diào)用組件掛載完成渲染結(jié)果以上就是一個(gè)常規(guī)的組件編寫方式,不過我們還可以通過觀察上面的代碼,發(fā)現(xiàn)幾個(gè)有趣的地方中有一個(gè)函數(shù)是組件生命周期鉤子函數(shù)。 如何編寫一個(gè)React組件 在React的世界里,通常是用class來聲明一個(gè)組件的,它必須繼承自React.Component。例如下面的代碼: // MyFirstComponent...

    sPeng 評(píng)論0 收藏0
  • vue生命周期解析并通過表單理解MVVM(不僅理論,圖文并茂)

    摘要:在前端頁(yè)面中,把用純對(duì)象表示,負(fù)責(zé)顯示,兩者做到了最大限度的分離。的顯示與否和的布爾值有關(guān),還是只關(guān)注數(shù)據(jù)的變化。兩個(gè)組件的布爾值通過兩個(gè)臨近的按鈕控制,初始值和的結(jié)果都是。組件的聲明在組件上,則完全沒有進(jìn)入生命周期。 開始前說一說 吐槽 首先, 文章有謬誤的地方, 請(qǐng)?jiān)u論, 我會(huì)進(jìn)行驗(yàn)證修改。謝謝。 vue真是個(gè)好東西,但vue的中文文檔還有很大的改進(jìn)空間,有點(diǎn)大雜燴的意思,對(duì)于怎么...

    silvertheo 評(píng)論0 收藏0
  • 從入門到上線一個(gè)天氣小程序

    摘要:天氣預(yù)報(bào)小程序說了很多小程序開發(fā)的基礎(chǔ)準(zhǔn)備,下面就結(jié)合個(gè)人實(shí)際練手項(xiàng)目天氣預(yù)報(bào)小程序簡(jiǎn)單說明。物料準(zhǔn)備從需求結(jié)果導(dǎo)向,天氣程序首先要能獲取到當(dāng)前所在地天氣狀況,再次可以自由選擇某地,知道其天氣狀況。 前言 學(xué)習(xí)了一段時(shí)間小程序,大致過了兩遍開發(fā)文檔,抽空做個(gè)自己的天氣預(yù)報(bào)小程序,全當(dāng)是練手,在這記錄下。小程序開發(fā)的安裝、注冊(cè)和接入等流程就不羅列了,在小程序接入指南已經(jīng)寫得很清楚了,以下...

    Anshiii 評(píng)論0 收藏0
  • 為什么 React16 對(duì)開發(fā)人員來說是一種福音

    摘要:就像人們對(duì)更新移動(dòng)應(yīng)用程序和操作系統(tǒng)感到興奮一樣,開發(fā)人員也應(yīng)該對(duì)更新框架感到興奮。錯(cuò)誤邊界是一種組件。注意將作為值傳遞進(jìn)去并不會(huì)導(dǎo)致使用。如果兩者不同,則返回一個(gè)用于更新狀態(tài)的對(duì)象,否則就返回,表示不需要更新狀態(tài)。 就像人們對(duì)更新移動(dòng)應(yīng)用程序和操作系統(tǒng)感到興奮一樣,開發(fā)人員也應(yīng)該對(duì)更新框架感到興奮。不同框架的新版本具有新特性和開箱即用的技巧。 下面是將現(xiàn)有應(yīng)用程序從 React 15...

    BicycleWarrior 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<