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

第8章 DOM操作

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

訪問受控的DOM節點

想要訪問React控制的DOM節點,首先必須能夠訪問到負責這些DOM的組件。這可以通過為子組件添加一個ref屬性來實現。

render () {return (<canvas ref="mainCanvas" />)
}

這樣就可以通過this.refs.mainCanvas訪問到<canvas組件。

??必須保證賦給每個子組件的ref值在所有子組件中是唯一的;否則操作就會失效。

可以通過getDOMNode()方法訪問到底層的DOM節點。

??不可以在render方法中這樣做。因為這時底層的DOM可能不是最新的(甚至尚未創建)

盡管refs和getDOMNode很強大,但請在沒有其他的方法能夠實現你需要的功能時再去選擇它們。使用它們會成為React在性能優化上的障礙,并且增加應用的復雜性。

componentDidMount方法只會為每個DOM節點調用一次。

如果在componentDidMount方法內導致了DOM節點無法被移除,有可能導致內存泄漏或者其他的問題。如果你擔心這一點,請在componentWillUnmount監聽器,用于在組件的DOM節點移除時清理它自身。

第9章 表單

在React中,表單組件有兩種類型:約束組件和無約束組件

無約束組件

給定一個HTML的<input/>一個值,它的值是可以改變的。這正是無約束組件名稱的由來,因為表單組件的值是不受React控制的。

submitHandler = (event) => {event.preventDefault();var hellTo = this.refs.hellTo.getDOMNode().value;alert(hellTo)
}
render () {return (<form onSubmit={this.submitHandler}><input ref="hellTo" type="text" defaultValue="Hello World!" /><button type="submit">Speak</button></form>)
}

無約束組件可以用在基本的無需任何驗證或者輸入控制的表單中。

約束組件

約束組件,表單的狀態交由React組件控制,狀態值被存儲在React組件的state中。

constructor(props) {super(props);this.state = {helloTo = 'Hello World!'}
}
handleChange = (event) => {this.setState({helloTo: event.target.value})
}
submitHandler = (event) => {event.preventDefault();alert(this.state.helloTo)
}
render () {return (<form onSubmit={this.submitHandler}><input ref="hellTo" type="text" onChange={this.handleChange} /><button type="submit">Speak</button></form>)
}

表單事件

React支持所有HTML事件。這些事件遵循駝峰命名的約定,且會被轉成合成事件。

所有合成事件都提供了event.target來訪問觸發事件的DOM節點。

Label

由于for是JavaScript的保留字,所以我們無法把它作為一個對象的屬性。

jsx

<label htmlFor="name">Name:</label>

javascript

React.DOM.label({htmlFor:"name", "Name"});

渲染后:

<label for="name">Name:</label>

文本框和Select

React對<textarea/><select/>的接口做了一些修改,提升了一致性,讓它們操作起來更容易。

<textarea/>被改的更像<input/>了,允許我們設置value和defaulteValue。

//非約束的
<textareadefaultValue ="HelloWorld" />
//約束的
<textareavalue={this.state.helloTo } onChange ={this.handleChange} />//非約束的
<selectdefaultValue="8"><option value="A">First Option</option><option value="B">Second Option</option><option value= "C">Third Option</option>
</select>
//約束的
<selectvalue ={this.state.helloTo} onchange={this.handleChange}><option value="A">FirstOption </option><option value="B">Second Option </option><option value="C">Third Option</option>
</select>

React支持都選selce他,需要給value的defauletValue傳遞一個數組,如:defaultValue={["A","B"]}。

當使用可多選的select時,select組件的值在選項被選擇時不會更新,只有選項的selected屬性會發生變化。你可以使用ref或者syntheticEvent.target來訪問選項,檢查他們是否被選中。

下面的例子中,handleChange循環檢查DOM,并過濾出哪些選項被選中了。

