亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

React系列 --- 簡(jiǎn)單模擬語法(一)

piglei / 1424人閱讀

摘要:系列系列簡(jiǎn)單模擬語法一系列合成事件與二系列算法實(shí)現(xiàn)分析三系列從到再到四系列與部分源碼解析五系列從使用了解的各種使用方案六前言我們先不講什么語法原理先根據(jù)效果強(qiáng)行模擬語法使用實(shí)現(xiàn)一個(gè)簡(jiǎn)易版的第一步我們先用類

React系列

React系列 --- 簡(jiǎn)單模擬語法(一)
React系列 --- Jsx, 合成事件與Refs(二)
React系列 --- virtualdom diff算法實(shí)現(xiàn)分析(三)
React系列 --- 從Mixin到HOC再到HOOKS(四)
React系列 --- createElement, ReactElement與Component部分源碼解析(五)
React系列 --- 從使用React了解Css的各種使用方案(六)

前言

我們先不講什么語法原理,先根據(jù)API效果強(qiáng)行模擬語法使用,實(shí)現(xiàn)一個(gè)簡(jiǎn)易版的React.

render

第一步我們先用類創(chuàng)建一個(gè)元素返回,并且綁定點(diǎn)擊事件,代碼如下,可以正常看到一個(gè)按鈕出現(xiàn)了.

class AddButton {
  createDOM(domString) {
    const div = document.createElement("div");
    div.innerHTML = domString;
    return div;
  }

  render() {
    this.dom = this.createDOM(``);
    this.dom.addEventListener("click", () => console.log("click"), false);
    return this.dom;
  }
}

document.body.appendChild(new AddButton().render());
state && setState

實(shí)現(xiàn)類狀態(tài)和修改狀態(tài)方法

class AddButton {
  constructor() {
    this.state = { num: 0 };
  }

  createDOM(domString) {
    const div = document.createElement("div");
    div.innerHTML = domString;
    return div;
  }

  setState(state) {
    this.state = state;
    this.dom = this.render();
  }

  handleAdd() {
    const num = this.state.num + 1;
    this.setState({
      num: num
    });
  }

  render() {
    this.dom = this.createDOM(``);
    this.dom.addEventListener("click", () => this.handleAdd(), false);
    console.log(this.dom);
    return this.dom;
  }
}

document.body.appendChild(new AddButton().render());

渲染之后看到this dom輸出已經(jīng)發(fā)現(xiàn)改變了,但是視圖并沒有渲染,那是因?yàn)檫@是結(jié)尾一次性插入,下面就渲染視圖這塊往下走

重新渲染

我們現(xiàn)在把插入數(shù)據(jù)的操作內(nèi)置到class里面,新增一個(gè)方法插入新元素移除舊元素.

class AddButton {
  constructor() {
    this.state = { num: 0 };
  }

  createDOM(domString) {
    const div = document.createElement("div");
    div.innerHTML = domString;
    return div;
  }

  changeDom() {
    const oDom = this.dom;
    this.dom = this.render();
    document.body.insertBefore(this.dom, oDom);
    document.body.removeChild(oDom);
  }

  setState(state) {
    this.state = state;
    this.changeDom();
  }

  handleAdd() {
    const num = this.state.num + 1;
    this.setState({
      num: num
    });
  }

  render() {
    this.dom = this.createDOM(``);
    this.dom.addEventListener("click", () => this.handleAdd(), false);
    return this.dom;
  }
}

document.body.appendChild(new AddButton().render());

現(xiàn)在效果雖然實(shí)現(xiàn),但是還是得開頭手動(dòng)把元素插入視圖

抽取公用類

我們先將一些共有方法提取到一個(gè)多帶帶類

class Component {
  constructor() {}

  createDOM(domString) {
    const div = document.createElement("div");
    div.innerHTML = domString;
    return div;
  }

  changeDom() {
    const oDom = this.dom;
    this.dom = this._render();
    this.wrapper.insertBefore(this.dom, oDom);
    this.wrapper.removeChild(oDom);
  }

  setState(state) {
    this.state = state;
    this.changeDom();
  }

  _render(wrapper) {
    if (wrapper) this.wrapper = wrapper;
    this.dom = this.createDOM(this.render());
    this.dom.addEventListener("click", () => this.handleAdd(), false);
    return this.dom;
  }
}

然后組件只需要直接繼承Component然后處理自己邏輯即可

class AddButton extends Component {
  constructor() {
    super();
    this.state = { num: 0 };
  }

  handleAdd() {
    const num = this.state.num + 1;
    this.setState({
      num: num
    });
  }

  render() {
    return ``;
  }
}

還有一個(gè)問題是點(diǎn)擊事件暫時(shí)還是耦合進(jìn)Component里面,先略過不提.

