1. 程式人生 > >Vue與React的異同—生命週期(一)

Vue與React的異同—生命週期(一)

React與Vue都有lifecycle生命週期的概念,表示每個元件例項在被建立之前都要經過一系列的初始化過程。比如設定資料監聽、編譯模板、掛載例項到檢視、在資料變化時更新檢視等。

Vue生命週期

所有的生命週期鉤子自動繫結 this 上下文到例項中,因此你可以訪問資料,對屬性和方法進行運算。這意味著 你不能使用箭頭函式來定義一個生命週期方法 (例如 created: () => this.fetchTodos())。這是因為箭頭函式綁定了父上下文,因此 this 與你期待的 Vue 例項不同,this.fetchTodos 的行為未定義。

主要有created、mounted、updated、destroyed,以及各自的before鉤子。相比React多了個特殊的activated和deactivated,該鉤子只在keep-alive

元件才起作用。

demo如下:

    new Vue({
        name: 'demo',
        el: '#demo',
        beforeCreate() {
          //在例項初始化之後,資料觀測 (data observer) 
          //和 event/watcher 事件配置之前被呼叫。 
        },
        created() {
          //在例項建立完成後被立即呼叫。在這一步,
          //例項已完成以下的配置:資料觀測 (data observer),屬性和方法的運算,
          //watch/event 事件回撥。然而,掛載階段還沒開始,$el 屬性目前不可見。
}, beforeMoute(){ //在掛載開始之前被呼叫:相關的 render 函式首次被呼叫。 }, mounted() { //el 被新建立的 vm.$el 替換,並掛載到例項上去之後呼叫該鉤子。 //如果 root 例項掛載了一個文件內元素,當 mounted 被呼叫時 vm.$el 也在文件內。 /* *mounted 不會承諾所有的子元件也都一起被掛載。 *如果你希望等到整個檢視都渲染完畢,可以用 vm.$nextTick */
this.$nextTick(function () { // Code that will run only after the // entire view has been rendered }) }, beforeUpdate() { //資料更新時呼叫,發生在虛擬 DOM 重新渲染和打補丁之前。 }, updated() { //資料更改導致的虛擬 DOM 重新渲染和打補丁,在這之後會呼叫該鉤子。 /* *同樣updated不會承諾所有的子元件也都一起被掛載。 *如果你希望等到整個檢視都渲染完畢,可以用 vm.$nextTick */ }, beforeDestroy() { //例項銷燬之前呼叫。在這一步,例項仍然完全可用。 }, destroyed() { //Vue 例項銷燬後呼叫。呼叫後,Vue 例項指示的所有東西都會解繫結, //所有的事件監聽器會被移除, //所有的子例項也會被銷燬。 } });

React生命週期

在元件的整個生命週期中,隨著元件的props或者state發生改變,其視圖表現也會有相應的變化。一個元件就是一個狀態機,對於特定地輸入,它總返回一致的輸出

一個React元件的生命週期分為三個部分:掛載期(Mounting)、存在更新期(Updating)和銷燬時(Unmounting)。

Mounting

當一個元件例項被建立並且插入到DOM中,以下鉤子將被呼叫
- constructor()
繼承react的props,和設定state的初始化

constructor(props) {
  super(props); //不能缺少
  this.state = {
    color: props.initialColor
  };
}
  • componentWillMount()

    類似Vue的beforeMoute。


只mount前呼叫一次,在 render 之前呼叫,你可以在這個方法裡面呼叫 setState 改變狀態,並且不會導致額外呼叫一次 render,但是一般不建議這麼做,在constructor中初始話state。
- render()
類似Vue的template 該方法會建立一個虛擬DOM,用來表示元件的輸出。對於一個元件來講,render方法是唯一一個必需的方法。render方法需要滿足下面幾點: 1.只能通過 this.props 和 this.state 訪問資料(不能修改) 2.可以返回 null,false 或者任何React元件 3.只能出現一個頂級元件,不能返回一組並列元素(**react16也支援返回陣列了**) 4.不能改變元件的狀態 5.不能修改DOM的輸出 - componentDidMount()

類似Vue的mounted

只會在裝載完成之後呼叫一次,在 render 之後呼叫,從這裡開始可以通過 ReactDOM.findDOMNode(this) 獲取到元件的 DOM 節點。

Updating

通過改變props或state來驅動檢視的更改,會觸發以下鉤子

  • componentWillReceiveProps()
  • shouldComponentUpdate()
    在react中這是一個性能優化的關鍵點,當父元件改變,全部子元件都會重新渲染,可以通過該鉤子返回false來阻止渲染,此處還有另外一個方法pureComponent,詳細參考React官方文件,而在Vue中,預設是做了此優化,詳見Vue文件
shouldComponentUpdate(nextProps, nextState){
    //return boolean
}

  • componentWillUpdate()

類似Vue的beforeUpdate、

  • render()

  • componentDidUpdate()
    類似Vue的updated
  • Unmounting


    • componentWillUnmount()

    類似Vue的beforeDestroy
    元件銷燬之前被呼叫
    在此鉤子中,出於效能的考慮需移除在componentDidMount新增的事件訂閱,網路請求等。
    demo如下:

    import React, { Component } from 'react';
    
    class LikeButton extends Component {
      constructor(props) {
        super(props);
        this.state = { liked: false };
      }
    
      handleClick(e) {
        this.setState({ liked: !this.state.liked });
      }
    
      render() {
        const text = this.state.liked ? 'like' : 'haven\'t liked';
        return (
          <p onClick={this.handleClick.bind(this)}>
              You {text} this. Click to toggle.
          </p>
        );
      }
    
      componentDidMount(){
        //新增事件訂閱,額外的DOM處理
      }
    
      componentWillUnmount(){
        //移除在componentDidMount新增的事件訂閱,網路請求等
      }
    }
    

    總結

    在Vue中,state物件並不是必須的,資料由data屬性在Vue物件中進行管理。大型應用的狀態管理框架有Vuex。

    export default {
      name: 'app',
      data() {
        return {
          samplePasta: samplePasta,
          orders: {}
        }
      },
    ...
      methods: {
        handleOrder(){
            //.....
        }
        }
      }
    }

    而在React中是State驅動檢視概念,對應的有setState()方法去更新狀態,類似的狀態管理框架有redux等。

    相關推薦

    VueReact異同生命週期

    React與Vue都有lifecycle生命週期的概念,表示每個元件例項在被建立之前都要經過一系列的初始化過程。比如設定資料監聽、編譯模板、掛載例項到檢視、在資料變化時更新檢視等。 Vue生命週期 所有的生命週期鉤子自動繫結 this 上下文到

    Servlet的生命週期

    package com.xxxx.java; import java.io.IOException; import javax.servlet.Servlet; import javax.servlet.ServletConfig; import javax.servlet.ServletExc

    vue json-server 新增資料

    列表頁server.vue <!-- 按鈕 --> <div class="tj"> <span class="demonstration">ID</span> <el-input class="int-1" v-mode

    Service的生命週期

    參考Android官方開發文件API22 簡介   Service是Android的四大元件之一,它是用來進行後臺操作的,它並不為使用者提供介面,所有的操作都在後臺完成,它的所有操作對使用者都是不可見的。一旦其他的元件啟動了一個Service,它會在

    Application生命週期

    1、Application是什麼? Application和Activity,Service一樣,是android框架的一個系統元件,當android程式啟動時系統會建立一個application物件 用來儲存系統的一些資訊。通常我們是不需要指定一個Application的,這時系統會自動幫我們建立 如

    Kubernetes中資源清單Pod的生命週期

    一、資源清單 1,定義:   在k8s中一般使用yaml格式的檔案來建立符合我們預期的資源,這樣的yaml被稱為資源清單。   使用資源清單建立Pod: kubectl apply -f nginx.yaml   定義nginx.yaml內容為: apiVersion: v1 kind: Pod met

    vue 元件通訊vuexcomputed生命週期2

    二:vuex 先看官方文件 Vuex 官方文件:https://vuex.vuejs.org/zh-cn/ vuex 是一個專為vue應用程式開發的狀態管理模式。它採用集中式儲存管理應用的所有元件的狀態,並以相應的規則保證狀態以一種可預測的方式發生變化。 vuex 不同於lo

    vue 元件通訊vuexcomputed生命週期1

    一:元件 1:先看官方文件 什麼是元件 元件 (Component) 是 Vue.js 最強大的功能之一。元件可以擴充套件 HTML 元素,封裝可重用的程式碼。在較高層面上,元件是自定義元素,Vue.js 的編譯器為它新增特殊功能。在有些情況下,元件也可以表現為用 is 特性進行

    React.js學習筆記生命週期

    componentWillMount(){         console.log( “建立之前”) } componentDidMount(){          console.log( “建立之後”) } componentWillUpdate(){

    React-Native系列Android——NativeJavascript通信原理

    from 直接 最新 一點 明顯 rem 負責 receive esp React-Native最核心的是Native與Javascript之間的通信,並且是雙向通信

    React 生命週期摘抄

    /* 首先當元件第一次渲染的時候會執行哪些生命週期函式? constructor--->componentWillMount--->render--->componentDidMount constructor: 初始化

    vue元件的生命週期

    vue元件的生命週期 Vue所有的生命週期鉤子自動繫結在this上下文到例項中,因此你可以訪問資料,對屬性和方法進行運算。這意味著你不能使用箭頭函式來定義一個生命週期方法。這是因為箭頭函式綁定了父上下文,因此this與你期待的Vue例項不同。 1、beforeCreate   在例項初始

    關於Vue例項的生命週期2

     關於Vue例項的生命週期(2)   建立(create)->掛載(mount)->更新(update)->銷燬(destory) 鉤子函式觸發事件 beforeCreate 在例項初始化之後,資料觀測(data observer)

    vue生命週期記錄

    vue生命週期(建立、掛載、更新、銷燬 ) let app = new Vue({ el:"#app", data:{ name:"靈demo" }, //此階段為例項初始化之後,此時的資料觀察和事件配置都沒好準備好。 //所以資料data和掛載元素el

    react 學習--元件的生命週期銷燬階段

    var HelloWorld = React.createClass({ render:function () { return ( <p>

    react native 知識點總結

    修改 ltp 組件 改變 set 覆蓋 sta 一個 個數 一、關於react native 版本的升級 參照文檔:http://reactnative.cn/docs/0.45/upgrading.html react-native -v

    從零開始利用vue-cli搭建簡單音樂網站

    路徑 nod .com mman csdn desc blog -a where 最近在學習vue框架,練習了一些例子之後,想著搭建一個vue項目,了解到官方有提供一個vue-cli工具來搭建項目腳手架,嘗試了一下,寫下博客來記錄一下。 一、工具環境 1、node.js 6

    ORACLE inexists語句的區別

    表數 內存 全部 sel 一個 性能 where 情況 lec (轉載:https://www.cnblogs.com/iceword/archive/2011/02/15/1955337.html) select * from Awhere id in(select id

    vue項目爬坑筆記

    div data and tab header 文件的 host 都是 mod 1.作為一個後臺管理系統, 采用vue2.0+ vuex+iview+vue-router+webpack 需要清楚各個文件的意義,譬如存儲,登錄,請求封裝.....項目框架搭建就是這樣! 2

    數據結構算法小結——排序

    思路 基礎上 bubuko 時間復雜度 inf pla 都是 tex .com   前段時間Java學了,數據結構與算法看了,機器學習也了解了一點,還裝上Ubuntu了解了Linux。接受的東西太多太雜,需要梳理一下。   首先是最重要的數據結構和算法,無論以後搞什麽,只要