class Hello extends React.Component {constructor(props) {super(props);this.state = {option: ["B"]};}
    handleChange = (event) => {var checked = [];var sel = event.target;for (var i = 0; i < sel.length; i++){var option = sel.options[i];if (option.selected){checked.push(option.value);}}this.setState({option: checked});}
    submitHandler = (event) => {event.preventDefault();alert(this.state.options);}render () {return(<form onSubmit={this.submitHandler}><select multiple="true" value={this.state.options}onChange={this.handleChange}><option value="A">1</option><option value="B">2</option><option value="C">3</option></select><br /><button type="submit">speak</button></form>);}
}

復選框和單選框

復選框和單選框使用的則是完全不同的控制方式。

在HTML中,類似為checkbox或者radio的<input/>的行為完全不一樣,通常,復選框或者單選框的值是不變的,只有checked的狀態會變化,要控制復選框或者單選框,就要控制他們的checked屬性,你要可以在非約束的復選框或者單選框中使用defaultChecked。

//非約束的
var MyForm = React.createClass({submitHandler: function(event){event.preventDefault();alert(this.refs.checked.getDOMNode().checked);},render: function(){return (<form onSubmit={this.submitHandler}><input ref="checked" type="checkbox" value="A" defaultChecked="true" /><br /><button type="submit">speak</button></form>);}
});//約束的
var MyForm = React.createClass({getInitialState: function(){return {checked: true};},handleChange: function(event){this.setState({checked: event.target.checked});},submitHandler: function(event){event.preventDefault();alert(this.state.checked);},render: function(){return (<form onSubmit={this.submitHandler}><input type="checkbox" value="A" checked={this.state.checked} onChange={this.handleChange} /><br/><button type="submit">speak</button></form>);}
});

在這兩個例子中,<input/>的值一直都是A,只有checked的狀態在變化。

表單元素的name屬性

在React中,name屬性對于表單元素來說并沒有那么重要。因為約束表單組件已經把值存儲到了state中,并且表單的提交事件也會被攔截。在獲取表單值的時候,name屬性并不是必需的。對于非約束的表單組件來說,也可以使用refs來直接訪問表單元素。雖然如此,name仍然是表單組件中非常重要的一部分。

  • name屬性可以讓第三方表單序列化類庫在React中正常工作。
  • 對于任然使用傳統提交方式的表單來說,name屬性是必需的。
  • 在用戶的瀏覽器中,name被用在自動填寫常用信息中,比如用戶地址等。
  • 對于非約束的單選框組件來講,name是有必要得,它可作為這些組件分組的依據。確保在同一時刻,同一表單中擁有同樣name的單選框只有一個可以被選中。如果不使用name屬性,這一行為可以使用約束的單選框實現。

多表單與change處理器

在使用約束的表單組件時,沒有愿意重復地為每一個組件編寫change處理器。可以在React中重用一個事件處理器。

可以有兩種方式:通過.bind傳遞其他參數;使用DOMNode的name屬性來判斷需要更新哪個組件的狀態。

示例可以看page75~77

除此之外,React還在addon中提供了一個mixin,React.addons.LinkedStateMixin,通過另一種方式解決同樣的問題。

React.addons.LinkedStateMixin為組件提供了一個linkState方法。linkState返回一個對象,包含value和requestChange兩個屬性。

value根據提供的name屬性從state中獲取對應的值。

requestChange是一個函數,使用心得值更新同名的state。

mixins:[React.addons.LinkedStateMixin]

submitHandler = (event) => {event.preventDefault();alert(this.state.family_name);
}<input type="text" name="family_name" valueLink={this.linkState('family_name')} />

這種方法便于控制表單域,把其值保存在福組件的state中。而且,其數據流仍然與其他約束的表單元素保持一致。

但是,使用這種方式往數據流中添加定制功能時,復雜度會增加。我們建議只在特性的場景下使用。因為傳統的約束表單組件提供了同樣的功能而且更加靈活。

自定義表單組件

當編寫自定義組件時,接口應當與其他表單組件保持一致。這可以幫助用戶理解代碼,明白如何使用自定義組件,且無須深入到組件的實現細節里。

