91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

JavaScrip如何t實現自定義生命周期

發布時間:2020-10-16 16:16:41 來源:億速云 閱讀:191 作者:小新 欄目:web開發

小編給大家分享一下JavaScrip如何t實現自定義生命周期,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!

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

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

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

我們希望實現一個State類,這個類擁有以下方法和生命周期:

方法:

  • setState

生命周期:

  • willStateUpdate (nextState): 狀態將要改變

  • shouldStateUpdate (nextState): 是否要讓狀態改變,只有返回true才會改變狀態

  • didStateUpdate (prevState): 狀態改變后(要是 shouldStateUpdate 返回的不為true則不會調用)

<!-- more -->

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的實現

willStateUpdate是state狀態更新前調用的。因此只要在合并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類了!

看完了這篇文章,相信你對JavaScrip如何t實現自定義生命周期有了一定的了解,想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

绵竹市| 镇宁| 湘乡市| 云南省| 台湾省| 南皮县| 五河县| 苏尼特右旗| 达尔| 南靖县| 平湖市| 罗源县| 昆山市| 达拉特旗| 长兴县| 贵德县| 公安县| 翼城县| 华容县| 凉山| 恩施市| 台湾省| 怀安县| 宜州市| 平安县| 寻乌县| 石城县| 资源县| 新安县| 竹溪县| 定南县| 慈溪市| 河北省| 江华| 夏津县| 黑河市| 阿克陶县| 道孚县| 开原市| 清苑县| 津市市|