ReactDom.render

大家都知道React會(huì)提供這么一個(gè)方法將組件插入一個(gè)指定元素,我們直接模擬

const ReactDom = {
  render(component, wrapper) {
    wrapper.appendChild(component._render(wrapper));
  }
};

ReactDom.render(new AddButton(), document.getElementById("root"));
Props

還有一個(gè)重要的傳輸數(shù)據(jù)實(shí)現(xiàn)如下

const ReactDom = {
  render(component, wrapper) {
    wrapper.appendChild(component._render(wrapper))
  }
}

class Component {
  constructor(props = {}) {
    this.props = props
  }

  createDOM(domString) {
    const div = document.createElement("div")
    div.innerHTML = domString
    return div
  }

  changeDom() {
    const oDom = this.dom
    this.dom = this._render()
    this.wrapper.insertBefore(this.dom, oDom)
    this.wrapper.removeChild(oDom)
  }

  setState(state) {
    this.state = state
    this.changeDom()
  }

  _render(wrapper) {
    if (wrapper) this.wrapper = wrapper
    this.dom = this.createDOM(this.render())
    this.dom.addEventListener("click", () => this.handleAdd(), false)
    return this.dom
  }
}

class AddButton extends Component {
  constructor(props) {
    super(props)
    this.state = { num: 0 }
  }

  handleAdd() {
    const num = this.state.num + 1
    this.setState({
      num: num
    })
  }

  render() {
    console.log(this.props)
    return ``
  }
}

ReactDom.render(new AddButton({a:1}), document.getElementById("root"))

至此,拋開實(shí)際思路不說,我們已經(jīng)簡(jiǎn)單模擬出來React的一般語法實(shí)現(xiàn)了.

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/106484.html

相關(guān)文章

  • React系列 --- Jsx, 合成事件與Refs(二)

    摘要:系列系列簡(jiǎn)單模擬語法一系列合成事件與二系列算法實(shí)現(xiàn)分析三系列從到再到四系列與部分源碼解析五系列從使用了解的各種使用方案六的誕生他是的一種擴(kuò)展語法。這個(gè)函數(shù)接受組件的實(shí)例或元素作為參數(shù),以存儲(chǔ)它們并使它們能被其他地方訪問。 React系列 React系列 --- 簡(jiǎn)單模擬語法(一)React系列 --- Jsx, 合成事件與Refs(二)React系列 --- virtualdom di...

    LiuZh 評(píng)論0 收藏0
  • React系列 --- 從使用React了解Css的各種使用方案(六)

    摘要:當(dāng)然這不是只限于使用或者其他打包工具的方式都能支持使用優(yōu)點(diǎn)模塊化和可重用性沒有沖突顯性依賴不會(huì)污染全局可以配合預(yù)處理器使用少開發(fā)單獨(dú)文件寫法基本一致 To define is to limit. 定義一樣?xùn)|西,就意味著限制了它?!鯛柕?《道林·格雷的畫像》 React系列 React系列 --- 簡(jiǎn)單模擬語法(一)React系列 --- Jsx, 合成事件與Refs(二)Reac...

    freecode 評(píng)論0 收藏0
  • 阿里云前端周刊 - 第 18 期

    摘要:然鵝在過去的兩個(gè)月里,對(duì)的理解發(fā)生了一波三折的變化。發(fā)布自版本發(fā)布之后,一直致力于提升版本迭代速度,盡可能地通過小的更新來修復(fù)存在的問題。 推薦 1. 深入淺出 React 高階組件 https://zhuanlan.zhihu.com/p/... 由高階函數(shù)引申高階組件,高階組件是接受 React 組件作為輸入,輸出一個(gè)新的 React 組件的組件,本文介紹了在 React 工程中如...

    luck 評(píng)論0 收藏0
  • 前端文檔收集

    摘要:系列種優(yōu)化頁面加載速度的方法隨筆分類中個(gè)最重要的技術(shù)點(diǎn)常用整理網(wǎng)頁性能管理詳解離線緩存簡(jiǎn)介系列編寫高性能有趣的原生數(shù)組函數(shù)數(shù)據(jù)訪問性能優(yōu)化方案實(shí)現(xiàn)的大排序算法一怪對(duì)象常用方法函數(shù)收集數(shù)組的操作面向?qū)ο蠛驮屠^承中關(guān)鍵詞的優(yōu)雅解釋淺談系列 H5系列 10種優(yōu)化頁面加載速度的方法 隨筆分類 - HTML5 HTML5中40個(gè)最重要的技術(shù)點(diǎn) 常用meta整理 網(wǎng)頁性能管理詳解 HTML5 ...

    jsbintask 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<