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