成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

React入門0x007: 生命周期概念

Blackjun / 1479人閱讀

摘要:概述上一章只是稍微了解了一下和相關(guān)的簡單用法,這一章需要講一下組件的生命周期。生命周期的概念這玩意似乎很高大上,其實就是一個假概念罷了,直接來實現(xiàn)一個類似的吧。

0x000 概述

上一章只是稍微了解了一下statesetState相關(guān)的簡單用法,這一章需要講一下組件的生命周期。

0x001 生命周期的概念

這玩意似乎很高大上,其實就是一個假概念罷了,直接來實現(xiàn)一個類似的吧。大凡事物從出現(xiàn)到消亡都有個過程,而這個過程大抵可以分為:

出現(xiàn)->變化->消亡

web開發(fā)中,組件也有類似的過程,當(dāng)然作為組件的創(chuàng)造者,我們可以干預(yù)這個過程,在每個過程加入自己的行為,也就是hook這個過程:

         (出現(xiàn)之前)->出現(xiàn)->(出現(xiàn)之后)
                     ↓
->(循環(huán))[(變化之前)->變化->(變化之后)]
                    ↓
->      (消亡之前)->消亡->(消亡之后)

這個就是生命周期了,轉(zhuǎn)化成組件:

(組件聲明->構(gòu)造組件->組件掛載之前)->組件掛載->(組件掛載之后)
                                   ↓
->          (循環(huán))[(組件更新之前)->組件更新->(組件更新之后)]
                                   ↓
->               (組件卸載之前)->組件卸載->(組件卸載之后)

上面(...)中的便是我們的hook,接下來我們來實現(xiàn)它

0x002 初始化框架

復(fù)制項目

$ cp 006-state 007-life-cycle

完成框架主文件-ReactLikeDom.js

$ cd 0x007-life-cycle/src
$ vim ReactLike.js
// ReactLikeDom.js 模擬 ReactDom
class ReactLikeDom {
    static render(component, container) {
    }
}
export default ReactLikeDom   

完成框架主文件-ReactLike.js

// ReactLike.js 用來模擬 React
class ReactLike {
    static createElement(type, props) {
    }
}

export default ReactLike

完成框架主文件-Component.js

// 用來模擬 React.Component
class Component {

}
export default Component

完成框架主文件-ReactLikeNode.js

// 用來模擬 React Element ,每一個組件都將會被抽象成一個 ReatLikeElement
class ReactLikeElement {
    constructor() {

    }

}

export default ReactLikeElement

當(dāng)前項目文件

+ 0x007-life-cycle
+ src
    - Component.js
    - index.html
    - index.js
    - ReactLike.js
    - ReactLikeDom.js
    - ReactLikeElement.js
- .babelrc
- package.json
- webpack.config.js

0x003 我們先看看我們想要干什么
// index.js
import ReactLikeDom from "./ReactLikeDom";
import ReactLike from "./ReactLike";
import Component from "./Component";

// 聲明一個組件
class App extends Component {
    render() {
        return "hello " + this.props.name
    }
}
// 將組件掛載到容器中
ReactLikeDom.render(
    ReactLike.createElement(App, {name: "reactLike"}, null),
    document.getElementById("app")
)

打開瀏覽器查詢最終的效果:

0x004 完成Compoennt.js
這個類其實沒有太多需要做的,只是為了繼承而已,
而在React中每一個組件都必須有一個render方法,該方法返回一個React Element,
而這個方法實在具體的組件完成的,而不是在這里完成,所以我們這里聲明一下就好了
class Component {
    render() {
        
    }
}

export default Component
0x004 完成ReactLike
該類有一個方法:createElement,作用是將一個類組件轉(zhuǎn)化成ReactLikeElement
import ReactLikeElement from "./ReactLikeElement";

class ReactLike {
    static createElement(type, props) {
        // 直接創(chuàng)建一個 ReactLikeElement 并返回, 具體的實現(xiàn)由 ReactLikeElement 自己完成
        return new ReactLikeElement(type, props)
    }
}

export default ReactLike
0x005 完成ReactLikeElement
該類的所有事物都在構(gòu)造器中完成
class ReactLikeElement {
    constructor(type, props) {
        // 實例化組件
        let component = new type(props)
        // 將 props 賦予 該組件實例
        component.props = props
        // 將該組件的真實 dom 保存在 ref 中
        this.ref = component.render()
    }

}

export default ReactLikeElement
0x006 自定義一個組件
// index.js
class App extends Component {
    render() {
        let div = document.createElement("div")
        div.append("hello " + this.props.name)

        return div
    }
}

該組件返回一個divdiv中包含一個字符串,該字符串的構(gòu)成是hello 和這個組件的props中的name構(gòu)成,我們期望外部傳入一個name屬性。

可以使用該自定義組件測試一下ReactLikeElement,看看一個組件究竟會被轉(zhuǎn)化成什么樣:

console.log(new ReactLikeElement(App, {name: "reactLike"}))

查看瀏覽器

0x007 完成ReactDom,將該組件掛載到容器中
class ReactLikeDom {
    static render(reactLikeElement, container) {
        container.append(reactLikeElement.ref)
    }

}

export default ReactLikeDom

ReactLikeDom.render接受一個元素和一個容器,組件是ReactLikeElement,容器是dom,這個方法會將組件掛載到容器上。
這個時候整個流程就已經(jīng)完成了,查看瀏覽器

我們梳理一下整個流程:

