react入門(一):JSX渲染原理


一.原理

JSX的渲染原理主要分為三部分:

1.基於babel-preset-react-app這個語法解析包,把jsx語法轉換成一個名為 React.createElement() 的方法調用。

const element = (
  <h1 className="greeting">
    Hello, world!
  </h1>
);
轉換后為:
const element = React.createElement( 'h1', {className: 'greeting'}, 'Hello, world!' );
<div>
    <h1 style='color: red' className='title'>todo with react</h1>
    <ul>
      <li>a</li>
      <li>b</li>
    </ul>    
</div>
轉換后為:
React.createElement("div", null, React.createElement(
    "h1",
    { style: "color: red", className: "title"   },
    "todo with react"
   ), React.createElement("ul", null, React.createElement("li", null, "a"),
     React.createElement("li", null, "b") ) );

 2.基於createElement把傳遞的參數處理為jsx對象

createElement():React在渲染解析的時候,會把所有的html標簽都轉換為(返回一個對象):
返回對象的格式:
{
  type: 'div'   ---存儲的是標簽名或者組件名
  props: {    ---props: 屬性對象(給當前元素設置的屬性都在這里)(如果有子元素,會多一個children屬性,依次把子元素傳遞進來,沒有就沒有children屬性)
    style: '',
    className: '',
    children: [] 可能有可能沒有,有的話:可能是一個數組,也可能是一個字符串或者是一個對象。
  },
  key: null,
  ref: null
}
例如上面的jsx語法會返回:
const element = {
  type: 'h1',
  props: {
    className: 'greeting',
    children: 'Hello, world'
  }
};

3.基於render把jsx對象按照動態創建dom元素的方式插入到指定的容器中即可。

 關於render函數

render(jsx,container,callback)

render(<h1>標題</h1>, document.getElementById('root'));

主要接受三個參數:
- jsx:javascript xml(html) react獨有的語法;虛擬DOM(virtual dom)
- container:虛擬DOM最后渲染到的容器,不建議是body
- callback:把虛擬DOM插入到頁面中,觸發的回調函數(已經成為真實的DOM)

 

2.語法

具體實戰代碼

index.js

import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';

ReactDOM.render(<App />, document.getElementById('root'));


App.js import React from 'react'; function App() { return (     //jsx語法:允許在js代碼中直接寫入html標簽,並且可以在html標簽中寫入js表達式。     <div>       {2 + 1},hello react     </div>   ); }

布爾值、Null 和 Undefined 被忽略:

falsenullundefined 和 true 都是有效的子代,但它們不會直接被渲染。

這些都是等價的

<div></div> <div>{false}</div> <div>{null}</div> <div>{undefined}</div> <div>{true}</div>
<div>
  {showHeader && <Header />}  //該JSX只會在showHeadertrue時渲染<Header />組件。
  <Content />
</div>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM