摘要:定義一個(gè)組件可以在其他組件中調(diào)用這個(gè)組件調(diào)用組件劉宇組件插入內(nèi)容在上面的案例中可以看到吧寫到當(dāng)中,這種寫法稱為。
React初識(shí)
React是Facebook推出的一個(gè)javascript庫(kù)(用來(lái)創(chuàng)建用戶界面的Javascript庫(kù)),所以他只是和用戶的界面打交道,你可以把它看成MVC中的V(視圖)這一層。
組件React的一切都是基于組件的。web世界的構(gòu)成是基于各種HTML標(biāo)簽的組合,這些標(biāo)簽也叫語(yǔ)意化標(biāo)簽每個(gè)標(biāo)簽代表一個(gè)含義,在react,vue,angular中我們可以將這些標(biāo)簽組合成一個(gè)輪播/導(dǎo)航...等,可以稱為自定義組件。
react中最重要的特性就是基于組件的設(shè)計(jì)流程。使用React你唯一需要關(guān)心的就是如何構(gòu)建組件(封裝性,復(fù)用性,測(cè)試),如下圖,每個(gè)塊都是一個(gè)組件,頁(yè)面由組件構(gòu)建而成,就像搭積木。
每個(gè)組件都有各自的狀態(tài),當(dāng)狀態(tài)變更時(shí),便會(huì)重新渲染整個(gè)組件。
定義一個(gè)組件
import React, { Component } from "react";、 import "./Comment.css"; class Comment extends Component { render() { return ({this.props.name} {this.props.children}); } } export default Comment;
可以在其他組件中調(diào)用這個(gè)組件
import React, { Component } from "react"; import Comment from "./Comment"; import "./App.css"; class App extends Component { render() { return (JSX{/**調(diào)用組件**/}); } } export default App;組件插入內(nèi)容
在上面的案例中可以看到react吧html寫到j(luò)s當(dāng)中,這種寫法稱為JSX。這是一種類似XML的寫法,他可以定義類似HTML一樣簡(jiǎn)潔的樹(shù)狀結(jié)構(gòu)。這種語(yǔ)法結(jié)合了JavaScript語(yǔ)法和HTML的優(yōu)點(diǎn),既可以像平常一樣使用HTML,也可以在里面前套JavaScript語(yǔ)法。這種有好的格式,讓開(kāi)發(fā)者易于閱讀和開(kāi)發(fā)。而且,對(duì)于組件來(lái)說(shuō),直接使用類似HTML的格式,也是非常嗨皮的。但是需要注意的是。JSX和HTML完全不是一回事,JSX只是作為編輯器,把類似HTML的結(jié)構(gòu)編譯成JavaScript。
JSX基本語(yǔ)法注意:在瀏覽器中不能直接使用這種格式,需要添加JSX編譯器來(lái)完成這項(xiàng)工作。
使用類XML語(yǔ)法的好處是標(biāo)簽可以任意嵌套,我們可以像HTML一樣清晰地看到DOM樹(shù)狀結(jié)構(gòu)及其屬性。比如,我們構(gòu)建一個(gè)List組件
const List = () => (
寫這個(gè)組件的過(guò)程就像寫html一樣,只不過(guò)它被包裹在JavaScript的方法中,需要注意以下幾點(diǎn)。
元素類型定義標(biāo)簽時(shí),只允許被一個(gè)標(biāo)簽包裹
標(biāo)簽一定要閉合
在React中創(chuàng)建的虛擬元素可以分為兩類,DOM元素(DOM element)與組件元素(component element)
分別對(duì)應(yīng)著原生DOM元素與自定義元素,而JSX與創(chuàng)建元素過(guò)程有這莫大的關(guān)聯(lián),在JSX中對(duì)應(yīng)的規(guī)則是HTML標(biāo)簽首字母是否為小寫字母,其中小寫首對(duì)應(yīng)DOM元素,而組件元素自然對(duì)應(yīng)大寫首字母
在HTML中,注釋語(yǔ)法是在jsx依舊使用的是js語(yǔ)法注釋,唯一要注意的是,在一個(gè)組件的子元素位置使用注釋要用{}包起來(lái)。
const List = () => (
元素除了標(biāo)簽之外,另一個(gè)組成部分就是標(biāo)簽的屬性。
在JSX中,不論是DOM元素還是組件元素,他門都有屬性。不同的是,DOM元素的屬性是標(biāo)準(zhǔn)規(guī)范屬性,但有兩個(gè)例外--class和for,這是因?yàn)樵贘avaScript中這兩個(gè)單詞都是關(guān)鍵詞。因此有對(duì)應(yīng)的倆個(gè)轉(zhuǎn)化
class屬性改為className。
for屬性改為htmlFor。
在組件中元素的屬性是完全自定義的屬性,也可以理解為組件傳遞的參數(shù)。
組件插入內(nèi)容
在自定義組件中除了上面?zhèn)鬟f屬性的方法外也可以
const comment =組件插入內(nèi)容 ; comment.props.name = "劉宇";
也可以使用es6語(yǔ)法
const data = {name:"劉宇",age:10}; const comment =組件插入內(nèi)容 ;
自定義html屬性,上面說(shuō)的是組件上的屬性,在JSX中往DOM元素中傳入自定義屬性,React是不會(huì)渲染的;
如果要使用HTML自定義屬性,要使用data-前綴,這與HTML標(biāo)準(zhǔn)也是一致的:
//不被渲染 //成功渲染HTML轉(zhuǎn)譯
React會(huì)將所有要顯示到DOM的字符串轉(zhuǎn)義,防止XSS。所以,如果jsx中含有轉(zhuǎn)義后的實(shí)體字符。可以使用以下方法
虛擬DOM(Virtual DOM)直接使用utf-8字符
使用對(duì)應(yīng)的Unicode編碼查詢編碼;
使用數(shù)組組裝{["cc",?," 2017"]}
直接插入原始html
在傳統(tǒng)的web應(yīng)用中每次更新頁(yè)面的時(shí)候都需要手動(dòng)操作DOM來(lái)更新
事件-》執(zhí)行操作-》改變dom
DOM操作非常昂貴。在前端開(kāi)發(fā)中,性能消耗最大的就是DOM操作,而且這部分的操作代碼不好維護(hù)。React把真實(shí)的DOM操作轉(zhuǎn)成JavaScript對(duì)象樹(shù),也就是虛擬DOM;
這是普通的Html標(biāo)簽寫法
React
這是在js中手動(dòng)生成相同dom的寫法
//javascript dom var a = document.createElement("a") a.setAttribute("class", "link") a.setAttribute("href", "https://github.com/facebook/react") a.appendChild(document.createTextNode("React")) //這是一種封裝,沿用的React.createElement的命名 var a = React.createElement("a", { className: "link", href: "https://github.com/facebook/react" }, "React")
所有html結(jié)構(gòu),都可以用js dom來(lái)構(gòu)造,而且能將構(gòu)造的步驟封裝起來(lái),做到「數(shù)據(jù)-dom結(jié)構(gòu)」的映射。
緩存初始數(shù)據(jù),新數(shù)據(jù)進(jìn)來(lái)時(shí),與舊數(shù)據(jù)對(duì)比,找到差異,根據(jù)差異本身的性質(zhì)進(jìn)行dom操作;無(wú)差異,則不作為。
dom本身在js中就是一種數(shù)據(jù)結(jié)構(gòu)
console.dir(document.body)
在控制臺(tái)可以看到body的數(shù)據(jù)結(jié)構(gòu)。然而,dom相關(guān)的數(shù)據(jù)豐富而且復(fù)雜,我們其實(shí)只關(guān)心少數(shù)元素的少數(shù)屬性。
建立一個(gè)javascript plain object,非常輕量,用它保存我們真正關(guān)心的與dom相關(guān)的少數(shù)數(shù)據(jù);對(duì)它進(jìn)行操作,然后對(duì)比操作前后的差異,再根據(jù)映射關(guān)系去操作真正的dom,無(wú)疑能提高性能。
相對(duì)于 DOM 對(duì)象,原生的 JavaScript 對(duì)象處理起來(lái)更快,而且更簡(jiǎn)單。DOM 樹(shù)上的結(jié)構(gòu)、屬性信息我們都可以很容易地用 JavaScript 對(duì)象表示出來(lái):
var element = { type: "ul", // 節(jié)點(diǎn)標(biāo)簽名 props: { // DOM的屬性,用一個(gè)對(duì)象存儲(chǔ)鍵值對(duì) id: "list" }, children: [ // 該節(jié)點(diǎn)的子節(jié)點(diǎn) {type: "li", props: {className: "item"}, children: ["Item 1"]}, {type: "li", props: {className: "item"}, children: ["Item 2"]}, {type: "li", props: {className: "item"}, children: ["Item 3"]}, ] }
上面對(duì)應(yīng)的HTML寫法是:
每次數(shù)據(jù)更新后,重新計(jì)算虛擬DOM,并和上一次的作比較,對(duì)發(fā)生改變的部分做批量更新。React也提供了生命周期方法減少了不必要的對(duì)比過(guò)程,以保證性能
下一篇:react開(kāi)發(fā)教程(二)安裝
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/88246.html
摘要:使用快速構(gòu)建開(kāi)發(fā)環(huán)境第一步安裝全局包是來(lái)自于,通過(guò)該命令我們無(wú)需配置就能快速構(gòu)建開(kāi)發(fā)環(huán)境。執(zhí)行以下命令創(chuàng)建項(xiàng)目項(xiàng)目目錄在瀏覽器中打開(kāi),即可顯示上一篇開(kāi)發(fā)教程初識(shí)下一篇開(kāi)發(fā)教程三組件的構(gòu)建 react安裝 React可以直接下載使用,下載包中也提供了很多學(xué)習(xí)的實(shí)例。本教程使用了 React 的版本為 15.4.2,你可以在官網(wǎng) http://facebook.github.io/reac...
摘要:主要用于構(gòu)建,很多人認(rèn)為是中的視圖。函數(shù)接受另一個(gè)函數(shù)作為參數(shù),返回新生成的對(duì)象的變化,會(huì)導(dǎo)致的變化。用戶無(wú)法直接改變只能觸發(fā)上綁定的事件。表示應(yīng)該要發(fā)生變化了。允許使用方法設(shè)置監(jiān)聽(tīng)函數(shù),一旦發(fā)生變化,就自動(dòng)執(zhí)行這個(gè)函數(shù)。 什么是react React 是一個(gè)用于構(gòu)建用戶界面的 JAVASCRIPT 庫(kù)。React主要用于構(gòu)建UI,很多人認(rèn)為 React 是 MVC 中的 V(視圖)。...
摘要:系列一初識(shí)系列二組件的和系列三組件的生命周期是推出的一個(gè)庫(kù),它的口號(hào)就是用來(lái)創(chuàng)建用戶界面的庫(kù),所以它只是和用戶界面打交道,可以把它看成中的視圖層。系列一初識(shí)系列二組件的和系列三組件的生命周期 React系列---React(一)初識(shí)ReactReact系列---React(二)組件的prop和stateReact系列---React(三)組件的生命周期 showImg(https://...
閱讀 3511·2021-11-23 10:13
閱讀 879·2021-09-22 16:01
閱讀 921·2021-09-09 09:33
閱讀 649·2021-08-05 09:58
閱讀 1734·2019-08-30 11:14
閱讀 1980·2019-08-30 11:02
閱讀 3282·2019-08-29 16:28
閱讀 1498·2019-08-29 16:09