React-引領未來的用戶界面開發框架-讀書筆記(二)

第4章 數據流

  1. 由于react的數據流向是單向的(其父節點傳遞到子節點),
  2. 因此組件是簡單且易于把握的(它們只需要從父節點獲取props渲染即可)
  3. 假如頂層組件的某個prop改變了,react會遞歸地向下遍歷整個組件樹,重新渲染所有使用這個屬性的組件。
  4. react組件內部還具有自己的狀態,這些狀態只能在組件內修改。react組件本身很簡單,你可以把它們看成是一個函數,它接受props和state作為參數,返回一個虛擬的dom表現。

Props(properties 特性)

用途:可以把任意類型的數據傳遞給組件

2種方式設置props:

  • 掛載組件時:<ListSurveys surveys={surveys}/>
  • 調用組件實例的setProps方法:listSurveys.setProps({ surveys: survey });

setProps注意點:

  • 只能在子組件上或組件樹外調用setProps
  • 千萬別調用this.setProps或者修改this.props(一個組件絕對不可以修改自己的props)、
  • 有需要請使用state!!!

可以通過this.prpos訪問props,但絕不能通過這種方式修改它。一個組件絕對不可以修改自己的props。

在jsx中,可以把props設置為字符串:

<a href="http://www.molinblog.com">molinblog</a>

也可以使用{}語法來設置,注入JavaScript傳遞任意類型的變量:

<a href={'http://www.molinblog.com/blog/' + blog.id}>{blog.title}</a>

還可以使用JSX的展開語法把props設置成一個對象:

render () {var props = {one: 'foo',two: 'bar'};return (<SurveyTable {...props} />)
}

props還可以用來添加事件處理程序:

render () {return (<a className='button save' onClike={this.handleClick}>Save</a>);
}
handleClick: function() {// ...
}

PropsTypes

  1. 用途:通過在組件中定義一個配置對象,來驗證props的方式
  2. 在應用中使用PropsTypes并不是強制性的,但這提供了一種極好的方式來描述組件的API
class SurveyTableRow extends React.Component {propsType: {survey: React.PropTypes.number.shape({id: React.PropTypes.number.isRequired}).isRequired,onClick: React.PropTypes.func},// ...
}

一臉黑線?????????、、

getDefaultProps

  1. 用途:設置屬性的默認值(針對那些非必需屬性)
  2. getDefaultProps不是在組件實例化時被調用,而是在React.createClass調用時就被調用了,返回值被緩存起來。也就是說,不能在getDefaultProps中使用任何特定的實力數據
  3. 在ES6中為屬性:defaultProps(可以標識static定義在class內,也可以定義在class外)
  4. 在ES5中為方法:getDefaultProps: function(){return {name:value}};

es5中使用示例:

var NewDom = React.createClass({//類名一定要大寫開頭getDefaultProps: function() {//設置默認屬性return {title:'133'};},propTypes: {title:React.PropTypes.string,},//屬性校驗器,表示必須是stringrender: function() {return <div>{this.props.title}</div>;//變量用花括號標識}
});

es6中使用示例:

const React = require('react');
const ReactDOM = require('react-dom');import {Promise} from 'es6-promise'class NewDom extends React.Component{//不能再組件定義的時候定義一個屬性render() {return <div >{this.props.title}</div>;}//開頭花括號一定要和小括號隔一個空格,否則識別不出來
}
//es6 這兩個屬性不能寫在class內。
NewDom.propTypes={//屬性校驗器,表示改屬性必須是string,否則報錯title: React.PropTypes.string,
}
NewDom.defaultProps={title:'fsdfd133'};//設置默認屬性ReactDOM.render((<NewDom></NewDom>
), document.querySelector('#init'))

state

  1. 每個react組件都會有自己的state,state與props的區別在于:state只存在于組件的內部
  2. state可以用來確定一個元素的視圖狀態。
  3. state可以通過setState修改,只要setState被調用,render就會被調用。
  4. 如果render函數的返回值有變化,虛擬DOM就會更新,真實的DOM也會被更新,最終用戶就會在瀏覽器中看到變化。
  5. 千萬不能直接修改this.state,永遠記得要通過this.setState方法修改。

放在state和props的各是哪些部分?

  • state中應存那些簡單的組件正常工作時的必須要的數據。(布爾值,輸入框值等)
  • 不要嘗試把props復制到state中,要盡可能把props當作數據源

