摘要:瀏覽器看效果效果顯示效果就是瞎比比我不聽瞎比比解析后的文本直接被顯示在頁面上,并沒有被瀏覽器解析,這是為了防止被攻擊而作的保護(hù)措施。
新搭建的個(gè)人博客,本文地址:React學(xué)習(xí)筆記2:React官方CommentBox實(shí)踐
所有的操作是繼續(xù)上一個(gè)學(xué)習(xí)筆記,參考的是React官方的CommentBox,不過不是100%按照其實(shí)現(xiàn)。
參考:https://facebook.github.io/re...
1、首先創(chuàng)建相關(guān)的文件
touch src/comment.js
2、修改webpack配置,一處是告訴webpack預(yù)處理的實(shí)體增加comment.js,另外一個(gè)是告訴webpack輸出的時(shí)候按照文件名字編譯輸出,而不是將所有js文件編譯到bundle.js,[name]實(shí)際上是entry數(shù)組中的key,通過修改key可以歸類目錄,例如"comment/index":./src/index.js,"comment/index":"./src/comment.js"會將編譯后的文件放到comment目錄下,通過這些配置可以更好的組織代碼結(jié)構(gòu)
entry:{ "index":"./src/index.js", "comment":"./src/comment.js" }, output: { path: path.resolve(__dirname, "build"), filename: "[name].js" },
3、修改"build/index.html"引入文件修改為comment.js,重新運(yùn)行webpack-dev-server,開始修改comment.js
4、分拆Comment組件,梳理出如下結(jié)構(gòu),在React中所有的東西都是以組件的形式存在
- CommentBox - CommentList - Comment - CommentForm
5、創(chuàng)建CommentBox組件,return()中的類html內(nèi)容,在react中叫做JSX語法,其本身符合XML語法,react在編譯后會轉(zhuǎn)化為相應(yīng)的js文件,官方介紹https://facebook.github.io/re...
之后可以去瀏覽器中看下效果
var CommentBox = React.createClass({ render:function(){ return (Hello world! I am a comment box.) } }); //渲染組件,注意修改index.html中div的id為content ReactDOM.render(,document.getElementById("content") );
6、創(chuàng)建CommentList、CommentForm組件
var CommentList = React.createClass({ render:function(){ return (Hello, I am a comment list!) } }); var CommentForm = React.createClass({ render:function(){ return (hi, I am a comment form.) } });
7、修改CommentBox代碼,引入CommentList、CommentForm組件。下面代碼中混合了HTML和組件代碼,JSX編譯器會自動將HTML代碼用React.createElement(tagName)去轉(zhuǎn)換。瀏覽器看下效果。
var CommentBox = React.createClass({ render:function(){ return () } });Comments
8、創(chuàng)建Comment組件,里面有{this.props.author}和{this.props.children}兩個(gè)變量,稱之為組件的屬性。修改CommentList組件,可以看到我們傳遞了author屬性。children是React預(yù)置屬性,指向組件內(nèi)嵌的內(nèi)容。返回瀏覽器查看修改變化。
var Comment = React.createClass({ render:function(){ return () } }) //修改CommentList組件,讓其載入Comment組件 var CommentList = React.createClass({ render:function(){ return ({this.props.author}
{this.props.children}) } });就是瞎比比 我不聽瞎比比
9、添加Markdown支持
//安裝依賴包 npm install marked --save //引入marked包 var marked = require("marked") //修改Comment組件,利用marked組件解析評論內(nèi)容,轉(zhuǎn)為富文本格式。使用toString()是為了明確傳送給marked的為字符串格式。瀏覽器看效果效果 var Comment = React.createClass({ render:function(){ return () } }){this.props.author}
{marked(this.props.children.toString())}
//顯示效果 Comments stone就是瞎比比
mpanda我不聽瞎比比
hi, I am a comment form.
10、解析后的文本直接被顯示在頁面上,并沒有被瀏覽器解析,這是react為了防止被XSS攻擊而作的保護(hù)措施。React提供了一個(gè)并不友好的特殊API保證能夠?qū)崿F(xiàn)在瀏覽器顯示原始HTML
var Comment = React.createClass({ rawMarkup:function(){ var rawMarkup = marked(this.props.children.toString(),{sanitize:true}) return {__html:rawMarkup} }, render:function(){ return () } }){this.props.author}
JSX中dangerouslySetInnerHTML屬性必須在接收到一個(gè)對象參數(shù),且對象參數(shù)中明確使用__html作為key時(shí),才會將其內(nèi)容作為原始HTML插入頁面中,而且不建議直接在
直接這樣完成書寫,目的就是明確提醒開發(fā)者,這里是有風(fēng)險(xiǎn)的,您是絕對的信任這段插入的內(nèi)容。再次查看瀏覽器效果。It works!var data = [ {"id":1,"author":"stone","text":"換一個(gè)位置瞎比比"}, {"id":2,"author":"mpanda","text":"不喜歡你瞎比比"}, ] //傳遞數(shù)據(jù)到CommentBox ReactDOM.render(,document.getElementById("content") ); //直接傳遞數(shù)據(jù)到CommentList var CommentBox = React.createClass({ render:function(){ return ( ) } }); //在CommentList重新完成組件的組裝,刷新瀏覽器看效果 var CommentList = React.createClass({ render:function(){ var commentNodes = this.props.data.map(function(comment){ return (Comments
{comment.text} ) }); return ({commentNodes}) } });
12、從組件封裝來說我們已經(jīng)封裝了一個(gè)很不錯(cuò)的組件,只需要傳遞相關(guān)json數(shù)據(jù)到CommentBox即可。不過所有的數(shù)據(jù)都是在組件創(chuàng)建的時(shí)候,利用不可變量參數(shù)props一次性傳遞給組件。state同樣為組件的私有變量,可以通過this.setState()來設(shè)置變量的值,每次設(shè)置變量的值,組件都會重新渲染一遍自己。利用state修改我們的程序,讓其動態(tài)渲染頁面。
//為了方便進(jìn)行ajax請求,引入jquery,當(dāng)然完全可以不引入 var $ = require("jquery") var CommentBox = React.createClass({ //getInitialState函數(shù)在組件的整個(gè)生命周期只會執(zhí)行一次,我們在里面初始化數(shù)據(jù) getInitialState:function(){ return {data:[]} }, //componentDidMount函數(shù)同樣是有React自動調(diào)用,時(shí)間是在組件第一渲染完畢后。當(dāng)然因?yàn)閐ata在初始化的時(shí)候數(shù)據(jù)為空,實(shí)際上這時(shí)候渲染的組件沒有內(nèi)容。 componentDidMount:function(){ $.ajax({ url:this.props.url, //因我本地server是php,且跨域,所以我們使用jsonp解決跨域問題,具體jsonp實(shí)現(xiàn),請自行g(shù)oogle dataType:"jsonp", cache:false, jsonp:"callback", jsonpCallback:"getComment", success:function(data){ //獲取到數(shù)據(jù)后,通過setState設(shè)置數(shù)據(jù),組件會自動再次渲染 this.setState({"data":data}) }.bind(this), error:function(xhr,status,err){ console.log(this.props.url,status,err.toString()) }.bind(this) }) }, render:function(){ return () } }); //將URL地址傳遞個(gè)組件 ReactDOM.render(Comments
,document.getElementById("content") );
13、我們在瀏覽器看效果的時(shí)候因?yàn)閿?shù)據(jù)請求都是在毫秒級別完成不方便看到重新渲染的效果,我們引入一個(gè)定時(shí)器。刷新瀏覽器,哈哈,2s后自動載入了評論數(shù)據(jù)。
var CommentBox = React.createClass({ getInitialState:function(){ return {data:[]} }, loadCommentsFromServer:function(){ $.ajax({ url:this.props.url, dataType:"jsonp", cache:false, jsonp:"callback", jsonpCallback:"getComment", success:function(data){ this.setState({"data":data}) }.bind(this), error:function(xhr,status,err){ console.log(this.props.url,status,err.toString()) }.bind(this) }) }, componentDidMount:function(){ setInterval(this.loadCommentsFromServer,2000) }, render:function(){ return () } });Comments
14、官方教程中評論提交分兩種完成。第一種完成了提交完成后,需要刷新,再次從服務(wù)器獲取評論數(shù)據(jù),第二種提交評論后直接把提交的數(shù)據(jù)附加到評論后面,利用setState重新渲染頁面。顯然第二種體驗(yàn)更好,直接實(shí)現(xiàn)第二種。
先做分析,在CommentForm組件中,如果完成數(shù)據(jù)的提交,那么需要重新設(shè)置CommentList中的數(shù)據(jù),但是CommentList的數(shù)據(jù)又是CommentBox傳遞過去的,那么提交數(shù)據(jù)的操作不如直接在CommentBox中完成,然后利用setState重新設(shè)置CommentList的數(shù)據(jù),CommentList完成自動刷新。
//之前獲取評論接口利用的是jsonp,但是提交評論必須post方法,所以jsonp無法完成,但是有不能通過跨域操作。webpack支持proxy(代理)模式,可以把一部分接口直接轉(zhuǎn)發(fā)到后端,修改webpack配置,請自行替換后端服務(wù)。 devServer:{ contentBase:"./build", proxy:{ "/api/*":{ target:"http://***.local.com:80", host:"***.local.com", secure: false, }, bypass: function(req, res, proxyOptions) { if (req.headers.accept.indexOf("html") !== -1) { console.log("Skipping proxy for browser request."); return "/index.html"; } }, } }
//注意傳遞的url,會自動轉(zhuǎn)發(fā)到http://***.local.com:80/api/comment ReactDOM.render(,document.getElementById("content") );
var CommentBox = React.createClass({ //增加評論提交方法,后臺服務(wù) handleSubmitComment:function(data){ $.ajax({ //請注意,后臺接口我把評論和獲取評論放到了一起,只是提交方式不一樣,一個(gè)是get,一個(gè)是post url:this.props.url, type:"POST", data:data, dataType:"json", cache:false, success:function(data){ //測試接口直接返回了我提交的內(nèi)容,所以可以直接附加數(shù)據(jù),讓CommentList自動刷新 this.setState({data:this.state.data.concat(data)}); }.bind(this), error:function(xhr,status,err){ console.log(this.props.url,status,err.toString()) }.bind(this) }) }, render:function(){ return () } }); var CommentForm = React.createClass({ getInitialState:function() { return {author:"",text:""} }, //完成數(shù)據(jù)的綁定,通過setState也能保證跟此數(shù)據(jù)相關(guān)的UI完成重新的渲染 handleAuthorChange:function(event){ this.setState({author:event.target.value}) }, handleTextChange:function(event){ this.setState({text:event.target.value}) }, handleSubmit:function(event){ //組織表單默認(rèn)的submit提交 event.preventDefault(); var author = this.state.author.trim() var text = this.state.text.trim() if(!text||!author) { return; } //調(diào)用CommentBox上的評論提交方法 this.props.onSubmitComment({author:author,text:text}); this.setState({author:"",text:""}) }, render:function(){ return (Comments
//將評論提交接口傳遞個(gè)CommentForm組件
到此整個(gè)示例聯(lián)系完成!之后要完成用es6語法重構(gòu)該項(xiàng)目。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/78554.html
摘要:新搭建的個(gè)人博客,本文地址學(xué)習(xí)筆記用重寫在一開始的時(shí)候配置中我們就加入了的支持,就是下面的配置,但之前的學(xué)習(xí)筆記都使用的完成,所以專門作一篇筆記,記錄使用完成創(chuàng)建相關(guān)文件修改,增加該入口文件修改,引入該文件做個(gè)簡單的測試,看下瀏覽器全部用來 新搭建的個(gè)人博客,本文地址:React學(xué)習(xí)筆記3:用es2015(ES6)重寫CommentBox在一開始的時(shí)候webpack配置中我們就加入了e...
摘要:例子全解析近些時(shí)間一直在關(guān)注,關(guān)于如何學(xué)習(xí)可以參照鏈接的文章自行制定計(jì)劃。千里之行,始于足下。此外,輸出的內(nèi)容要解析為,而在默認(rèn)情況下,基于預(yù)防攻擊的考慮,對輸出的內(nèi)容是不解析為的。 React-tutorial例子全解析 Talk is cheap,Show me the code 近些時(shí)間一直在關(guān)注React,關(guān)于如何學(xué)習(xí)React可以參照鏈接的文章自行制定計(jì)劃。千里之行,始于足下...
摘要:組件通信實(shí)現(xiàn)表單提交昨晚做了一個(gè)的例子,主要實(shí)現(xiàn)的是提交表單實(shí)現(xiàn)評論的功能,在做之前先簡單介紹一下。并稱為前端大框架,就目前來看,盡管發(fā)布了也在今年月份發(fā)布了,更不在話下,大家要是想學(xué)習(xí)的話可以去官網(wǎng)學(xué)習(xí)。 react組件通信實(shí)現(xiàn)表單提交 昨晚做了一個(gè)react的例子,主要實(shí)現(xiàn)的是提交表單實(shí)現(xiàn)評論的功能,在做之前先簡單介紹一下React。 showImg(https://segment...
摘要:作者滬江前端開發(fā)工程師本文原創(chuàng)翻譯,有不當(dāng)?shù)牡胤綒g迎指出。管理數(shù)據(jù),而提供服務(wù)器上的數(shù)據(jù),因此應(yīng)用于處理網(wǎng)絡(luò)請求。結(jié)論使用建立的應(yīng)用都是模塊化的會成為其中一個(gè)模塊,庫是另一個(gè)模塊。原文原創(chuàng)新書移動前端高效開發(fā)實(shí)戰(zhàn)已在亞馬遜京東當(dāng)當(dāng)開售。 作者:Oral (滬江Web前端開發(fā)工程師)本文原創(chuàng)翻譯,有不當(dāng)?shù)牡胤綒g迎指出。轉(zhuǎn)載請指明出處。 當(dāng)你問起有關(guān)AJAX與React時(shí),老司機(jī)們首先就會...
摘要:從服務(wù)端請求數(shù)據(jù)創(chuàng)建一個(gè)文件大胖分鐘前天氣不錯(cuò)啊騷胖分鐘前出去玩啊老胖分鐘前去哪玩啊從服務(wù)端請求數(shù)據(jù)為了頁面的數(shù)據(jù)和服務(wù)端的保持聯(lián)系,設(shè)置每隔五秒向服務(wù)端發(fā)生一次請求在幫頂一下事件提交表單。。。。 React表單 首先,我們需要搭建一個(gè)React環(huán)境,用來實(shí)現(xiàn)效果: 先安裝React,這里我用的并不是最新版本的,所以需要選擇一個(gè)版本: jspm install react@0.14.0...
閱讀 3864·2021-09-23 11:51
閱讀 3057·2021-09-22 15:59
閱讀 856·2021-09-09 11:37
閱讀 2063·2021-09-08 09:45
閱讀 1260·2019-08-30 15:54
閱讀 2056·2019-08-30 15:53
閱讀 485·2019-08-29 12:12
閱讀 3283·2019-08-29 11:15