摘要:最近在學習,不得不說第一次接觸組件化開發(fā)很神奇,當然也很不習慣。
最近在學習react.js,不得不說第一次接觸組件化開發(fā)很神奇,當然也很不習慣。
react的思想還是蠻獨特的,當然圍繞react的一系列自動化工具也是讓我感覺亞歷山大
今天總結一下react組件之間的通信,權當是自己的學習筆記:
reactJs中數(shù)據(jù)流向的的特點是:單項數(shù)據(jù)流
react組件之間的組合不知道為什么給我一種數(shù)據(jù)結構當中樹的感覺,數(shù)據(jù)就是從根節(jié)點(頂端或其他子樹的頂端)“流”下來,大概就是這個樣子:
比如這是一個組件樹,數(shù)據(jù)就可以從main組件流到jumbotron組件、queationList組件、form組件,類似的queation組件的數(shù)據(jù)也可以流到下邊的question組件里邊。
但是很遺憾,這個從上到下的數(shù)據(jù)流動,只能解決很少的問題,還有一部分的數(shù)據(jù)流動就是類似從jumbotron組件到form組件的這樣的兄弟組件的流動形式,或者隔著幾個層級的數(shù)據(jù)流動,再或者子組件發(fā)生了數(shù)據(jù)的變化,想通知父組件,數(shù)據(jù)流向從子組件到父組件流,這些問題才是大多數(shù)的開發(fā)者需要面臨的問題。
所以這篇筆記總結下基礎的組件通信:
最簡單的通信就是父子間的通信,比如上邊圖上的有個jsonObj從main流進了QueationList
參考代碼:
//這里模擬出幾條數(shù)據(jù) var jsonObj=[ {name:"A",question:"從小被人打怎么辦?",TextArea:"習慣就好了",applaud:35,disagree:1}, {name:"B",question:"長的太帥被人砍怎么辦?",TextArea:"食屎啦你",applaud:35,disagree:10}, {name:"C",question:"因為太胖被人摸怎么辦?",TextArea:"享受就好了",applaud:35,disagree:45}, {name:"D",question:"被老師打不開心",TextArea:"用錢打臉",applaud:35,disagree:6}, {name:"E",question:"不愛洗澡怎么辦?",TextArea:"打一頓就好了",applaud:35,disagree:9} ] var QuestionList=React.createClass({ prepareToRender:function(list){ var array=[]; for(var i=0;i); } return array; }, render:function(){ var array=this.prepareToRender(this.props.jsonObj); return {array}; } }); var Main = React.createClass({ //開始渲染 render: function () { return (); } }); var Main = React.createClass({ getInitialState: function () { return { openTheWindow: true }; }, //開始給子組件一個回調(diào)函數(shù),用來做子組件給父組件通信使用 buttonResponse:function(windowSatus){ this.setState({openTheWindow : windowSatus}); }, //開始渲染 render: function () { console.log(jsonObj) return (); } }); ReactDOM.render( , document.getElementById("container") );代碼寫的不怎么規(guī)范,但是數(shù)據(jù)的傳遞就是這樣的:
數(shù)據(jù)從子組件到父組件
這樣就可以把父組件的數(shù)據(jù)帶到子組件里邊理論上來說數(shù)據(jù)只能是單向的,所以不借助插件數(shù)據(jù)還真不好從子組件到父組件,一種很簡單的手段是回調(diào)函數(shù):
在父組件當中寫個回調(diào)函數(shù),然后傳遞到子組件,什么時候子組件數(shù)據(jù)變化了,直接調(diào)這個回調(diào)函數(shù)就可以了。比如現(xiàn)在的jumbotron的按鈕被點擊了,我們想把被點擊這個事件發(fā)給它的父組件也就是main組件,那么我們可以這個做:
var Jumbotron = React.createClass({ handleClick: function () { this.props.openTheWindow(false); }, render: function () { return (); } }); ReactDOM.render( , document.getElementById("container") );
子組件通知父組件狀態(tài)變化就是這樣,就好像是兒子找爸爸要零花錢,零花錢以及給不給都是爸爸說了算的。
兄弟組件之間的通信這個其實應該是一個動態(tài)應用中最常見的通信,比如jubotron組件的點擊按鈕,form組件的表單出現(xiàn):
這就是一個典型的兄弟之間的通信:
兄弟節(jié)點其實可以就是子父通信&&父子通信的疊加
首先按鈕被點擊,子組件通知負組件這個事件,然后父組件把這個消息帶給另一個子組件
下邊是個點擊按鈕顯示表單的例子:
/** * Created by niuGuangzhe on 2016/9/10. */ var Jumbotron = React.createClass({ handleClick: function () { this.props.openTheWindow(false); }, render: function () { return (); } }); var Form = React.createClass({ getInitialState:function(){ return { inputTitle:"請輸入標題", mainBody:"在此輸入正文" }; }, //點擊按鈕觸發(fā)事件:清除所有已經(jīng)輸入的文字 cleanText:function(){ this.setState({ inputTitle:"", mainBody:""}); }, //表單監(jiān)視事件 handleChange(name,e) { var newState = {}; console.log(name); newState[name] =event.target.value; this.setState(newState); }, render: function () { return () } }) var Main = React.createClass({ getInitialState: function () { return { openTheWindow: true }; }, //開始給子組件一個回調(diào)函數(shù),用來做子組件給父組件通信使用 buttonResponse:function(windowSatus){ this.setState({openTheWindow : windowSatus}); }, //開始渲染 render: function () { console.log(jsonObj) return (); } }); ReactDOM.render( , document.getElementById("container") );
就是這樣,
其實上邊的代碼是我從之前的沒事干做的一個單頁面上拿過來改的,為了不出現(xiàn)代碼無法運行的問題,下邊貼出所有代碼:
/** * Created by niuGuangzhe on 2016/9/10. */ var Jumbotron = React.createClass({ handleClick: function () { this.props.openTheWindow(false); }, render: function () { return (); } }); var Form = React.createClass({ getInitialState:function(){ return { inputTitle:"請輸入標題", mainBody:"在此輸入正文" }; }, //點擊按鈕觸發(fā)事件:清除所有已經(jīng)輸入的文字 cleanText:function(){ this.setState({ inputTitle:"", mainBody:""}); }, //表單監(jiān)視事件 handleChange(name,e) { var newState = {}; console.log(name); newState[name] =event.target.value; this.setState(newState); }, render: function () { return (React+bootstrap簡單實例
上手體驗:第一次嘗試組件化開發(fā)
) }, //監(jiān)測從新渲染 componentDidUpdate:function(){ console.log("子組件重新渲染;"); } }) var Question = React.createClass({ getInitialState : function(){ return { click:true, disClick:true }; }, numberHandle:function(){ if(this.state.click===true){ //奇數(shù)次點擊,開始增加數(shù)據(jù) this.props.obj.applaud+=1; this.setState({click:false}); }else{ //偶數(shù)次點擊,減去數(shù)據(jù) this.props.obj.applaud-=1; this.setState({click:true}); } }, decreateHandle:function(){ if(this.state.disClick===true){ //奇數(shù)次點擊,開始增加數(shù)據(jù) this.props.obj.applaud-=1; this.setState({disClick:false}); }else{ //偶數(shù)次點擊,減去數(shù)據(jù) this.props.obj.applaud+=1; this.setState({disClick:true}); } }, render: function () { return (); } }); var QuestionList=React.createClass({ prepareToRender:function(list){ var array=[]; for(var i=0;i{this.props.obj.question}
{this.props.obj.TextArea}
); } return array; }, render:function(){ var array=this.prepareToRender(this.props.jsonObj); return {array}; } }); //這里模擬出幾條數(shù)據(jù) var jsonObj=[ {name:"A",question:"從小被人打怎么辦?",TextArea:"習慣就好了",applaud:35,disagree:1}, {name:"B",question:"長的太帥被人砍怎么辦?",TextArea:"食屎啦你",applaud:35,disagree:10}, {name:"C",question:"因為太胖被人摸奶怎么辦?",TextArea:"享受就好了",applaud:35,disagree:45}, {name:"D",question:"被老師打不開心",TextArea:"用錢打ta臉",applaud:35,disagree:6}, {name:"E",question:"不愛洗澡怎么辦?",TextArea:"打一頓就好了",applaud:35,disagree:9} ] var Main = React.createClass({ getInitialState: function () { return { openTheWindow: true }; }, //開始給子組件一個回調(diào)函數(shù),用來做子組件給父組件通信使用 buttonResponse:function(windowSatus){ this.setState({openTheWindow : windowSatus}); }, //開始渲染 render: function () { console.log(jsonObj) return (); }, // 執(zhí)行hook函數(shù):重新渲染完成的時候調(diào)這個函數(shù) componentDidUpdate:function(){ console.log(this.state.openTheWindow); } }); ReactDOM.render( , document.getElementById("container") );
最后就是一個很重要的問題:就是多層級的據(jù)數(shù)據(jù)傳輸,如果還用這個方式來傳播的話,效率貌似是個大問題,解決辦法看大家的做法目前暫時還是flux之類的其他框架,等研究出來多帶帶寫篇文章吧
文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/91001.html
摘要:上圖是二月份前端框架排名,位居第一,排名第三。我們認為前端模板和組件代碼是緊密相連的。直到最近看了文檔,才發(fā)現(xiàn)另有蹊蹺。 歡迎大家關注騰訊云技術社區(qū)-segmentfault官方主頁,我們將持續(xù)在博客園為大家推薦技術精品文章哦~ 紀俊,從事Web前端開發(fā)工作,2016年加入騰訊OMG廣告平臺產(chǎn)品部,喜歡研究前端技術框架。 這里要討論的話題,不是前端框架哪家強,因為在 Vue 官網(wǎng)就已經(jīng)...
摘要:目前只是體會到組件之間傳遞的值的初始來源一般都是值,可能是實踐不夠的原因。。。此時,可以建一個組件內(nèi)部封裝一個構造函數(shù),內(nèi)部封裝三個方法。 PS:開頭的一段廢話 ???????想起一個月前還不知道reactjs該如何下手的而今天有點小體會,還是有點小欣慰,不過回望一些走過的坑和開始時的滿頭漿糊覺得還是有點恐怖的。今天分享一點實踐中的小心得給新手朋友們。 reactjs的es6語法形式 ...
摘要:回到,事務是中廣泛采用的一種模式。先不論包裝行為,事務允許應用重置事務流,阻塞一個已經(jīng)在執(zhí)行過程中的同步方法等等。我們調(diào)用掛載方法,并把它包裝進這個事務中,這是為了在掛載動作后,會檢查已掛載組件影響到了哪些內(nèi)容,并更新這些內(nèi)容。 接上文, React流程圖:https://bogdan-lyashenko.gith... 事務 到現(xiàn)在這一步,組件實例已經(jīng)通過某種方式加入到React的生...
摘要:首次發(fā)表在個人博客需要組件之進行通信的幾種情況父組件向子組件通信子組件向父組件通信跨級組件通信沒有嵌套關系組件之間的通信父組件向子組件通信數(shù)據(jù)流動是單向的父組件向子組件通信也是最常見的父組件通過向子組件傳遞需要的信息子組件向父組件通信利用 showImg(https://segmentfault.com/img/remote/1460000012361466?w=1240&h=667)...
摘要:組件關注的只應該是狀態(tài),不同的狀態(tài)呈現(xiàn)不同的表現(xiàn)形式。組件一切都是組件倡導開發(fā)者將切分成一個個組件從而達到松耦合及重用的目的。只不過的命名是進入狀態(tài)之前跟進入狀態(tài)之后。 前端已不止于前端-ReactJs初體驗 原文寫于 2015-04-15 https://github.com/kuitos/kuitos.github.io/issues/21 要說2015年前端屆最備受矚目的技術是啥...
閱讀 2277·2021-10-13 09:39
閱讀 3420·2021-09-30 09:52
閱讀 809·2021-09-26 09:55
閱讀 2780·2019-08-30 13:19
閱讀 1897·2019-08-26 10:42
閱讀 3193·2019-08-26 10:17
閱讀 550·2019-08-23 14:52
閱讀 3642·2019-08-23 14:39