總結

  • 使用了props在整個組件樹中傳遞數據和配置
  • 避免在組件內部修改this.props或調用this.setProps,請把props當作是只讀的
  • 使用props來做事件處理器(下一章會細節化),與子組件通信
  • 使用state存儲簡單的視圖狀態,比如下拉框是否可見這樣的狀態
  • 使用this.setState來設置狀態,而不要使用this.state直接修改狀態

第5章 事件處理

展示頁面+js響應事件=用戶界面整體設計

綁定事件處理器

react處理的事件本質和原生js一樣(包括命名)

jsx版:

<button className="btn btn-save" onClick={this.handleSave}>Save</button>

js版

React.DOM.button({className: "btn btn-save", onClick: this.handleSaveClicked}, "Save");

jsx的寫法類似HTML內聯時間處理器屬性,比如onClick,但其實在底層實現上并沒有使用HTML的onClick屬性(而是通過事件處理之類的方法?)。

react對各類事件類型提供良好的支持,具體支持列在這里

其中絕大部分事件不需要額外的處理就能工作,但是觸控事件需要通過調用以下的代碼手動啟用:

React.initializeTouchEvents(true)           // 是否已被改動????

事件和狀態

解決組件隨著用戶輸入而改變的問題,經過特定組件渲染后,綁定的事件處理器方法負責處理行為。

根據狀態進行渲染

可以在render中讀取this.state,然后根據this.state的值渲染出不同的頁面。

更新狀態

更新組件狀態有兩種方案:組件的setState方法和replaceState方法。replaceState用一個全新的state對象完整地替換掉原有的state。使用不可變數據結構來表示時,這種方式很有效,不過很少應用于其他場景下。

??永遠不要嘗試通過setState或者replaceState以外的方式去修改state對象。類似this.saveInProgress = true通常不是一個好主意,因為它無法通過React是否需要重新渲染組件,而且可能會導致下次調用setState時出現意外結果。

本節可參考極客學院

事件對象

使用event.target.value可以獲取表單中input值。

事件處理程序通過 合成事件(SyntheticEvent)的實例傳遞,SyntheticEvent 是瀏覽器原生事件跨瀏覽器的封裝。SyntheticEvent 和瀏覽器原生事件一樣有 stopPropagation()、preventDefault() 接口,而且這些接口夸瀏覽器兼容。

如果出于某些原因想使用瀏覽器原生事件,可以使用 SyntheticEvent的nativeEvent 屬性獲取。

本節可參考極客學院

總結

從用戶輸入到更新用戶界面,處理步驟非常簡單:

  • 在react組件上綁定事件處理器
  • 在事件處理器當中更新組件的內部狀態。組件狀態的更新會出發重繪
  • 實現組件的render函數用來渲染this.state的數據

第6章 組件的復合

傳統HTML當中,元素是構成頁面的基礎單元。在React中,React組件是構成頁面的基礎單元。

本質上,一個組件就是一個JavaScript函數,它接受屬性(props)和狀態(state)作為參數,并輸出渲染好的HTML。組件一般被用來呈現和表達應用的某部分數據,因此你可以把react組件理解為HTML元素的擴展。

擴展HTML

React加jsx是強大而富有表現力的工具,允許我們使用類似HTML的語法創建自定義元素。比起單純的HTML,它們還能夠控制生命周期中的行為。

React偏愛符合,即通過結合小巧的、簡單的組件和數據對象,構造大而復雜的組件。React組件使不可以擴展的,而是通過組件之間的組合來構建應用。

組件復合的例子

組合模式的特征:選擇題組件有一個單選框,單選框有一個輸入框元素Input。

組裝HTML

對于每一個非必需的屬性都需要一個默認值,可以把它添加到defaultProps中。

追蹤狀態

組件需要記錄隨時間而變化的數據。

整合到父組件中

將子組件放到父組件中

父組件、子組件關系

子組件與其福組件通信的最簡單方式就是使用屬性(props)。父組件可以通過屬性傳入一個毀掉函數,子組件在需要時進行調用。

總結

組件的復合知識React提供的用于定制和特殊化組件的方式之一。

可通過本章的例子深入了解組件的復合。page44~52

第7章 mixin

mixin允許我們定義可以在多個組件中公共用的方法。

什么是mixin