示例:page79~82

Focus

React實現了autoFocus屬性,因此在組件第一次被掛載時,如果沒有其他的表單聚焦時React就會把焦點放到這個組件對應的表單域中,例如:

<input type="text" name="given_name"autoFocus="true" />

還有一種方法就是調用DOMNode的focus方法,手動設置表單域聚焦。

可用性

React雖然提高了開發者的生產力,但是也有不盡如人意的地方,使用React編寫的組件常常缺乏可用性,例如表單提交無法通過鍵盤敲擊回車鍵來實現,而這明明是HTML表單默認的提交方式。

要編寫具有高可用性的好組件其實也不難,只是編寫組件時需要花時間進行更多的思考。

  • 把要求傳達清楚
  • 不斷地反饋
  • 迅速響應
  • 符合用戶的預期
  • 可訪問
  • 減少用戶的輸入

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

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

相關文章

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

甘肅省普通高等學校專升本考試計算機全真模擬試卷(一) 一、單項選擇題(在每小題給出的四個選項中只有一項是正確的,將正確選項的字母序號填在括號內。每小題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 完成二…

Android之自定義帶圓角的水紋波效果

1 需求 自定義帶圓角的水溫波效果 2 代碼實現 bg_navigation_ripple.xml <?xml version"1.0" encoding"utf-8"?> <ripple xmlns:android"http://schemas.android.com/apk/res/android"android:color"color/c3"><i…

爬蟲是什么?起什么作用?

【爬蟲】 如果把互聯網比作一張大的蜘蛛網&#xff0c;數據便是放于蜘蛛網的各個節點&#xff0c;而爬蟲就是一只小蜘蛛&#xff0c;沿著網絡抓取自己得獵物&#xff08;數據&#xff09;。這種解釋可能更容易理解&#xff0c;官網的&#xff0c;就是下面這個。 爬蟲是一種自動…

根據實例類型反射操作數據庫(簡單通用表操作類)

這個類適用簡單的表 1.有且只有id為主鍵&#xff0c; 2.并且實例類主鍵&#xff0c;也就是id應為字段&#xff0c;其他為屬性 3.實例類名跟表名一樣&#xff0c;字段屬性跟列名一樣 public class ProType{public int id;public string type{get;set;}public int array{get;set;…

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

第11章 性能優化 Reactde Dom diff算法使我們能夠在任意時間點高效地重新繪制整個用戶界面&#xff0c;并保證最小程度的DOM改變&#xff0c;然而&#xff0c;也存在需要對組件進行細致優化的情況&#xff0c;這時就需要渲染一個新的DOM來讓應用運行得更加高效。 shouldCompone…

oneproxy檢測主從復制同步延遲

Q:為什么要實現讀寫分離延遲檢測&#xff1f; A:就好比你在ATM機存錢&#xff0c;你老婆收到短信后樂呵呵的拿網銀APP查看&#xff0c;結果錢沒過來。其實錢已經到賬了&#xff0c;只是查詢的ATM機節點錢還沒過來。所以我們dba要監控數據&#xff0c;一旦發現錢沒有復制到另一A…

.NET 分表分庫動態化處理

介紹本期主角:ShardingCore 一款ef-core下高性能、輕量級針對分表分庫讀寫分離的解決方案&#xff0c;具有零依賴、零學習成本、零業務代碼入侵我不是efcore怎么辦這邊肯定有小伙伴要問有沒有不是efcore的,我這邊很確信的和你講有并且適應所有的ADO.NET包括sqlhelperShardingCo…

addEventListener 的事件函數的傳遞【轉載】

addEventListener 參數如下&#xff1a; addEventListener(type, listener[, useCapture]); type&#xff0c;事件名稱listener&#xff0c;事件處理器useCapture&#xff0c;是否捕獲一直把 listener 記成是響應函數&#xff0c;function 類型。相信很多人也是這么理解的。多數…

Android之elevation實現陰影效果

1 需求 需要控件實現陰影效果 2 實現 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"andr…