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()
只會在裝載完成之後呼叫一次,在 render 之後呼叫,從這裡開始可以通過 ReactDOM.findDOMNode(this) 獲取到元件的 DOM 節點。類似Vue的mounted
Updating
通過改變props或state來驅動檢視的更改,會觸發以下鉤子
- componentWillReceiveProps()
- shouldComponentUpdate()
在react中這是一個性能優化的關鍵點,當父元件改變,全部子元件都會重新渲染,可以通過該鉤子返回false來阻止渲染,此處還有另外一個方法pureComponent,詳細參考React官方文件,而在Vue中,預設是做了此優化,詳見Vue文件。
shouldComponentUpdate(nextProps, nextState){
//return boolean
}
componentWillUpdate()
類似Vue的beforeUpdate、
render()
類似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等。
相關推薦
Vue與React的異同—生命週期(一)
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 元件與通訊與vuex與computed與生命週期(2)
二:vuex 先看官方文件 Vuex 官方文件:https://vuex.vuejs.org/zh-cn/ vuex 是一個專為vue應用程式開發的狀態管理模式。它採用集中式儲存管理應用的所有元件的狀態,並以相應的規則保證狀態以一種可預測的方式發生變化。 vuex 不同於lo
vue 元件與通訊與vuex與computed與生命週期(1)
一:元件 1:先看官方文件 什麼是元件 元件 (Component) 是 Vue.js 最強大的功能之一。元件可以擴充套件 HTML 元素,封裝可重用的程式碼。在較高層面上,元件是自定義元素,Vue.js 的編譯器為它新增特殊功能。在有些情況下,元件也可以表現為用 is 特性進行
React.js學習筆記(一)生命週期
componentWillMount(){ console.log( “建立之前”) } componentDidMount(){ console.log( “建立之後”) } componentWillUpdate(){
React-Native系列Android——Native與Javascript通信原理(一)
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 in與exists語句的區別(一)
表數 內存 全部 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。接受的東西太多太雜,需要梳理一下。 首先是最重要的數據結構和算法,無論以後搞什麽,只要