成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

ReactJS組件之間通信

codecook / 2100人閱讀

摘要:最近在學(xué)習(xí),不得不說(shuō)第一次接觸組件化開發(fā)很神奇,當(dāng)然也很不習(xí)慣。

最近在學(xué)習(xí)react.js,不得不說(shuō)第一次接觸組件化開發(fā)很神奇,當(dāng)然也很不習(xí)慣。
react的思想還是蠻獨(dú)特的,當(dāng)然圍繞react的一系列自動(dòng)化工具也是讓我感覺(jué)亞歷山大
今天總結(jié)一下react組件之間的通信,權(quán)當(dāng)是自己的學(xué)習(xí)筆記:

reactJs中數(shù)據(jù)流向的的特點(diǎn)是:?jiǎn)雾?xiàng)數(shù)據(jù)流

react組件之間的組合不知道為什么給我一種數(shù)據(jù)結(jié)構(gòu)當(dāng)中樹的感覺(jué),數(shù)據(jù)就是從根節(jié)點(diǎn)(頂端或其他子樹的頂端)“流”下來(lái),大概就是這個(gè)樣子:

比如這是一個(gè)組件樹,數(shù)據(jù)就可以從main組件流到j(luò)umbotron組件、queationList組件、form組件,類似的queation組件的數(shù)據(jù)也可以流到下邊的question組件里邊。

但是很遺憾,這個(gè)從上到下的數(shù)據(jù)流動(dòng),只能解決很少的問(wèn)題,還有一部分的數(shù)據(jù)流動(dòng)就是類似從jumbotron組件到form組件的這樣的兄弟組件的流動(dòng)形式,或者隔著幾個(gè)層級(jí)的數(shù)據(jù)流動(dòng),再或者子組件發(fā)生了數(shù)據(jù)的變化,想通知父組件,數(shù)據(jù)流向從子組件到父組件流,這些問(wèn)題才是大多數(shù)的開發(fā)者需要面臨的問(wèn)題。
所以這篇筆記總結(jié)下基礎(chǔ)的組件通信:

數(shù)據(jù)從父組件到子組件

最簡(jiǎn)單的通信就是父子間的通信,比如上邊圖上的有個(gè)jsonObj從main流進(jìn)了QueationList
參考代碼:

//這里模擬出幾條數(shù)據(jù)
var jsonObj=[
    {name:"A",question:"從小被人打怎么辦?",TextArea:"習(xí)慣就好了",applaud:35,disagree:1},
    {name:"B",question:"長(zhǎng)的太帥被人砍怎么辦?",TextArea:"食屎啦你",applaud:35,disagree:10},
    {name:"C",question:"因?yàn)樘直蝗嗣趺崔k?",TextArea:"享受就好了",applaud:35,disagree:45},
    {name:"D",question:"被老師打不開心",TextArea:"用錢打臉",applaud:35,disagree:6},
    {name:"E",question:"不愛(ài)洗澡怎么辦?",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 (
); } }); ReactDOM.render(
, document.getElementById("container") );

代碼寫的不怎么規(guī)范,但是數(shù)據(jù)的傳遞就是這樣的:

這樣就可以把父組件的數(shù)據(jù)帶到子組件里邊

數(shù)據(jù)從子組件到父組件

理論上來(lái)說(shuō)數(shù)據(jù)只能是單向的,所以不借助插件數(shù)據(jù)還真不好從子組件到父組件,一種很簡(jiǎn)單的手段是回調(diào)函數(shù):
在父組件當(dāng)中寫個(gè)回調(diào)函數(shù),然后傳遞到子組件,什么時(shí)候子組件數(shù)據(jù)變化了,直接調(diào)這個(gè)回調(diào)函數(shù)就可以了。

比如現(xiàn)在的jumbotron的按鈕被點(diǎn)擊了,我們想把被點(diǎn)擊這個(gè)事件發(fā)給它的父組件也就是main組件,那么我們可以這個(gè)做:

var Jumbotron = React.createClass({
    handleClick: function () {
        this.props.openTheWindow(false);
    },
    render: function () {
        return (
                
); } }); var Main = React.createClass({ getInitialState: function () { return { openTheWindow: true }; }, //開始給子組件一個(gè)回調(diào)函數(shù),用來(lái)做子組件給父組件通信使用 buttonResponse:function(windowSatus){ this.setState({openTheWindow : windowSatus}); }, //開始渲染 render: function () { console.log(jsonObj) return (
); } }); ReactDOM.render(
, document.getElementById("container") );

