摘要:概述上一章只是稍微了解了一下和相關(guān)的簡(jiǎn)單用法,這一章需要講一下組件的生命周期。生命周期的概念這玩意似乎很高大上,其實(shí)就是一個(gè)假概念罷了,直接來(lái)實(shí)現(xiàn)一個(gè)類似的吧。
0x000 概述
上一章只是稍微了解了一下state和setState相關(guān)的簡(jiǎn)單用法,這一章需要講一下組件的生命周期。
0x001 生命周期的概念這玩意似乎很高大上,其實(shí)就是一個(gè)假概念罷了,直接來(lái)實(shí)現(xiàn)一個(gè)類似的吧。大凡事物從出現(xiàn)到消亡都有個(gè)過程,而這個(gè)過程大抵可以分為:
出現(xiàn)->變化->消亡
而web開發(fā)中,組件也有類似的過程,當(dāng)然作為組件的創(chuàng)造者,我們可以干預(yù)這個(gè)過程,在每個(gè)過程加入自己的行為,也就是hook這個(gè)過程:
(出現(xiàn)之前)->出現(xiàn)->(出現(xiàn)之后) ↓ ->(循環(huán))[(變化之前)->變化->(變化之后)] ↓ -> (消亡之前)->消亡->(消亡之后)
這個(gè)就是生命周期了,轉(zhuǎn)化成組件:
(組件聲明->構(gòu)造組件->組件掛載之前)->組件掛載->(組件掛載之后) ↓ -> (循環(huán))[(組件更新之前)->組件更新->(組件更新之后)] ↓ -> (組件卸載之前)->組件卸載->(組件卸載之后)
上面(...)中的便是我們的hook,接下來(lái)我們來(lái)實(shí)現(xiàn)它
0x002 初始化框架
復(fù)制項(xiàng)目
$ 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 用來(lái)模擬 React class ReactLike { static createElement(type, props) { } } export default ReactLike
完成框架主文件-Component.js
// 用來(lái)模擬 React.Component class Component { } export default Component
完成框架主文件-ReactLikeNode.js
// 用來(lái)模擬 React Element ,每一個(gè)組件都將會(huì)被抽象成一個(gè) ReatLikeElement class ReactLikeElement { constructor() { } } export default ReactLikeElement
當(dāng)前項(xià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"; // 聲明一個(gè)組件 class App extends Component { render() { return "hello " + this.props.name } } // 將組件掛載到容器中 ReactLikeDom.render( ReactLike.createElement(App, {name: "reactLike"}, null), document.getElementById("app") )
打開瀏覽器查詢最終的效果:
0x004 完成Compoennt.js這個(gè)類其實(shí)沒有太多需要做的,只是為了繼承而已,
而在React中每一個(gè)組件都必須有一個(gè)render方法,該方法返回一個(gè)React Element,
而這個(gè)方法實(shí)在具體的組件完成的,而不是在這里完成,所以我們這里聲明一下就好了
class Component { render() { } } export default Component0x004 完成ReactLike類
該類有一個(gè)方法:createElement,作用是將一個(gè)類組件轉(zhuǎn)化成ReactLikeElement
import ReactLikeElement from "./ReactLikeElement"; class ReactLike { static createElement(type, props) { // 直接創(chuàng)建一個(gè) ReactLikeElement 并返回, 具體的實(shí)現(xiàn)由 ReactLikeElement 自己完成 return new ReactLikeElement(type, props) } } export default ReactLike0x005 完成ReactLikeElement
該類的所有事物都在構(gòu)造器中完成
class ReactLikeElement { constructor(type, props) { // 實(shí)例化組件 let component = new type(props) // 將 props 賦予 該組件實(shí)例 component.props = props // 將該組件的真實(shí) dom 保存在 ref 中 this.ref = component.render() } } export default ReactLikeElement0x006 自定義一個(gè)組件
// index.js class App extends Component { render() { let div = document.createElement("div") div.append("hello " + this.props.name) return div } }
該組件返回一個(gè)div,div中包含一個(gè)字符串,該字符串的構(gòu)成是hello 和這個(gè)組件的props中的name構(gòu)成,我們期望外部傳入一個(gè)name屬性。
可以使用該自定義組件測(cè)試一下ReactLikeElement,看看一個(gè)組件究竟會(huì)被轉(zhuǎn)化成什么樣:
console.log(new ReactLikeElement(App, {name: "reactLike"}))
查看瀏覽器
class ReactLikeDom { static render(reactLikeElement, container) { container.append(reactLikeElement.ref) } } export default ReactLikeDom
ReactLikeDom.render接受一個(gè)元素和一個(gè)容器,組件是ReactLikeElement,容器是dom,這個(gè)方法會(huì)將組件掛載到容器上。
這個(gè)時(shí)候整個(gè)流程就已經(jīng)完成了,查看瀏覽器
我們梳理一下整個(gè)流程:
// index.js class App extends Component { // 該方法返回一個(gè)`dom`,構(gòu)建這個(gè)`dom`用到了`props`中的屬性`name` render() { let div = document.createElement("div") div.append("hello " + this.props.name) return div } } /* * ReactLikeDom.render 可以將一個(gè)`ReactLikeElement`掛載到容器上 * 而 ReactLike.createElement 正好可以創(chuàng)建一個(gè)`ReactLikeElement` * 在 ReactLike.createElement 中會(huì)構(gòu)造一個(gè) App 實(shí)例 * 然后將 props 傳遞給該 App 實(shí)例 * 然后調(diào)用 App.render * 這時(shí)候 render 中便可以訪問 props 中的屬性了 * 接著將 App.render 返回的 dom 保存在 ref 變量中 * ReactLikeDom.render 其實(shí)是把 ref 中的 dom 掛載到 容器上 */ ReactLikeDom.render( ReactLike.createElement(App, {name: "react"}, null), document.getElementById("app") )0x008 實(shí)現(xiàn)生命周期
在Component中添加兩個(gè)方法,代表其中兩個(gè)生命周期
class Component { componentWillMount() { } componentDidMount() { } render() { } } export default Component
然后在App組件中實(shí)現(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 // 新添加一個(gè)屬性 } } export default ReactLikeElement
查看瀏覽器
0x009 總結(jié)我們已經(jīng)實(shí)現(xiàn)了其中兩個(gè)生命周期,其他的聲明周期也是如此類似的實(shí)現(xiàn),只是插入的位置和時(shí)期不同而已,也造成在每個(gè)階段我們所能訪問的資源也不同。
0x010 資源react
transform-react-jsx
源碼
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/97058.html
0x000 概述 上一章說明了生命周期的概念,本質(zhì)上就是框架在操作組件的過程中暴露出來(lái)的一系列鉤子,我們可以選擇我們需要的鉤子,完成我們自己的業(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)的一種實(shí)現(xiàn)而已。渲染器,將組件渲染到頁(yè)面上。 0x000 概述 從這一章開始就進(jìn)入路由章節(jié)了,并不直接從如何使用react-route來(lái)講,而是從路由的概念和實(shí)現(xiàn)來(lái)講,達(dá)到知道路由的本質(zhì),而不是只知道如何使用react-route庫(kù)的目的,畢竟react-route只是一個(gè)庫(kù),是路由的一個(gè)實(shí)現(xiàn)而已,而不是路由本身。 ...
摘要:考慮到是快速入門,于是乎我們就記住一點(diǎn),當(dāng)修改值需要重新渲染的時(shí)候,的機(jī)制是不會(huì)讓他全部重新渲染的,它只會(huì)把你修改值所在的重新更新。這一生命周期返回的任何值將會(huì)作為參數(shù)被傳遞給。 安裝react npm install creat-react-app -gshowImg(https://segmentfault.com/img/remote/1460000015639868); 這里直...
摘要:在構(gòu)造函數(shù)里面初始化的數(shù)據(jù),把數(shù)據(jù)放在頁(yè)面上,點(diǎn)擊時(shí)候調(diào)用方法改變中的數(shù)據(jù)。是中父組件向子組件通信的方式,下面是一個(gè)簡(jiǎn)單的例子使用組件我是顯示的數(shù)據(jù)我們定義組件時(shí)候在構(gòu)造函數(shù)中可以接收到參數(shù),并且要使用傳到的構(gòu)造方法中。 React的學(xué)習(xí)之路還要繼續(xù)走下去,最近一邊在做未完成的項(xiàng)目一邊學(xué)習(xí)React,項(xiàng)目是vue寫的,后面還需要有一個(gè)后臺(tái)管理系統(tǒng)計(jì)劃使用react完成,寒假說長(zhǎng)也不長(zhǎng),...
摘要:因?yàn)楣ぷ髦幸恢痹谑褂?,也一直以?lái)想總結(jié)一下自己關(guān)于的一些知識(shí)經(jīng)驗(yàn)。于是把一些想法慢慢整理書寫下來(lái),做成一本開源免費(fèi)專業(yè)簡(jiǎn)單的入門級(jí)別的小書,提供給社區(qū)。本書的后續(xù)可能會(huì)做成視頻版本,敬請(qǐng)期待。本作品采用署名禁止演繹國(guó)際許可協(xié)議進(jìn)行許可 React.js 小書 本文作者:胡子大哈本文原文:React.js 小書 轉(zhuǎn)載請(qǐng)注明出處,保留原文鏈接以及作者信息 在線閱讀:http://huzi...
閱讀 2164·2021-11-24 09:39
閱讀 1655·2021-10-11 10:59
閱讀 2575·2021-09-24 10:28
閱讀 3459·2021-09-08 09:45
閱讀 1344·2021-09-07 10:06
閱讀 1748·2019-08-30 15:53
閱讀 2144·2019-08-30 15:53
閱讀 1477·2019-08-30 15:53