mixin相當簡單,他們就是混合進組件類中的對象而已。React在這方面實現得更加深入,它能防止靜默函數覆蓋,同時還支持多個mixin混合。

以component開頭的生命周期函數,如componentDidMount,會按照在mixin數組中定義的順序被調用,并最終調用組件中定義的componentDidMount,如果它存在的話。

關于mixin的其它用法可參考:

  • 一個監聽事件并修改state的mixin(如flux store mixin)。
  • 一個上環mixin,它負責處理XHR上傳請求,同時將狀態以及上傳的進度同步到state
  • 渲染層mixin,簡化在<\/body>之前渲染子元素的過程(如渲染模態對話框)

總結

mixin是解決代碼段重復的最強大工具之一,它同時還能讓組件保持專注于自身的業務邏輯。mixin允許我們使用強大的抽象功能,甚至有些問題如果沒有mixin就無法被優雅地解決。

即使我們只打算在單個組件中使用一個mixin,它還是為我們提供了描述一個特定行為或角色并提供給該組件的能力。mixin減少了我們在了解整個組件之前需要閱讀的代碼量,同時允許我們在不污染組件本身的情況下做一些丑陋的處理(比如管理內部__interval)。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/286787.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/286787.shtml
英文地址,請注明出處:http://en.pswp.cn/news/286787.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

六、WebApp 二手信息站點頁面制作(IVX 快速開發教程)

六、二手信息站點頁面制作 在了解了基礎可視組件后&#xff0c;我們可以通過這些可視組件進行站點頁面開發&#xff0c;在此以一個二手交易網站站點頁面為例&#xff0c;本教程示例并不是成熟完善的示例&#xff0c;需要各位讀者進行少量完善&#xff0c;示例只是用于功能講解…

【專升本計算機】甘肅省專升本考試公共課計算機填空題考點匯總

甘肅專升本考試公共課計算機填空題考點匯總 Excel 工作簿文件的默認擴展名為 xls 。 Excel 主界面窗口中編輯欄上的 “fx” 按鈕用來向單元格插入函數。 用來給電子工作表中的行號進行編號的是數字。 在 Excel 中,輸入數字作為文本使用時,需要輸入作為先導標記的字符是單引…

Blazor University (25)路由 —— 通過 HTML 導航

原文鏈接&#xff1a;https://blazor-university.com/routing/navigating-our-app-via-html/通過 HTML 導航源代碼[1]鏈接到 Blazor 組件中的路由的最簡單方法是使用 HTML 超鏈接。<a href"/Counter">This works just fine</a>Blazor 組件中的超鏈接會被…

css3選擇器詳解

css3選擇器詳解css中除了早先最早的&#xff0c;ID選擇器&#xff0c;class選擇器一些以外在css3中新加入了新的選擇器&#xff0c;新選擇器的使用大大的方便了我們的編程&#xff0c;下面我就說一些css3的選擇器的使用方法&#xff0c; p 選擇了所有<p>元素的標簽…

OpenReports中文支持方案

此文章在《OpenReports中文支持完全解決方案.doc》的基礎上做優化&#xff0c;并貼出代碼。已測試通過。 一、主要解決的問題 1 頁面顯示支持中文 2 與服務器或數據庫的交互支持中文 3 查詢結果支持中文 4 導出文件名及內容支持中文 二、解決方案及方法 1 …

LeetCode之First Unique Character in a String