子組件通知父組件狀態(tài)變化就是這樣,就好像是兒子找爸爸要零花錢,零花錢以及給不給都是爸爸說(shuō)了算的。

兄弟組件之間的通信

這個(gè)其實(shí)應(yīng)該是一個(gè)動(dòng)態(tài)應(yīng)用中最常見(jiàn)的通信,比如jubotron組件的點(diǎn)擊按鈕,form組件的表單出現(xiàn):
這就是一個(gè)典型的兄弟之間的通信:

兄弟節(jié)點(diǎn)其實(shí)可以就是子父通信&&父子通信的疊加
首先按鈕被點(diǎn)擊,子組件通知負(fù)組件這個(gè)事件,然后父組件把這個(gè)消息帶給另一個(gè)子組件
下邊是個(gè)點(diǎ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:"請(qǐng)輸入標(biāo)題", mainBody:"在此輸入正文" }; }, //點(diǎn)擊按鈕觸發(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 }; }, //開始給子組件一個(gè)回調(diào)函數(shù),用來(lái)做子組件給父組件通信使用 buttonResponse:function(windowSatus){ this.setState({openTheWindow : windowSatus}); }, //開始渲染 render: function () { console.log(jsonObj) return (
); } }); ReactDOM.render(
, document.getElementById("container") );

就是這樣,

其實(shí)上邊的代碼是我從之前的沒(méi)事干做的一個(gè)單頁(yè)面上拿過(guò)來(lái)改的,為了不出現(xiàn)代碼無(wú)法運(yùn)行的問(wèn)題,下邊貼出所有代碼:

/**
 * Created by niuGuangzhe on 2016/9/10.
 */
var Jumbotron = React.createClass({
    handleClick: function () {
        this.props.openTheWindow(false);
    },
    render: function () {
        return (
            

React+bootstrap簡(jiǎn)單實(shí)例

上手體驗(yàn):第一次嘗試組件化開發(fā)

); } }); var Form = React.createClass({ getInitialState:function(){ return { inputTitle:"請(qǐng)輸入標(biāo)題", mainBody:"在此輸入正文" }; }, //點(diǎn)擊按鈕觸發(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 (
) }, //監(jiān)測(cè)從新渲染 componentDidUpdate:function(){ console.log("子組件重新渲染;"); } }) var Question = React.createClass({ getInitialState : function(){ return { click:true, disClick:true }; }, numberHandle:function(){ if(this.state.click===true){ //奇數(shù)次點(diǎn)擊,開始增加數(shù)據(jù) this.props.obj.applaud+=1; this.setState({click:false}); }else{ //偶數(shù)次點(diǎn)擊,減去數(shù)據(jù) this.props.obj.applaud-=1; this.setState({click:true}); } }, decreateHandle:function(){ if(this.state.disClick===true){ //奇數(shù)次點(diǎn)擊,開始增加數(shù)據(jù) this.props.obj.applaud-=1; this.setState({disClick:false}); }else{ //偶數(shù)次點(diǎn)擊,減去數(shù)據(jù) this.props.obj.applaud+=1; this.setState({disClick:true}); } }, render: function () { return (

{this.props.obj.question}

{this.props.obj.TextArea}

); } }); 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}
; } }); //這里模擬出幾條數(shù)據(jù) var jsonObj=[ {name:"A",question:"從小被人打怎么辦?",TextArea:"習(xí)慣就好了",applaud:35,disagree:1}, {name:"B",question:"長(zhǎng)的太帥被人砍怎么辦?",TextArea:"食屎啦你",applaud:35,disagree:10}, {name:"C",question:"因?yàn)樘直蝗嗣淘趺崔k?",TextArea:"享受就好了",applaud:35,disagree:45}, {name:"D",question:"被老師打不開心",TextArea:"用錢打ta臉",applaud:35,disagree:6}, {name:"E",question:"不愛(ài)洗澡怎么辦?",TextArea:"打一頓就好了",applaud:35,disagree:9} ] var Main = React.createClass({ getInitialState: function () { return { openTheWindow: true }; }, //開始給子組件一個(gè)回調(diào)函數(shù),用來(lái)做子組件給父組件通信使用 buttonResponse:function(windowSatus){ this.setState({openTheWindow : windowSatus}); }, //開始渲染 render: function () { console.log(jsonObj) return (


); }, // 執(zhí)行hook函數(shù):重新渲染完成的時(shí)候調(diào)這個(gè)函數(shù) componentDidUpdate:function(){ console.log(this.state.openTheWindow); } }); ReactDOM.render(
, document.getElementById("container") );