// index.js
class App extends Component {
    // 該方法返回一個`dom`,構(gòu)建這個`dom`用到了`props`中的屬性`name`
    render() {
        let div = document.createElement("div")
        div.append("hello " + this.props.name)

        return div
    }
}

/*
 * ReactLikeDom.render 可以將一個`ReactLikeElement`掛載到容器上
 * 而 ReactLike.createElement 正好可以創(chuàng)建一個`ReactLikeElement`
 * 在 ReactLike.createElement 中會構(gòu)造一個 App 實例
 * 然后將 props 傳遞給該 App 實例
 * 然后調(diào)用 App.render
 * 這時候 render 中便可以訪問 props 中的屬性了
 * 接著將 App.render 返回的 dom 保存在 ref 變量中
 * ReactLikeDom.render 其實是把 ref 中的 dom 掛載到 容器上
 */

ReactLikeDom.render(
    ReactLike.createElement(App, {name: "react"}, null),
    document.getElementById("app")
)
0x008 實現(xiàn)生命周期

Component中添加兩個方法,代表其中兩個生命周期

class Component {
    componentWillMount() {

    }

    componentDidMount() {

    }


    render() {

    }
}

export default Component

然后在App組件中實現(xiàn)它:

class App extends Component {
    componentDidMount() {
        console.log("componentDidMount")
    }

    componentWillMount() {
        console.log("componentWillMount")
    }

    render() {
        let div = document.createElement("div")
        div.append("hello " + this.props.name)

        return div
    }
}

接著讓他起作用:

// ReactLikeDom.js
class ReactLikeDom {
    static render(reactLikeElement, container) {
        reactLikeElement.componentWillMount()
        container.append(reactLikeElement.ref)
        reactLikeElement.componentDidMount()
    }

}

export default ReactLikeDom

// ReactLikeElement
class ReactLikeElement {
    constructor(type, props) {
        let component = new type(props)
        component.props = props
        this.ref = component.render()
        this.component = component // 新添加一個屬性
    }

}

export default ReactLikeElement

查看瀏覽器

0x009 總結(jié)

我們已經(jīng)實現(xiàn)了其中兩個生命周期,其他的聲明周期也是如此類似的實現(xiàn),只是插入的位置和時期不同而已,也造成在每個階段我們所能訪問的資源也不同。

0x010 資源

react

transform-react-jsx

源碼

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

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/97058.html

相關(guān)文章

  • React入門0x008: 生命周期

    0x000 概述 上一章說明了生命周期的概念,本質(zhì)上就是框架在操作組件的過程中暴露出來的一系列鉤子,我們可以選擇我們需要的鉤子,完成我們自己的業(yè)務(wù),以下講的是react v16.3以下的生命周期,v16.3以及以上的版本有所不同 0x001 組件掛載 以下是組件掛載的過程中觸發(fā)的聲明周期: class App extends React.Component { constructor(pr...

    loonggg 評論0 收藏0
  • Router入門0x201: 從 URL 到 SPA

    摘要:的全稱是統(tǒng)一資源定位符英文,可以這么說,是一種標(biāo)準(zhǔn),而網(wǎng)址則是符合標(biāo)準(zhǔn)的一種實現(xiàn)而已。渲染器,將組件渲染到頁面上。 0x000 概述 從這一章開始就進入路由章節(jié)了,并不直接從如何使用react-route來講,而是從路由的概念和實現(xiàn)來講,達到知道路由的本質(zhì),而不是只知道如何使用react-route庫的目的,畢竟react-route只是一個庫,是路由的一個實現(xiàn)而已,而不是路由本身。 ...

    honmaple 評論0 收藏0
  • 快速入門React

    摘要:考慮到是快速入門,于是乎我們就記住一點,當(dāng)修改值需要重新渲染的時候,的機制是不會讓他全部重新渲染的,它只會把你修改值所在的重新更新。這一生命周期返回的任何值將會作為參數(shù)被傳遞給。 安裝react npm install creat-react-app -gshowImg(https://segmentfault.com/img/remote/1460000015639868); 這里直...

    figofuture 評論0 收藏0
  • 我的React之路--入門

    摘要:在構(gòu)造函數(shù)里面初始化的數(shù)據(jù),把數(shù)據(jù)放在頁面上,點擊時候調(diào)用方法改變中的數(shù)據(jù)。是中父組件向子組件通信的方式,下面是一個簡單的例子使用組件我是顯示的數(shù)據(jù)我們定義組件時候在構(gòu)造函數(shù)中可以接收到參數(shù),并且要使用傳到的構(gòu)造方法中。 React的學(xué)習(xí)之路還要繼續(xù)走下去,最近一邊在做未完成的項目一邊學(xué)習(xí)React,項目是vue寫的,后面還需要有一個后臺管理系統(tǒng)計劃使用react完成,寒假說長也不長,...

    qpwoeiru96 評論0 收藏0
  • 寫一本關(guān)于 React.js 的小書

    摘要:因為工作中一直在使用,也一直以來想總結(jié)一下自己關(guān)于的一些知識經(jīng)驗。于是把一些想法慢慢整理書寫下來,做成一本開源免費專業(yè)簡單的入門級別的小書,提供給社區(qū)。本書的后續(xù)可能會做成視頻版本,敬請期待。本作品采用署名禁止演繹國際許可協(xié)議進行許可 React.js 小書 本文作者:胡子大哈本文原文:React.js 小書 轉(zhuǎn)載請注明出處,保留原文鏈接以及作者信息 在線閱讀:http://huzi...

    Scorpion 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<