摘要:事件機(jī)制實(shí)現(xiàn)了自己的一套事件代理和處理機(jī)制,這套機(jī)制是符合標(biāo)準(zhǔn)的。事件代理并沒(méi)有將事件處理添加到相應(yīng)的每個(gè)節(jié)點(diǎn)上。當(dāng)啟動(dòng)時(shí),在根節(jié)點(diǎn)上監(jiān)聽(tīng)所有的事件,并管理事件到相應(yīng)節(jié)點(diǎn)的映射。
props
先看個(gè)簡(jiǎn)單的例子:
var HelloWorld = React.createClass({ render: function () { return ({this.props.content}) } }); React.render(, document.body );
看代碼就很容易理解:通過(guò)this.props我們可以拿到組件使用時(shí)的屬性。稍微改變下代碼,我們打印出this.props瞅瞅:
var HelloWorld = React.createClass({ render: function () { return ({JSON.stringify(this.props)}) } }); React.render(, document.body );
瀏覽器頁(yè)面效果:
可以看出this.props就是組件的屬性集合,稍微改下代碼,再來(lái)看看:
var HelloWorld = React.createClass({ render: function () { return ({JSON.stringify(this.props)}) } }); React.render(1 2 , document.body );
瀏覽器頁(yè)面效果:
這個(gè)時(shí)候多了一個(gè)children的屬性,React將組件的子節(jié)點(diǎn)封裝到了children屬性中,如果想獲取到子節(jié)點(diǎn)的內(nèi)容,可以這么寫:
var HelloWorld = React.createClass({ render: function () { return ({ this.props.children.map(function (child) { return child; })}) } }); React.render(1 2 , document.body );
當(dāng)子節(jié)點(diǎn)只有一個(gè)的時(shí)候直接通過(guò)this.props.children獲取子節(jié)點(diǎn)。當(dāng)子節(jié)點(diǎn)的個(gè)數(shù)大于1,this.props.children是一個(gè)數(shù)組。
綜上我們可以看出,React將節(jié)點(diǎn)屬性和子節(jié)點(diǎn)都封裝到props當(dāng)中,我們可以通過(guò)this.props獲取到。在React的設(shè)定中,props是不可變的,當(dāng)props屬性確定后,我們不應(yīng)該再去手動(dòng)修改它。
一個(gè)陷阱看下這個(gè)代碼:
var Hello = React.createClass({ render: function () { return ( ) } }); React.render(, document.body ); content
咋一看是不是覺(jué)得頁(yè)面渲染出來(lái)應(yīng)該是這個(gè)效果:
content
實(shí)際上渲染出來(lái)是這樣的:
看頁(yè)面的渲染效果:我們要找到根節(jié)點(diǎn),關(guān)注它的render方法的返回值。至于使用時(shí)的嵌套結(jié)構(gòu),看完props應(yīng)該明白,這些都是組件屬性,想要使用的話,請(qǐng)通過(guò)this.props.children.
statestate是同UI交互最重要的屬性,看個(gè)簡(jiǎn)單的例子,點(diǎn)擊按鈕,切換按鈕的顏色:
var ColorButton = React.createClass({ getInitialState: function () { return {bColor: "green"}; }, render: function () { return ( ) }, handleClick: function (event) { this.setState({bColor: this.state.bColor === "green" ? "red" : "green"}); } }); React.render(, document.body );
getInitialState是用來(lái)初始化state,handleClick是用來(lái)處理我們點(diǎn)擊事件的。
事件機(jī)制React實(shí)現(xiàn)了自己的一套事件代理和處理機(jī)制,這套機(jī)制是符合W3C標(biāo)準(zhǔn)的。通過(guò)這套機(jī)制,React有兩個(gè)很重要的特點(diǎn):
自動(dòng)綁定所有的事件處理函數(shù)當(dāng)中的this指向組件的實(shí)例。如果想要拿到當(dāng)前操作的DOM,通過(guò)參數(shù)event獲取。
var ColorButton = React.createClass({ getInitialState: function () { return {name: "button"}; }, render: function () { return ( ) }, handleClick: function (event) { console.log(this.state); console.log(event.target); } }); React.render(事件代理, document.body );
React并沒(méi)有將事件處理添加到相應(yīng)的每個(gè)節(jié)點(diǎn)上。當(dāng)React啟動(dòng)時(shí),在根節(jié)點(diǎn)上監(jiān)聽(tīng)所有的事件,并管理事件到相應(yīng)節(jié)點(diǎn)的映射。當(dāng)組件mounted或者unmounted時(shí),事件將會(huì)被添加到映射關(guān)系或者被刪除。我感覺(jué),有點(diǎn)jQuery的事件代理的意思:
#糟糕的寫法 $("li").on("click", function () { //todo }); //好點(diǎn)的寫法 $("ul").on("click", "li", function () { //todo });狀態(tài)機(jī)
React將UI簡(jiǎn)單的看作狀態(tài)機(jī)。看UI看作各種各樣的狀態(tài),并在各種狀態(tài)間切換,很容易保持UI的一致性。在React中,你只要改變組件的狀態(tài),就會(huì)重新渲染UI,React會(huì)在最有效的方式下更新DOM。
state工作原理通過(guò)調(diào)用setState(data, callback)方法,改變狀態(tài),就會(huì)觸發(fā)React更新UI。大部分情況下,我們不需要提供callback函數(shù)。React會(huì)自動(dòng)的幫我們更新UI。
什么樣的組件該有state后面在好好看看這個(gè)callback的功能和調(diào)用時(shí)機(jī)。
大部分的組件應(yīng)該從props屬性中獲取數(shù)據(jù)并渲染。但有的時(shí)候組件得相應(yīng)用戶輸入,同服務(wù)器交互,這些情況下會(huì)用到state。React的官方說(shuō)法是:盡可能的保持你的組件無(wú)狀態(tài)化。為了實(shí)現(xiàn)這個(gè)目標(biāo),得保持你的狀態(tài)同業(yè)務(wù)邏輯分離,并減少冗余信息,盡可能保持組件的單一職責(zé)。
React官方推薦的一種模式就是:構(gòu)建幾個(gè)無(wú)狀態(tài)的組件用來(lái)渲染數(shù)據(jù),在這些之上構(gòu)建一個(gè)有狀態(tài)的組件同用戶和服務(wù)交互,數(shù)據(jù)通過(guò)props傳遞給無(wú)狀態(tài)的組件。我的理解大概就是這樣:
var RenderComponent = React.createClass({ render: function () { return (
UI交互會(huì)導(dǎo)致改變的數(shù)據(jù)。
state不應(yīng)包含什么樣的數(shù)據(jù)計(jì)算過(guò)的數(shù)據(jù)
組件
從props復(fù)制的數(shù)據(jù)
state應(yīng)保含最原始的數(shù)據(jù),比如說(shuō)時(shí)間,格式化應(yīng)該交給展現(xiàn)層去做。
組件應(yīng)在render方法里控制。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/85616.html
摘要:今天給大家?guī)?lái)了好程序員實(shí)戰(zhàn)項(xiàng)目商城管理后臺(tái)。配合項(xiàng)目學(xué)習(xí)會(huì)讓你更快掌握它的使用方法下面就來(lái)看看好程序員這套實(shí)戰(zhàn)項(xiàng)目課程介紹好程序員項(xiàng)目本項(xiàng)目是一個(gè)使用開(kāi)發(fā)的商城系統(tǒng)的管理后臺(tái),里面登錄判斷,接口調(diào)用,數(shù)據(jù)展示和編輯,文件上傳等后臺(tái)功能。 眾所周知,項(xiàng)目經(jīng)驗(yàn)對(duì)于一個(gè)程序員變得越來(lái)越重要。在面...
摘要:更多資源請(qǐng)文章轉(zhuǎn)自月份前端資源分享的作用數(shù)組元素隨機(jī)化排序算法實(shí)現(xiàn)學(xué)習(xí)筆記數(shù)組隨機(jī)排序個(gè)變態(tài)題解析上個(gè)變態(tài)題解析下中的數(shù)字前端開(kāi)發(fā)筆記本過(guò)目不忘正則表達(dá)式聊一聊前端存儲(chǔ)那些事兒一鍵分享到各種寫給剛?cè)腴T的前端工程師的前后端交互指南物聯(lián)網(wǎng)世界的 更多資源請(qǐng)Star:https://github.com/maidishike... 文章轉(zhuǎn)自:https://github.com/jsfr...
摘要:說(shuō)的通俗點(diǎn)如果組件出現(xiàn)在了組件的方法中,那么組件就是所有者。所有者和被所有者關(guān)系是針對(duì)組件的,父子關(guān)系是針對(duì)結(jié)構(gòu)的。子調(diào)節(jié)調(diào)節(jié)發(fā)生在更新的過(guò)程中。帶有狀態(tài)的子節(jié)點(diǎn)對(duì)大部分組件來(lái)說(shuō),問(wèn)題不大。應(yīng)該加在組件上,而不是標(biāo)簽上。 關(guān)注分離 我們?cè)诰幊痰臅r(shí)候碰到相同的功能,可以通過(guò)抽出公共方法或者類來(lái)實(shí)現(xiàn)復(fù)用。當(dāng)我們構(gòu)建新的組件的時(shí)候,盡量保持我們的組件同業(yè)務(wù)邏輯分離,將相同功能的組件抽出一個(gè)...
摘要:組件的狀態(tài)與屬性組件本質(zhì)上是狀態(tài)機(jī),輸入確定,輸出一定確定。這是在事件處理函數(shù)中和請(qǐng)求回調(diào)函數(shù)中觸發(fā)更新的主要方法。 組件的狀態(tài)與屬性 組件本質(zhì)上是狀態(tài)機(jī),輸入確定,輸出一定確定。組件把狀態(tài)與結(jié)果一一對(duì)應(yīng)起來(lái),組件中有state與prop(狀態(tài)與屬性)。 屬性(props)是由父組件傳遞給子組件的; 狀態(tài)(state)是子組件內(nèi)部維護(hù)的數(shù)據(jù),當(dāng)狀態(tài)發(fā)生變化的同時(shí),組件也會(huì)進(jìn)行更新。當(dāng)...
摘要:官方說(shuō)法注本人英語(yǔ)二十六級(jí)是和用來(lái)創(chuàng)建用戶界面的庫(kù)。很多人將認(rèn)為是中的。怎么說(shuō)呢現(xiàn)在的自己就是個(gè)跟風(fēng)狗啊,什么流行先學(xué)習(xí)了再說(shuō),再看看能不能應(yīng)用在具體項(xiàng)目上。暫時(shí)先停下的學(xué)習(xí),坐等。不過(guò)學(xué)習(xí)的腳步還是跟不上潮流的發(fā)展速度啊。 Why React? 官方說(shuō)法 注:本人英語(yǔ)二十六級(jí) React是Facebook和Instagram用來(lái)創(chuàng)建用戶界面的JavaScript庫(kù)。很多...
閱讀 3496·2023-04-25 22:44
閱讀 1045·2021-11-15 11:37
閱讀 1704·2019-08-30 15:55
閱讀 2709·2019-08-30 15:54
閱讀 1162·2019-08-30 13:45
閱讀 1489·2019-08-29 17:14
閱讀 1937·2019-08-29 13:50
閱讀 3511·2019-08-26 11:39