1、題目 Given a string, find the first non-repeating character in it and return its index. If it doesnt exist, return -1. Examples: s "leetcode" return 0.s "loveleetcode", return 2. 2、代碼實現 public class Solution {public int firstU…

七、功能性組件與事件邏輯(IVX 快速開發教程)

七、功能性組件與事件邏輯 由于 iVX 極度易用的特性&#xff0c;在 iVX 中開發微信小程序、WebApp、小游戲應用的開發流程大致相同。介紹完基礎可視化組件后通過后臺的服務、數據庫與事件結合即可完成一個應用的開發&#xff1b;此篇將會介紹 iVX 功能性組件與事件&#xff0c…

python assert的作用

一、python assert的作用&#xff1a; 根據Python 官方文檔解釋(https://docs.python.org/3/reference/simple_stmts.html#assert), "Assert statements are a convenient way to insert debugging assertions into a program". 二、一般的用法是&#xff1a; assert…

React-引領未來的用戶界面開發框架-讀書筆記(三)

第8章 DOM操作 多數情況下&#xff0c;React的虛擬DOM足以用來創建你想要的用戶體驗&#xff0c;而根本不需要直接操作底層真實的DOM。然而也有一些例外。最常見的場景包括&#xff1a;需要與一個沒有使用React的第三方類庫進行整合&#xff0c;或者執行一個React沒有原生支持的…

【專升本計算機】甘肅省普通高等學校專升本考試計算機全真模擬試卷(一)

甘肅省普通高等學校專升本考試計算機全真模擬試卷(一) 一、單項選擇題(在每小題給出的四個選項中只有一項是正確的,將正確選項的字母序號填在括號內。每小題1分,共60分。) 1.在Excel中,當單元格中出現#N/A時,表示( )。 A.公式中有Excel不能識別的文本 B.公式或函數…

WPF 基礎控件之 ToggleButton 樣式

其他基礎控件1.Window2.Button3.CheckBox4.ComboBox5.DataGrid 6.DatePicker7.Expander8.GroupBox9.ListBox10.ListView11.Menu12.PasswordBox13.TextBox14.RadioButtonToggleButton 實現下面的效果1&#xff09;ToggleButton來實現動畫&#xff1b;Border嵌套 Ellipse并設置T…

hdu-5781 ATM Mechine(dp+概率期望)

題目鏈接&#xff1a; ATM Mechine Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Problem DescriptionAlice is going to take all her savings out of the ATM(Automatic Teller Machine). Alice forget how many deposit she has, …

Android之讓手機能識別當前app為瀏覽器類型的APP

1 、問題 我們設置手機默認瀏覽器的時候&#xff0c;我們一般在“設置”頁面&#xff0c;點擊"默認應用管理“&#xff0c;然后再點擊瀏覽器&#xff0c;發現里面沒有當前的app,但是會有一些QQ瀏覽器(前提手機安裝了)或者其它瀏覽器&#xff0c;我們怎么讓系統能識別自己…

反射調用 java bean的set和get方法

v一、使用java.beans.PropertyDescriptor import java.beans.IntrospectionException; import java.beans.PropertyDescriptor; import java.lang.reflect.Field; import java.lang.reflect.Method;public class PropertyUtil {private static final String SET_PREFIX "…

八、后臺與數據庫(IVX 快速開發教程)

八、后臺與數據庫 在 iVX 中 數據庫 作為數據存儲倉庫&#xff0c;通過 數據庫 可以永久性存儲存儲數據&#xff0c;而 后臺服務 起到數據傳輸作用&#xff0c;將 數據庫 的數據傳輸到前臺頁面之中&#xff0c;頁面再使用這些數據。 文章目錄八、后臺與數據庫8.1.1 數據庫添加…

React-引領未來的用戶界面開發框架-讀書筆記(四)

第10章 動畫 動畫可以讓用戶體驗變得更加流暢自然&#xff0c;而React的TransitionGroup插件配合CSS3可以讓我們在項目中整合動畫效果的變得易如反掌。 通常情況下&#xff0c;瀏覽器中的動畫都擁有一套極其命令式的API&#xff0c;你需要選擇一個元素并主動移動它或者改變它的…

Android Studio開發環境搭建準備

Android Studio 是一個Android開發環境&#xff0c;基于IntelliJ IDEA. 類似 Eclipse ADT&#xff0c;Android Studio 提供了集成的 Android 開發工具用于開發和調試。 Android Studio開發環境搭建前&#xff0c;我們需要進行安裝前的準備工作&#xff0c;本篇以在Windows 7平臺…

管理中眼鏡蛇效應

這個世界的事物經常會很奇怪。當你做了一個出發點很好的決定后&#xff0c;結果未必是向你預期的方向發展&#xff0c;甚至適得其反。作為企業/組織/團隊的管理者&#xff0c;經常會在實際管理中&#xff0c;制定了錯誤的績效激勵辦法&#xff0c;使得整體活動走向與初始激勵目…

九、二手信息站點后臺完成 (IVX 快速開發教程)

九、二手信息站點后臺完成 了解完后臺實現后&#xff0c;我們開始為該二手商品站點完成完成后臺制作。 文章目錄九、二手信息站點后臺完成9.1.1 完成二手信息站點注冊功能9.1.2 完成二手信息站點登錄功能9.1.3 完成商品發布功能9.1.4 首頁信息獲取9.1.5 詳情頁內容9.1.1 完成二…