學(xué)習(xí)React系列1-React-tutorial全解析_html/css_WEB-ITnose
Jun 24, 2016 am 11:16 AM
React-tutorial例子全解析
Talk is cheap,Show me the code
近些時(shí)間一直在關(guān)注React,關(guān)于 如何學(xué)習(xí)React可以參照鏈接的文章自行制定計(jì)劃。千里之行,始于足下。本文是React官方的教程上的一個(gè)例子,通過詳細(xì)地學(xué)習(xí),從中收獲不少,特此做了筆記,與大家共享交流進(jìn)步。
起步
-
下載 例子,然后進(jìn)行解壓
-
由于采用的node環(huán)境,因此下載解壓之后,只需在所在目錄運(yùn)行
npm installnode server.js
-
采用默認(rèn)端口設(shè)置,只需打開瀏覽器,訪問 http://localhost:3000/
目錄結(jié)構(gòu)說明
react-tutorial
--node_modules --body-parser:express中間件,用于接收和解析json數(shù)據(jù) --express:express框架--public --css --base.css:基本樣式文件 --scripts -- example.js:React應(yīng)用js文件 index.html:基本的HTML結(jié)構(gòu)--.editorconfig:用于在不同的編輯器中統(tǒng)一編輯風(fēng)格(文件編碼)的配置文件--.gitignore:git相關(guān)配置文件--app.json:web app的相關(guān)信息--comments.json:上傳的評(píng)論數(shù)據(jù)--LICENSE:項(xiàng)目代碼使用協(xié)議--package.json:項(xiàng)目所依賴的包,npm install的安裝包的配置文件--README.md:項(xiàng)目說明書,里面有使用說明--requirements.txt:不清楚--server.js:服務(wù)器端的js代碼
App功能
此項(xiàng)目構(gòu)建了一個(gè)簡單的應(yīng)用,如圖所示
服務(wù)器端
服務(wù)器端的功能還是相對(duì)簡單的,通過代碼注釋的形式來分析
-
導(dǎo)入了依賴的模塊
var fs = require('fs'); //讀寫文件var path = require('path'); //路徑var express = require('express'); //express框架var bodyParser = require('body-parser'); //中間件
-
生成app,并且進(jìn)行配置
//獲取comments.json文件的路徑var COMMENTS_FILE = path.join(__dirname, 'comments.json');//設(shè)置端口app.set('port', (process.env.PORT || 3000));//設(shè)置靜態(tài)文件的文件目錄路徑app.use('/', express.static(path.join(__dirname, 'public')));//啟用bodyParser中間件接收請(qǐng)求,并且接收并解析json數(shù)據(jù)app.use(bodyParser.json());app.use(bodyParser.urlencoded({extended: true}));
-
設(shè)置響應(yīng)頭部信息
app.use(function(req, res, next) { //允許跨域 CORS res.setHeader('Access-Control-Allow-Origin', '*'); //緩存設(shè)置 res.setHeader('Cache-Control', 'no-cache'); next();});
-
設(shè)置get請(qǐng)求url對(duì)應(yīng)的處理函數(shù)(獲取評(píng)論json數(shù)據(jù))
app.get('/api/comments', function(req, res) { //讀取comments.json文件,并且解析為json數(shù)據(jù) fs.readFile(COMMENTS_FILE, function(err, data) { if (err) { console.error(err); process.exit(1); } //讀取成功后,返回 res.json(JSON.parse(data)); });});
-
設(shè)置post請(qǐng)求url對(duì)應(yīng)的處理函數(shù)(提交評(píng)論數(shù)據(jù))
app.post('/api/comments', function(req, res) { //先讀取comments.json文件 fs.readFile(COMMENTS_FILE, function(err, data) { if (err) { console.error(err); process.exit(1); } //將文件內(nèi)容解析為json數(shù)據(jù) var comments = JSON.parse(data); //獲取新評(píng)論 var newComment = { id: Date.now(), author: req.body.author, text: req.body.text, }; //添加json數(shù)組中 comments.push(newComment); //將json數(shù)據(jù)寫回到comments.json文件中,并且返回全部的評(píng)論數(shù)據(jù) fs.writeFile(COMMENTS_FILE, JSON.stringify(comments, null, 4), function(err) { if (err) { console.error(err); process.exit(1); } res.json(comments); }); });});
-
啟動(dòng),監(jiān)聽端口
app.listen(app.get('port'), function() { console.log('Server started: http://localhost:' + app.get('port') + '/');});
web端
web端核心在于 example.js文件,結(jié)合官網(wǎng)的資料,我們對(duì)這個(gè)應(yīng)用進(jìn)行分析,學(xué)習(xí)如何構(gòu)建一個(gè)簡單的react應(yīng)用。
組件結(jié)構(gòu)
React踐行了 Web Components的理念,依照組件化的開發(fā)方式,我們來分析這個(gè)應(yīng)用的組件結(jié)構(gòu)(如圖所示):
即是:
-- CommentBox -- CommentList -- Comment -- CommentForm
組件之間的關(guān)系圖為:
組件Comment
如上述的結(jié)構(gòu)圖,我們從最底層開始編寫組件 Comment,這個(gè)組件需要做兩件事情
-
接收上層組件 CommentList傳遞的數(shù)據(jù),動(dòng)態(tài)渲染虛擬DOM節(jié)點(diǎn),則從 props中讀取數(shù)據(jù)
//評(píng)論人{(lán)this.props.author}//評(píng)論的內(nèi)容{this.props.children}
-
由于評(píng)論是支持MarkDown語法的,因此需要使用第三放庫 marked對(duì)用戶輸入的內(nèi)容進(jìn)行處理。
var rawMarkup = marked(this.props.children.toString(), {sanitize: true});
-
此外,輸出的內(nèi)容要解析為HTML,而在默認(rèn)情況下,基于預(yù)防XSS攻擊的考慮,React對(duì)輸出的內(nèi)容是不解析為HTML的。此時(shí),需要利用到特殊的屬性 dangerouslySetInnerHTML,要將內(nèi)容放到一個(gè)對(duì)象的 _html屬性中,然后將這個(gè)對(duì)象賦值給 dangerouslySetInnerHTML屬性
var html = {_html:"輸出的html內(nèi)容"};<span dangerouslySetInnerHTML={html} />
var Comment = React.createClass({ rawMarkup : function() { var rawMarkup = marked(this.props.children.toString(),{sanitize:true}); return {_html : rawMarkup}; //React的規(guī)則,會(huì)讀取這個(gè)對(duì)象的_html內(nèi)容, }, render : function() { return ( <div className="comment"> <h2 className="commentAuthor"> {this.props.author} </h2> <span dangerouslySetInnerHTML={this.rawMarkup()} /> </div> ); }});
組件CommentList
組件 CommentList需要做的就是接收上一層組件 CommentBox傳遞過來的數(shù)據(jù),然后根據(jù)數(shù)據(jù)生成多個(gè)子組件 Comment
var CommentList = React.createClass({ render : function() { var commentNodes = this.props.data.map(function(comment){ return ( <Comment author={comment.author} key={comment.id}> {comment.text} </Comment> ); }); return ( <div className="commentList"> {commentNodes} </div> ); }})
在生成子組件 Comment時(shí),將每個(gè)子組件的key屬性設(shè)置為 comment.id,這是因?yàn)?key是一個(gè)可選的唯一標(biāo)識(shí)符,通過它可以給組件設(shè)置一個(gè)獨(dú)一無二的鍵,并確保它在一個(gè)渲染周期中保持一致,使得React能夠更加智能地決定應(yīng)該重用一個(gè)組件,還是銷毀并重新創(chuàng)建一個(gè)組件,進(jìn)而提升渲染性能。
組件CommentForm
組件 CommentForm需要做的就是兩件事情
-
管理自身的狀態(tài) this.state(即表單中輸入的評(píng)論人和評(píng)論內(nèi)容)
-
當(dāng)表單輸入發(fā)生變化時(shí)
-
當(dāng)表單提交時(shí)
-
-
當(dāng)submit事件觸發(fā)時(shí),調(diào)用上一層組件 CommentBox的事件處理函數(shù),改變組件 CommentBox的狀態(tài)。
var CommentForm = React.createClass({ getInitialState : function() { //設(shè)置初始狀態(tài), return {author:'',text:''}; }, handleAuthorChange : function(e) { this.setState({ author : e.target.value }); }, handleTextChange : function(e) { this.setState({ text : e.target.value }); }, handleSubmit : function(e) { e.preventDefault(); var author = this.state.author.trim(); var text = this.state.text.trim(); if(!text || !author){ //為空驗(yàn)證 return; } //觸發(fā)評(píng)論提交事件,改變父組件的狀態(tài) this.props.onCommentSubmit({author:author,text:text}); //改變自身的狀態(tài) this.setState({author:'',text:''}); }});
在這里有一個(gè)值得注意的點(diǎn),那就是抽象的自定義事件 commentSubmit和真實(shí)的事件 submit之間的聯(lián)系,這是一個(gè)相當(dāng)實(shí)用的技巧,在接下來的章節(jié)可以看到是如何實(shí)現(xiàn)的。
組件CommentBox
作為整個(gè)應(yīng)用的頂層組件, CommentBox需要做的事情有:
-
從服務(wù)器端請(qǐng)求已有的評(píng)論數(shù)據(jù)
-
將新的評(píng)論數(shù)據(jù)上傳到服務(wù)器
-
管理自身的狀態(tài),根據(jù)狀態(tài)對(duì)視圖進(jìn)行渲染(狀態(tài)改變的示意圖如下)
var CommentBox = React.createClass({ getInitialState : function(){ return {data : []}; }, loadCommentsFromServer : function() { //使用了jQuery的Ajax $.ajax({ url : this.props.url, dataType : 'json', cache : false, success : function(data) { this.setState({data:data}); }.bind(this), error : function(xhr,status,err){ console.err(this.props.url,status,err.toString()); }.bind(this) }); }, componentDidMount : function() { /* 這個(gè)方法屬于React組件生命周期方法,在render方法成功調(diào)用并且真實(shí)的DOM 已經(jīng)渲染之后,調(diào)用此方法,這個(gè)方法發(fā)送json數(shù)據(jù)請(qǐng)求,并且設(shè)置一個(gè)定時(shí)器 ,每隔一段時(shí)間就向服務(wù)器請(qǐng)求數(shù)據(jù) */ this.loadCommentsFromServer(); setInterval(this.loadCommentsFromServer,this.props.pollInterval); }, handleCommentSubmit : function(comment) { /* 這個(gè)方法也是比較有意思: 1. 自定義了一個(gè)commentSubmit事件,并且此方法作為該事件的處理函數(shù)。 2. 此方法是在子組件CommentForm的submit事件處理函數(shù)中調(diào)用 */ var comments = this.state.data; comment.id = Date.now(); var newComments = comments.concat([comment]); //改變自身狀態(tài) this.setState({data:newComments}); $.ajax({ url : this.props.url, dataType: 'json', type : 'POST', data : comment, success : function(data) { this.setState({data:data}); }.bind(this), error : function(xhr,status,err) { //還原數(shù)據(jù) this.setState({data:comments}); console.err(this.props.url,status,err.toString()); }.bind(this) }); }, render : function() { return ( <div className="commentBox"> <h1>Comments</h1> <CommentList data={this.state.data} /> <CommentForm onCommentSubmit={this.handleCommentSubmit} /> </div> ); }});
最后,只需將組件 CommentBox掛載到真實(shí)的DOM節(jié)點(diǎn)上,就可以看到效果了
ReactDOM.render( <CommentBox url="/api/comments" pollInterval={2000} />, document.getElementById('content'));

Hei?e KI -Werkzeuge

Undress AI Tool
Ausziehbilder kostenlos

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem v?llig kostenlosen KI-Gesichtstausch-Tool aus!

Hei?er Artikel

Hei?e Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Metadaten in HTMLhead sind entscheidend für das Verhalten von SEO-, Social Sharing und Browser. 1. Setzen Sie den Seitentitel und die Beschreibung, verwenden Sie es und halten Sie es pr?zise und einzigartig. 2. Fügen Sie OpenGraph- und Twitter -Karteninformationen hinzu, um die Auswirkungen auf die soziale Freigabe zu optimieren, auf die Bildgr??e zu achten und Debugging -Tools zum Testen zu verwenden. 3. Definieren Sie die Einstellungen für den Zeichensatz und die Ansichtsfenster, um sicherzustellen, dass die Unterstützung mehrsprachiger Unterstützung an das mobile Terminal angepasst wird. 4. Optionale Tags wie das Urheberrecht des Autors, die Kontrolle der Roboter und die kanonische Verhindern doppelter Inhalte sollten auch vernünftig konfiguriert werden.

Tolearnhtmlin2025, ChooseatutororyThatbalancesHands-On-Practionwithmoderit und IntegrateCsSandjavaScriptbasics.1.PrioritizeHands-OnLearningWithStep-by-Stepprojects-?hnlich

Wie mache ich HTML -Mail -Vorlagen mit guter Kompatibilit?t? Zun?chst müssen Sie eine Struktur mit Tabellen erstellen, um die Verwendung von Div -Flex- oder Netzlayout zu vermeiden. Zweitens müssen alle Stile eingefügt werden und k?nnen sich nicht auf externe CSS verlassen. Dann sollte das Bild mit ALT -Beschreibung hinzugefügt werden und eine ?ffentliche URL verwenden, und die Schaltfl?chen sollten mit einer Tabelle oder TD mit Hintergrundfarbe simuliert werden. Schlie?lich müssen Sie die Details zu mehreren Clients testen und anpassen.

Wenn es keinen Backend-Server gibt, kann die Einreichung von HTML-Formular weiterhin über Front-End-Technologie oder Drittanbieterdienste verarbeitet werden. Zu den spezifischen Methoden geh?ren: 1. JavaScript verwenden, um die Einreichungen von Formulareingaben abzufangen, um die Eingabeüberprüfung und das Benutzerfeedback zu erhalten. Die Daten werden jedoch nicht bestehen. 2. Verwenden Sie serverlose Formulardienste von Drittanbietern wie F?rse, um Daten zu sammeln und E-Mail-Benachrichtigungs- und Umleitungsfunktionen bereitzustellen. 3.. Verwenden Sie LocalStorage, um tempor?re Clientdaten zu speichern, die zum Speichern von Benutzerpr?ferenzen oder zum Verwalten von Anwendungsstatus einseitig geeignet sind, jedoch nicht für die langfristige Speicherung vertraulicher Informationen geeignet sind.

Klasse, ID, Stil, Daten und Titel sind die am h?ufigsten verwendeten globalen Attribute in HTML. Die Klasse wird verwendet, um einen oder mehrere Klassennamen anzugeben, um die Stileinstellung und JavaScript -Vorg?nge zu erleichtern. ID bietet eindeutige Kennungen für Elemente, die für Anker -Sprünge und JavaScript -Kontrolle geeignet sind. Durch den Stil k?nnen Inline-Stile hinzugefügt werden, geeignet für ein vorübergehendes Debuggen, aber nicht für die Verwendung von gro?em Ma?stab empfohlen. Data-Properties werden verwendet, um benutzerdefinierte Daten zu speichern, was für die Interaktion mit Front-End- und Back-End-Interaktion geeignet ist. Der Titel wird verwendet, um Mausover -Eingaben hinzuzufügen, aber sein Stil und sein Verhalten werden durch den Browser begrenzt. Eine angemessene Auswahl dieser Attribute kann die Entwicklungseffizienz und die Benutzererfahrung verbessern.

Native Lazy Loading ist eine integrierte Browserfunktion, die das faule Laden von Bildern durch Hinzufügen von Loading = "Lazy" zum Tag hinzufügen kann. 1. Es erfordert keine Bibliotheken von JavaScript oder Drittanbietern und wird direkt in HTML verwendet. 2. Es ist für Bilder geeignet, die nicht auf dem ersten Bildschirm unterhalb der Seite, die Scrolling-Add-Ons und gro?e Bildressourcen angezeigt werden. 3. Es ist nicht für Bilder mit dem ersten Bildschirm oder Display geeignet: keine; 4. Bei der Verwendung sollte ein geeigneter Platzhalter festgelegt werden, um Layout -Jitter zu vermeiden. 5. Es sollte das Laden von Responsive Bild in Kombination mit SRCSet- und Gr??enattributen optimieren. 6. Kompatibilit?tsprobleme müssen berücksichtigt werden. Einige alte Browser unterstützen es nicht. Sie k?nnen durch Merkmalserkennung verwendet und mit JavaScript -L?sungen kombiniert werden.

Um einer Webseite einen Videohintergrund hinzuzufügen, besteht der Schlüssel darin, HTML -Tags korrekt zu verwenden und relevante Attribute zu optimieren. 1. Verwenden Sie Tags als Hintergrund und verwenden Sie die CSS -Positionierung, um die Seite oder den lokalen Bereich zu füllen. 2. Das Videoformat wird bevorzugt. 3. Fügen Sie ged?mpfte und PlaySInline -Attribute hinzu, um eine automatische Wiedergabe auf der mobilen Seite zu gew?hrleisten. 4. Steuern Sie die Videogr??e, um die Ladegeschwindigkeit zu optimieren, und es wird empfohlen, sie bei zehn MB zu halten. 5. Schleifen hinzufügen, um eine nahtlose Schleifenwiedergabe zu erreichen. 6. Es kann flexibel auf Vollbild- oder Lokalbl?cke angewendet werden, und unterschiedliche Effekte werden durch Anpassen der Beh?ltergr??e und Positionierungsmethode erzielt. Die obigen Schritte k?nnen einen stabilen und sch?nen Videohintergrund erreichen.

Um Iframes reagieren zu lassen, besteht der Kern darin, CSS zu verwenden, um das Seitenverh?ltnis zu steuern und ihn mit dem Verpackungsbeh?lter zu kombinieren, um eine Anpassung zu erreichen. 1. Verwenden Sie Polstertechniken, um Containerboxen mit festen Proportionen zu erstellen. H?ufige Verh?ltnisse wie 16: 9 entsprechen Padding-Top56,25%, 4: 3 entsprechen 75%und 1: 1 entsprechen 100%; 2. Stellen Sie die Iframe-Breite auf 100% ein und verwenden Sie die absolute Positionierung, um den Container zu füllen, oder verwenden Sie das Aspektverh?ltnisattribut, um den Anteil beizubehalten. 3. Steuern Sie bei der Verarbeitung von Drittanbietern eingebetteter Inhalte, steuern Sie das Verh?ltnis über Containerverpackung und stellen Sie sicher, dass das zul?ssige Attribut für das zul?ssige Bildschirm hinzugefügt wird, um die Vollbildwiedergabe in mobilen Terminals zu unterstützen. Beherrschen Sie die Einstellungen für Container und Verh?ltnisse, um die Reaktionsf?higkeit des Iframe zu erkennen
