摘要:概述上一章只是稍微了解了一下和相關(guān)的簡單用法,這一章需要講一下組件的生命周期。生命周期的概念這玩意似乎很高大上,其實就是一個假概念罷了,直接來實現(xiàn)一個類似的吧。
0x000 概述
上一章只是稍微了解了一下state和setState相關(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.js0x003 我們先看看我們想要干什么
// 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 Component0x004 完成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 ReactLike0x005 完成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 ReactLikeElement0x006 自定義一個組件
// index.js class App extends Component { render() { let div = document.createElement("div") div.append("hello " + this.props.name) return div } }
該組件返回一個div,div中包含一個字符串,該字符串的構(gòu)成是hello 和這個組件的props中的name構(gòu)成,我們期望外部傳入一個name屬性。
可以使用該自定義組件測試一下ReactLikeElement,看看一個組件究竟會被轉(zhuǎn)化成什么樣:
console.log(new ReactLikeElement(App, {name: "reactLike"}))
查看瀏覽器
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
0x000 概述 上一章說明了生命周期的概念,本質(zhì)上就是框架在操作組件的過程中暴露出來的一系列鉤子,我們可以選擇我們需要的鉤子,完成我們自己的業(yè)務(wù),以下講的是react v16.3以下的生命周期,v16.3以及以上的版本有所不同 0x001 組件掛載 以下是組件掛載的過程中觸發(fā)的聲明周期: class App extends React.Component { constructor(pr...
摘要:的全稱是統(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)而已,而不是路由本身。 ...
摘要:考慮到是快速入門,于是乎我們就記住一點,當(dāng)修改值需要重新渲染的時候,的機制是不會讓他全部重新渲染的,它只會把你修改值所在的重新更新。這一生命周期返回的任何值將會作為參數(shù)被傳遞給。 安裝react npm install creat-react-app -gshowImg(https://segmentfault.com/img/remote/1460000015639868); 這里直...
摘要:在構(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完成,寒假說長也不長,...
摘要:因為工作中一直在使用,也一直以來想總結(jié)一下自己關(guān)于的一些知識經(jīng)驗。于是把一些想法慢慢整理書寫下來,做成一本開源免費專業(yè)簡單的入門級別的小書,提供給社區(qū)。本書的后續(xù)可能會做成視頻版本,敬請期待。本作品采用署名禁止演繹國際許可協(xié)議進行許可 React.js 小書 本文作者:胡子大哈本文原文:React.js 小書 轉(zhuǎn)載請注明出處,保留原文鏈接以及作者信息 在線閱讀:http://huzi...
閱讀 2095·2021-11-24 09:39
閱讀 1563·2021-10-11 10:59
閱讀 2507·2021-09-24 10:28
閱讀 3382·2021-09-08 09:45
閱讀 1275·2021-09-07 10:06
閱讀 1672·2019-08-30 15:53
閱讀 2067·2019-08-30 15:53
閱讀 1425·2019-08-30 15:53