最后就是一個(gè)很重要的問(wèn)題:就是多層級(jí)的據(jù)數(shù)據(jù)傳輸,如果還用這個(gè)方式來(lái)傳播的話,效率貌似是個(gè)大問(wèn)題,解決辦法看大家的做法目前暫時(shí)還是flux之類的其他框架,等研究出來(lái)多帶帶寫篇文章吧

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/91001.html

相關(guān)文章

  • Reactjs vs. Vuejs

    摘要:上圖是二月份前端框架排名,位居第一,排名第三。我們認(rèn)為前端模板和組件代碼是緊密相連的。直到最近看了文檔,才發(fā)現(xiàn)另有蹊蹺。 歡迎大家關(guān)注騰訊云技術(shù)社區(qū)-segmentfault官方主頁(yè),我們將持續(xù)在博客園為大家推薦技術(shù)精品文章哦~ 紀(jì)俊,從事Web前端開發(fā)工作,2016年加入騰訊OMG廣告平臺(tái)產(chǎn)品部,喜歡研究前端技術(shù)框架。 這里要討論的話題,不是前端框架哪家強(qiáng),因?yàn)樵?Vue 官網(wǎng)就已經(jīng)...

    AaronYuan 評(píng)論0 收藏0
  • es6語(yǔ)法的reactjs的state狀態(tài)和組件間props傳遞的實(shí)踐

    摘要:目前只是體會(huì)到組件之間傳遞的值的初始來(lái)源一般都是值,可能是實(shí)踐不夠的原因。。。此時(shí),可以建一個(gè)組件內(nèi)部封裝一個(gè)構(gòu)造函數(shù),內(nèi)部封裝三個(gè)方法。 PS:開頭的一段廢話 ???????想起一個(gè)月前還不知道reactjs該如何下手的而今天有點(diǎn)小體會(huì),還是有點(diǎn)小欣慰,不過(guò)回望一些走過(guò)的坑和開始時(shí)的滿頭漿糊覺(jué)得還是有點(diǎn)恐怖的。今天分享一點(diǎn)實(shí)踐中的小心得給新手朋友們。 reactjs的es6語(yǔ)法形式 ...

    malakashi 評(píng)論0 收藏0
  • 【Under-the-hood-ReactJS-Part1】React源碼解讀

    摘要:回到,事務(wù)是中廣泛采用的一種模式。先不論包裝行為,事務(wù)允許應(yīng)用重置事務(wù)流,阻塞一個(gè)已經(jīng)在執(zhí)行過(guò)程中的同步方法等等。我們調(diào)用掛載方法,并把它包裝進(jìn)這個(gè)事務(wù)中,這是為了在掛載動(dòng)作后,會(huì)檢查已掛載組件影響到了哪些內(nèi)容,并更新這些內(nèi)容。 接上文, React流程圖:https://bogdan-lyashenko.gith... 事務(wù) 到現(xiàn)在這一步,組件實(shí)例已經(jīng)通過(guò)某種方式加入到React的生...

    lindroid 評(píng)論0 收藏0
  • React中組件通信的幾種方式

    摘要:首次發(fā)表在個(gè)人博客需要組件之進(jìn)行通信的幾種情況父組件向子組件通信子組件向父組件通信跨級(jí)組件通信沒(méi)有嵌套關(guān)系組件之間的通信父組件向子組件通信數(shù)據(jù)流動(dòng)是單向的父組件向子組件通信也是最常見(jiàn)的父組件通過(guò)向子組件傳遞需要的信息子組件向父組件通信利用 showImg(https://segmentfault.com/img/remote/1460000012361466?w=1240&h=667)...

    yeooo 評(píng)論0 收藏0
  • ReactJs入門教程

    摘要:組件關(guān)注的只應(yīng)該是狀態(tài),不同的狀態(tài)呈現(xiàn)不同的表現(xiàn)形式。組件一切都是組件倡導(dǎo)開發(fā)者將切分成一個(gè)個(gè)組件從而達(dá)到松耦合及重用的目的。只不過(guò)的命名是進(jìn)入狀態(tài)之前跟進(jìn)入狀態(tài)之后。 前端已不止于前端-ReactJs初體驗(yàn) 原文寫于 2015-04-15 https://github.com/kuitos/kuitos.github.io/issues/21 要說(shuō)2015年前端屆最備受矚目的技術(shù)是啥...

    bingo 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<