建立頁面
為了使用React,要運用兩個類庫:React和ReactDOM.React用來建立檢視;ReactDOM用來在瀏覽器中渲染UI。
虛擬DOM
虛擬DOM是由React元素組成的,概念上與HTML元素類似的,不過他們實際上是JavaScript物件。直接訪問JavaScript物件要比訪問DOM API高效的多。我們可以修改Javascript物件,即虛擬DOM,然後React會通過DOM API儘可能高效地渲染這些變更。
React元素
一個React元素是對實際DOM應該如果表示的具體描述。換句話說,React元素表示應該如何建立瀏覽器DOM的一組指令。
React.createElement('h1', // 元素名
{id: 'recipe-0', 'data-type': 'title'}, //屬性
'Bake Salmon' // 子節點,這裡是一個文字
);
<h1 data-reactroot id='recipe-0' date-type='title'>Bake Salmon</h1>
複製程式碼
ReactDOM
用ReactDOM渲染一個React元素。
ReactDom.render(reactElement, document.getElementById('target'))
複製程式碼
使用資料構造元素
React可以將資料和UI元素隔離。
React.createElement(
'ul', // 元素名
{className: 'ingredients'}, // 屬性,className代替class表示類名
items.map((ingredient, i) => // item是一個JavaScript陣列
React.createElement('li', {key: i}, ingredient); // key可以幫助react高效更新DOM
) // 子節點,這裡是一系列<li>
)
複製程式碼
React元件
三種建立元件的方法:
- React.createClass
const IngredirentsList = React.createClass({
displayName: 'IngredirentsList',
render () {
return React.createElement('ul', {className: 'ingredients'},
this.props.items.map((ingredient, i) =>
React.createElement('li', {key: i}, ingredient);)
)
}
});
ReactDOM.render(
React.createElement(IngredirentsList, {items}, null), items是一個包含原料的陣列
document.getElementById('target')
)
複製程式碼
- React.Component
class IngredientList extends React.Component {
renderListItem (ingredient, i) {
React.createElement('li', {key: i}, ingredient);)
}
render {
return React.createElement('ul'. {className: 'ingredients'},
this.props.items.map(this.renderListItem)
)
}
}
複製程式碼
- 無狀態函式式元件:是(純)函式而非物件,沒有this作用域
const IngredientList = props =>
React.createElement('ul', {className: 'ingredients'},
props.items.map((ingredient, i) => {
React.createElement('li', {key: i}, ingredient);)
})
)
複製程式碼
三種方法適用場景: 1.無狀態元件:純展示元件,只負責展示傳入的props,不涉及state 2.createClass: 能用React.Component就別用這個方法了 3.React.Component: 推薦方法。 2、3的區別包括,this的繫結,prop和state配置的不同。詳情點選這裡
DOM渲染
如果有新DOM需要插入,ReactDOM以最小的代價完成插入,如果資料改變導致頁面的修改,那麼ReactDOM會更新更改的DOM元素。以確保搞笑的UI重繪。