亚洲国产爱久久全部精品_日韩有码在线播放_国产欧美在线观看_中文字幕不卡在线观看

初探React中函數組件和類組件的差異

自從React Hooks的出來,社區討論Hooks的越來越多。愛掏網 - it200.com這并不是說React Hooks就優于類組件,但是使用Hooks來構建組件時有一個巨大的可用性提升,特別是因為這些函數組件可以通過React Hooks中的鉤子函數來訪問狀態和生命周期。愛掏網 - it200.com

今天我們就來一起聊聊如何將React的類組件轉換為函數組件,用React Hooks中的鉤子函數替換類組件中的setState和生命周期方法,比如componentWillMountcomponentWillReceiveProps等。愛掏網 - it200.com

因此,讓我們首先使用狀態和生命周期方法構建一個基于類的React組件。愛掏網 - it200.com也是大家最為熟悉的ToDoList組件。愛掏網 - it200.com該組件具備:

  • 有一個文本輸入框(,用戶可以在輸入框中輸入想要的內容
  • 有一個“添加列表項”按鈕(button,點擊該按鈕之后可以將文本輸入框的內容添加到列表中(ToDoList中)
  • 顯示每個待辦事項的列表清單
  • 每個單獨的列表項目都有一個相關聯的復選框(),可以用來將列表項標記為已完成
  • 列表項會存儲到瀏覽器的緩存中(本地存儲),并在應用程序啟動時從本地存儲中再次加載

我們的組件將使用statecomponentDidMountcomponentDidUpdategetDerivedStateFromProps生命周期方法。愛掏網 - it200.com其中一些生命周期方法(比如getDerivedStateFromProps)將以一種非人為方式使用,以便能夠演示有哪些Hooks的鉤子函數可以替換這些生命周期的方法。愛掏網 - it200.com

在開始之前,先來學習關于類和函數相關的知識點。愛掏網 - it200.com

作為Web開發者,經常和函數打交道。愛掏網 - it200.com但要真正的理解和掌握他們也不是件易事,特別是對于初學JavaScript的同學更是如此。愛掏網 - it200.com至少給我自己的感覺是如此。愛掏網 - it200.com

在這里我們不會深入的去聊函數和類,因為要真正的聊透他們,都可以去寫本書了。愛掏網 - it200.com由于我們今天要聊React的類組件和函數組件,那么在開始之前很有必要的先了解一頂點有關于JavaScript的函數和類。愛掏網 - it200.com先來看函數吧。愛掏網 - it200.com

函數在JavaScript中被認為是第一類公民,在JavaScript中明確的創建函數的概念非常重要。愛掏網 - it200.com

JavaScript語言似乎和其他編程語言不同,我們可以在JavaScript中以不同的方式來創建一個函數,常見的方式主要有:

用幾個簡單的示例代碼來演示他們之間的不同:

// Function Declaration
function Greeting(user) {
    console.log(`Hello, ${user}`)
}

Greeting('@w3cplus') // ? Hello, @w3cplus

// Function Expression
const Greeting = function(user) { // 作為對象分配給變量
    console.log(`Hello, ${user}`)
}

const Methods = {
    numbers: [1, 2, 8],
    // Function Expression
    sum: function() { // 在對象上創建一個方法
        return this.numbers.reduce(function(acc, num){ // Function Expression (使用該函數作為回調函數)
            return acc + num
        })
    }
}

// Shorthand Method Definition
const Collection = { // 用于Object Literals和ES6 Class聲明中
    items: [],
    // 使用函數名來定義
    // 使用一對圓括號中的參數列表和一對花括號來分隔主體語句
    add(...items) { 
        this.items.push(...items)
    },
    get(index) {
        return this.items[index]
    }
}

// Arrow Function
let empty = () =>{}

let simple = a => a > 15 ? 15 : a

let max = (a, b) => a > b ? a : b

let numbers = [1, 2, 3, 4]
let sum = numbers.reduce((a, b) => a + b)
let even = numbers.filter(v => v % 2 == 0)
let double = numbers.map(v => v * 2)

primise.then( a => {
    // ...
}).then(b => {
    // ...
})

// Generator Function
// JavaScript中的生成器函數返回這個生成器的迭代器對象

function* indexGenerator() {
    var index = 0
    while(true) {
        yield index++
    }
}

const indexGenerator = function* () {
    var index = 0
    while(true) {
        yield index++
    }
}

const obj = {
    *indexGenerator() {
        var index = 0
        while(true) {
            yield index++
        }
    }
}

// Function Constructor
const sum = new Function('a', 'b', 'return a + b')
sum(1, 2) // ? 3

類是ES6中開始引入的,實質上是JavaScript現有的基于原型的繼承的語法糖。愛掏網 - it200.com實際上,類是特殊的函數,就像你能夠定義的函數表達式和函數聲明一樣,類語法主要有兩個組成部分:類表達式類聲明愛掏網 - it200.com

// 類聲明
class Rectangle {
    constructor(height, width) {
        this.height = height
        this.width = width
    }
}

// 類表達式

// 匿名類
let Rectangle = class {
    constructor(height, width) {
        this.height = height
        this.width = width
    }
}

// 命名類
let Rectangle = class Rectangle {
    constructor(height, width) {
        this.height = height
        this.width = width
    }
}

而且還可以使用extends關鍵字在類聲明或類表達式中用于創建一個類作為另一個類的子類:

class Animal {
    constructor(name) {
        this.name = name
    }

    sayHi() {
        console.log(this.name)
    }
}

class Dog extends Animal {
    sayHi() {
        console.log(`${this.name} barks.`)
    }
}
let dog = new Dog('Mitzie')
dog.sayHi() // ? Mitzie barks

如果子類中存在構造函數,則需要在使用this之前首先調用super()愛掏網 - it200.com也可以擴展傳統折基于函數的“類”

function Animal(name) {
    this.name = name
}

Animal.prototype.sayHi = function() {
    console.log(this.name)
}

class Dog extends Animal {
    sayHi() {
        super.sayHi()
        console.log(`${this.name} barks.`) 
    }
}

let dog = new Dog('Mitzie')
dog.sayHi() 

如果你想更深入的了解有關于JavaScript中的函數和類相關的知識的話,可以花點時間閱讀下面相關文章:

  • 6 Ways to Declare JavaScript Functions
  • Understanding JavaScript Functions
  • How To Define Functions in JavaScript
  • Curry and Function Composition
  • Understanding JavaScript Callbacks and best practices
  • Understanding Classes in JavaScript
  • Understanding Prototypes and Inheritance in JavaScript
  • A Deep Dive into Classes
  • A Guide To Prototype-Based Class Inheritance In JavaScript
  • Understanding Public and Private Fields in JavaScript Class
  • 3 ways to define a JavaScript class
  • Object-oriented JavaScript: A Deep Dive into ES6 Classes
  • Demystifying Class in JavaScript
  • Javascript Classes — Under The Hood
  • JavaScript engine fundamentals: Shapes and Inline Caches
  • Understanding "Prototypes" in JavaScript
  • Advanced TypeScript Concepts: Classes and Types
  • A Beginner's Guide to JavaScript's Prototype

我們回到React的世界當中來。愛掏網 - it200.com在React中我們可以以函數形式定義一個組件,比如像下面這樣:

function SayHi() {
    return 

Hello, React

}

也可以將SayHi這個組件以類的形式來定義:

class SayHi extends React.Component {
    render() {
        return 

Hello, React

} }

在當你要使用一個組件時,比如要使用SayHi這個組件,并不會過多的關注它是以什么方式來定義(聲明)的組件,只會關心如何使用:

雖然使用者不會太過關注它是怎么創建的(以哪種方式創建的),但React自身對于怎么創建組件是較為關注也會在意其差別。愛掏網 - it200.com

如果SayHi是一個函數,React需要調用它:

// 你的代碼
function SayHi() {
    return 

Hello, React

} // React內部 const result = SayHi(props) // ?

Hello, React

如果SayHi是一個類,React需要先用new操作符將其實例化,然后調用剛才生成實例的render方法:

// 你的代碼
class SayHi extends React.Component {
    render() {
        return 

Hello, React

} } // React內部 const instance = new SayHi(props) // ? SayHi {} const result = instance.render() // ?

Hello, React

無論哪種情況,React的最終目標是去獲取渲染后的DOM節點,比如SayHi組件,獲取渲染后的DOM節點是:

Hello, React

具體需要取決于SayHi組件是怎么定義的。愛掏網 - it200.com

從上面的代碼中你可能已經發現了,在調用類時,使用了new關鍵字來調用:

// 如果SayHi是一個函數
const result = SayHi(props); // ? 

Hello, React

// 如果SayHi是一個類 const instance = new SayHi(props) // ? SayHi {} const result = instance.render() // ?

Hello, React

那么JavaScript中的new起什么作用呢?在ES6之前,JavaScript是沒有類(class)這樣的概念。愛掏網 - it200.com在這種情況之前如果要使用類這樣的特性都是使用普通函數來模擬。愛掏網 - it200.com即,在函數調用前加上new關鍵字,就可以把任何函數當做一個類的構造函數來用

function Fruit(name) {
    this.name = name
}

const apple = new Fruit('apple') // ? Fruit?{name: "apple"}
const banana = Fruit('banana')   // ? undefined   

JavaScript中的new關鍵字會進行如下的操作:

  • 創建一個空的對象,即{}
  • 鏈接該對象(即設置該對象的構造函數)到另一個對象
  • 將創建的對象作為this的上下文
  • 如果該函數沒有返回對象,則返回this

正如上面的示例來說:

  • 調用Fruit('apple')時前面添加了new關鍵字,這個時候JavaScript會知道Fruit只是一個函數,同時也會假裝它是一個構造函數。愛掏網 - it200.com會創建一個空對象({}并把Fruit中的this指向那個對象,以便我們可以通過類似this.name的形式去設置一些東西,然后把這個對象返回
  • 調用Fruit('banana')時前面沒有添加new關鍵字,其中的this會指向某個全局且無用的東西,比如windowundefined,因此代碼會崩潰或者做一些像設置window.name之類的傻事

也就是說:

// 和Fruit中的this是等效的對象
const apple = new Fruit('apple') // ? Fruit?{name: "apple"}

new關鍵字同時也把放在Fruit.prototype上的東西放到了apple對象上:

function Fruit(name) {
    this.name = name
}

Fruit.prototype.SayHi = function () {
    console.log(`Hi,我想吃${this.name}`)
}

const apple = new Fruit('蘋果')

apple.SayHi() // ? Hi,我想吃蘋果

這就是在JavaScript中如何通過new關鍵字來模擬類的方式。愛掏網 - it200.com有關于new更多的介紹可以閱讀:

  • JavaScript’s new

聲明:所有內容來自互聯網搜索結果,不保證100%準確性,僅供參考。如若本站內容侵犯了原著者的合法權益,可聯系我們進行處理。
發表評論
更多 網友評論0 條評論)
暫無評論

返回頂部

亚洲国产爱久久全部精品_日韩有码在线播放_国产欧美在线观看_中文字幕不卡在线观看

    
    

    9000px;">

      
      

      日韩欧美二区三区| 色婷婷激情久久| 豆国产96在线|亚洲| 亚洲国产aⅴ成人精品无吗| 亚洲欧洲综合另类在线| 欧美乱妇15p| 久久超碰97中文字幕| 国产91露脸合集magnet| 日韩欧美视频一区| 久久亚洲二区三区| 久久丝袜美腿综合| 亚洲欧美福利一区二区| 亚洲一区二区三区三| 亚洲一区成人在线| 久久久一区二区| 欧美日韩久久不卡| 天堂在线亚洲视频| 亚洲人妖av一区二区| 日韩欧美高清一区| 99在线热播精品免费| 国产亚洲精品精华液| 91高清视频免费看| 国产乱人伦偷精品视频不卡| 秋霞午夜av一区二区三区| 亚洲国产精品v| 成人高清伦理免费影院在线观看| 夜夜嗨av一区二区三区四季av| 色哦色哦哦色天天综合| 91福利精品第一导航| 精品国产伦一区二区三区观看体验 | aaa亚洲精品一二三区| 久久嫩草精品久久久久| 琪琪一区二区三区| 波多野结衣亚洲| 欧美主播一区二区三区| 日韩视频一区二区三区在线播放| ww亚洲ww在线观看国产| 中文av字幕一区| 亚洲主播在线播放| 久草这里只有精品视频| 91在线免费看| 精品久久国产老人久久综合| 久久久亚洲精品一区二区三区 | 欧美日韩黄色一区二区| 国产日韩高清在线| 韩国毛片一区二区三区| 2021国产精品久久精品| 色一情一乱一乱一91av| 最新高清无码专区| 93久久精品日日躁夜夜躁欧美| 日韩欧美中文字幕精品| 国产精品毛片久久久久久久| 狠狠色综合日日| 欧美大片一区二区三区| 天天影视网天天综合色在线播放| 色香色香欲天天天影视综合网| 中文字幕在线观看不卡| 欧美日本一道本在线视频| 日本aⅴ免费视频一区二区三区 | 石原莉奈在线亚洲三区| 亚洲欧洲www| 欧美一区日本一区韩国一区| 欧美精品少妇一区二区三区 | 欧美大肚乱孕交hd孕妇| 亚洲精品高清在线| 欧美老女人在线| 亚洲国产va精品久久久不卡综合| 国产精品1区2区| 中文字幕精品在线不卡| 99久久777色| 国产午夜亚洲精品羞羞网站| 欧美日韩黄视频| 午夜a成v人精品| 91麻豆精品国产无毒不卡在线观看 | 国产日韩视频一区二区三区| 日韩成人一级大片| 亚洲v日本v欧美v久久精品| 久久成人av少妇免费| 精品视频一区二区不卡| 色综合久久中文字幕| 日韩—二三区免费观看av| 自拍偷拍国产精品| 国内久久婷婷综合| 欧美激情在线一区二区| 国产人久久人人人人爽| 欧美性做爰猛烈叫床潮| 国产成人午夜片在线观看高清观看 | 日韩av电影免费观看高清完整版 | 欧美日韩不卡一区| 欧美一区二区久久久| 久久久久9999亚洲精品| 亚洲精品免费播放| 欧美日韩日日摸| 97久久人人超碰| 99v久久综合狠狠综合久久| 成人激情免费网站| av色综合久久天堂av综合| 国产久卡久卡久卡久卡视频精品| 韩国欧美国产1区| 蜜臀av国产精品久久久久| 午夜激情一区二区| 亚洲国产欧美一区二区三区丁香婷| 国产亚洲午夜高清国产拍精品| 国产精品一区二区在线观看不卡| 久久―日本道色综合久久| 国产传媒久久文化传媒| av电影天堂一区二区在线| 97精品国产露脸对白| 美洲天堂一区二卡三卡四卡视频| 亚洲美女在线国产| 欧美电影免费观看高清完整版| 偷拍与自拍一区| 久久婷婷国产综合精品青草| 91久久奴性调教| 美国欧美日韩国产在线播放| 午夜精品福利在线| 亚洲欧洲制服丝袜| 久久网站热最新地址| 国产一区视频在线看| 亚洲超碰精品一区二区| 欧美日韩国产天堂| 日日夜夜免费精品| 91精品久久久久久久99蜜桃| 欧美激情资源网| 91一区一区三区| 麻豆国产91在线播放| 久久综合久久综合久久综合| 国产91在线看| 午夜欧美大尺度福利影院在线看| 久久毛片高清国产| 韩国av一区二区三区四区| 午夜精品福利一区二区三区av| 中文字幕第一区第二区| 免费人成在线不卡| 国产激情一区二区三区桃花岛亚洲| 日韩一卡二卡三卡国产欧美| 欧美喷潮久久久xxxxx| 免费的成人av| 久久99久久精品欧美| 色成人在线视频| 久久午夜免费电影| 久久精品理论片| 亚洲欧洲精品天堂一级| 美女久久久精品| 国产成人超碰人人澡人人澡| 欧美日韩亚洲综合在线| 欧美高清在线一区二区| 国产剧情av麻豆香蕉精品| 欧美岛国在线观看| 国产精品影视在线观看| 久久九九久精品国产免费直播| 久久久精品中文字幕麻豆发布| 日韩高清在线不卡| 欧美主播一区二区三区美女| 一区二区久久久| 9色porny自拍视频一区二区| 久久精品综合网| 在线影视一区二区三区| 亚洲一卡二卡三卡四卡五卡| 日韩免费在线观看| 欧美aⅴ一区二区三区视频| 91麻豆精品国产91久久久| 五月婷婷久久综合| 欧美日韩国产高清一区二区三区 | 精品国产乱码91久久久久久网站| 成人免费毛片高清视频| 国产精品久久二区二区| 偷拍日韩校园综合在线| 亚洲三级小视频| 日本欧美一区二区| 精品免费国产一区二区三区四区| 成人理论电影网| 国产在线播放一区| 久久久久高清精品| 视频一区二区三区中文字幕| 丰满白嫩尤物一区二区| 在线不卡a资源高清| 一本到三区不卡视频| 亚洲一区二区欧美激情| 久久不见久久见免费视频7| 老鸭窝一区二区久久精品| 成人97人人超碰人人99| 在线观看日韩国产| 国产婷婷一区二区| 亚洲香肠在线观看| 免费观看30秒视频久久| 欧美疯狂做受xxxx富婆| 亚洲精品老司机| 成人夜色视频网站在线观看| 欧美一级欧美三级在线观看| 亚洲自拍另类综合| 成人免费高清视频在线观看| 国产精品久久久久久久裸模| 亚洲国产乱码最新视频| 国产91精品一区二区麻豆网站 | 日本vs亚洲vs韩国一区三区二区| 日韩精品一二三| 国产精品1区二区.| 精品一区二区综合| 久久99日本精品|