激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - 編程技術 - React.JS中JSX的原理與關鍵實現

React.JS中JSX的原理與關鍵實現

2020-11-30 23:02前端歷劫之路maomin9761 編程技術

本篇和大家一起學習React.js中JSX的原理與關鍵實現

React.JS中JSX的原理與關鍵實現

在開始開發之前,我們需要創建一個空項目文件夾。

安裝

初始化

npm init -y 

2.安裝webpack相關依賴

npm install webpack webpack-cli -D 

3.安裝babel-loader相關依賴

npm install babel-loader @babel/core @babel/preset-env -D 

4.安裝jsx支持依賴

npm install @babel/plugin-transform-react-jsx -D 

配置

1.在根目錄下創建main.js文件 此文件為入口文件。

2.在項目根目錄下創建webpack.config.js

module.exports={ 

  entry:{ 

    main:'./main.js' 

  }, 

  module:{ 

    rules:[ 

      { 

        test:/\.js$/, 

        use:{ 

          loader:'babel-loader'

          options:{ 

            presets:['@babel/preset-env'], 

            plugins:[['@babel/plugin-transform-react-jsx',{pragma:'createElement'}]] // 自定義設置pragma參數,我也可以設置為我的名字:maomin 

          } 

        } 

      } 

    ] 

  }, 

  mode:'development'

  optimization:{ 

    minimize: false 

3.創建一個reactJsx.js文件 此文件為主要邏輯文件。

開發

reactJsx.js

// 封裝創建Dom節點 

class ElementWrapper { 

  constructor(type) { 

    this.root = document.createElement(type); 

  } 

  setAttibute(name, value) { 

    this.root.setAttibute(name, value); 

  } 

  appendChild(component) { 

    this.root.appendChild(component.root); 

  } 

 

// 封裝插入文本節點 

class TextWrapper { 

  constructor(content) { 

    this.root = document.createTextNode(content); 

  } 

// 組件 

export class Component { 

  constructor() { 

    this.props = Object.create(null); // 創建一個原型為null的空對象 

    this.children = []; 

    this._root = null

  } 

  setAttribute(name, value) { 

    this.props[name] = value; 

  } 

  appendChild(component) { 

    this.children.push(component); 

  } 

  get root() { // 取值 

    if (!this._root) { 

      this._root = this.render().root; 

    } 

    return this._root; 

  } 

// 創建節點,createElement對照 webapck.config.js 中pragma參數。 

export function createElement(type, attributes, ...children) { 

  let e; 

  if (typeof type === "string") { 

    e = new ElementWrapper(type); 

  } else { 

    e = new type(); 

  } 

  for (let p in attributes) { // 循環屬性 

    e.setAttribute(p, attributes[p]); 

  } 

  let insertChildren = (children) => { 

    for (let child of children) { 

      if (typeof child === "string") { 

        child = new TextWrapper(child); 

      } 

      if (typeof child === "object" && child instanceof Array) { 

        insertChildren(child); // 遞歸 

      } else { 

        e.appendChild(child); 

      } 

    } 

  }; 

  insertChildren(children); 

  return e; 

 

// 添加到Dom中 

export function render(component, parentElement) { 

  parentElement.appendChild(component.root); 

main.js

import {createElement,Component,render} from './reactJsx.js'class MyComponent extends Component { render(){ return

maomin

import {createElement,Component,render} from './reactJsx.js' 

 

class MyComponent extends Component { 

  render(){ 

    return <div> 

      <h1>maomin</h1> 

      {this.children} 

    </div> 

  } 

 

render(<MyComponent id="name" class="age"

  <div>xqm</div> 

  <div>my girlfriend</div> 

</MyComponent>,document.body) 

執行

npx webpack 

在dist文件夾下創建html文件,然后引入main.js,打開html文件就可以看到效果了。

React.JS中JSX的原理與關鍵實現

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 怦然心动50免费完整版 | 夜夜看| 欧美在线小视频 | 久久亚洲精品国产一区 | 中国av免费在线观看 | 免费观看视频在线 | 亚洲免费永久 | 亚洲精品一区二区三区免 | 久久草草影视免费网 | 国产小视频在线 | h视频在线免费观看 | 国产亚洲精品久久久久久久久久 | 日本精品免费观看 | 国产超碰人人做人人爱 | 销魂美女一区二区 | 国产精品一二三区 | 人人舔人人射 | 日韩av在线网 | 中文字幕在线第二页 | 免费国产自久久久久三四区久久 | 又黄又爽免费无遮挡在线观看 | 伊久在线 | 久久国产秒 | www.三区| 狠狠干伊人网 | 久久久久亚洲精品 | 小视频免费在线观看 | 黄色成年在线观看 | 日韩精品久久久久久久电影99爱 | 日韩大片在线永久观看视频网站免费 | 99精品热视频 | 欧美日韩国产综合网 | 国产精品亚洲一区二区三区久久 | 国产电影av在线 | 精品国产九九九 | 国产免费观看一区二区三区 | 第四色成人网 | 亚洲成人入口 | 大胆在线日本aⅴ免费视频 永久免费毛片 | av免费在线观看不卡 | 欧美性受ⅹ╳╳╳黑人a性爽 |