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