摘要:比如它目前事件其實(shí)對(duì)應(yīng)著原生事件中的事件。在這個(gè)中明確了未來(lái)會(huì)使用事件替代事件,并且會(huì)大幅度地簡(jiǎn)化合成事件。效果如下至此,模擬了受控組件的實(shí)現(xiàn)。
該系列文章在實(shí)現(xiàn) cpreact 的同時(shí)理順 React 框架的核心內(nèi)容
項(xiàng)目地址從一個(gè)疑問(wèn)點(diǎn)開(kāi)始
接上一章 HOC 探索 拋出的問(wèn)題 ———— react 中的 onChange 事件和原生 DOM 事件中的 onchange 表現(xiàn)不一致,舉例說(shuō)明如下:
// React 中的 onChange 事件 class App extends Component { constructor(props) { super(props) this.onChange = this.onChange.bind(this) } onChange(e) { console.log("鍵盤(pán)松開(kāi)立刻執(zhí)行") } render() { return ( ) } } /*--------------分割線(xiàn)---------------*/ // 原生 DOM 事件中的 onchange 事件: document.getElementById("test").addEventListener("change", (e) => { console.log("鍵盤(pán)松開(kāi)以后還需按下回車(chē)鍵或者點(diǎn)下鼠標(biāo)才會(huì)觸發(fā)") })撥云見(jiàn)霧
我們來(lái)看下 React 的一個(gè) issue React Fire: Modernizing React DOM。有兩點(diǎn)信息和這篇文章的話(huà)題相關(guān)。
Drastically simplify the event system
Migrate from onChange to onInput and don’t polyfill it for uncontrolled components
從這兩點(diǎn)內(nèi)容我們可以得知下面的信息:
React 實(shí)現(xiàn)了一套合成事件機(jī)制,也就是它的事件機(jī)制和原生事件間會(huì)有不同。比如它目前 onChange 事件其實(shí)對(duì)應(yīng)著原生事件中的 input 事件。在這個(gè) issue 中明確了未來(lái)會(huì)使用 onInput 事件替代 onChange 事件,并且會(huì)大幅度地簡(jiǎn)化合成事件。
有了以上信息后,我們對(duì) onChange 事件(將來(lái)的 onInput 事件)的代碼作如下更改:
function setAttribute(dom, attr, value) { ... if (attr.match(/onw+/)) { // 處理事件的屬性: let eventName = attr.toLowerCase().substr(2) if (eventName === "change") { eventName = "input" } // 和現(xiàn)階段的 react 統(tǒng)一 dom.addEventListener(eventName, value) } ... }自由組件以及受控組件
區(qū)分自由組件以及受控組件在于表單的值是否由 value 這個(gè)屬性控制,比較如下代碼:
const case1 = () => // 此時(shí)輸入框內(nèi)可以隨意增減任意值 const case2 = () => // 此時(shí)輸入框內(nèi)顯示 123,能隨意增減值 const case3 = () => // 此時(shí)輸入框內(nèi)顯示 123,并且不能隨意增減值
case3 的情形即為簡(jiǎn)化版的受控組件。
受控組件的實(shí)現(xiàn)題目可以換個(gè)問(wèn)法:當(dāng) input 的傳入屬性為 value 時(shí)(且沒(méi)有 onChange 屬性),如何禁用用戶(hù)的輸入事件的同時(shí)又能獲取焦點(diǎn)?
首先想到了 html 自帶屬性 readonly、disable,它們都能禁止用戶(hù)的輸入,但是它們不能滿(mǎn)足獲取焦點(diǎn)這個(gè)條件。結(jié)合前文 onChange 的實(shí)現(xiàn)是監(jiān)聽(tīng) input 事件,代碼分為以下兩種情況:
1.dom 節(jié)點(diǎn)包含 value 屬性、onChange 屬性
2.dom 節(jié)點(diǎn)包含 value 屬性,不包含 onChange 屬性
代碼如下:
function vdomToDom(vdom) { ... if (vdom.attributes && vdom.attributes.hasOwnProperty("onChange") && vdom.attributes.hasOwnProperty("value")) { // 受控組件邏輯 ... dom.addEventListener("input", (e) => { changeCb.call(this, e) dom.value = oldValue }) ... } if (vdom.attributes && !vdom.attributes.hasOwnProperty("onChange") && vdom.attributes.hasOwnProperty("value")) { // 受控組件邏輯 ... dom.addEventListener("input", (e) => { dom.value = oldValue }) ... } ... }
可以發(fā)現(xiàn)它們的核心都在這段代碼上:
dom.addEventListener("input", (e) => { changeCb.call(this, e) dom.value = oldValue })
區(qū)別是當(dāng)有 onChange 屬性 時(shí),能提供相應(yīng)的回調(diào)函數(shù) changeCb 通過(guò)事件循環(huán)機(jī)制改變表單的值。看如下兩個(gè)例子的比較:
const App = () =>
效果如下:
class App extends Component { constructor() { super() this.state = { num: 123 } this.change = this.change.bind(this) } change(e) { this.setState({ num: e.target.value }) } render() { return () } }
這段代碼中的 change 函數(shù)即上個(gè)段落所謂的 changeCb 函數(shù),通過(guò) setState 的事件循環(huán)機(jī)制改變表單的值。
效果如下:
至此,模擬了受控組件的實(shí)現(xiàn)。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/97880.html
摘要:首次發(fā)表在個(gè)人博客受控組件或都要綁定一個(gè)事件每當(dāng)表單的狀態(tài)發(fā)生變化都會(huì)被寫(xiě)入組件的中這種組件在中被稱(chēng)為受控組件在受控組件中組件渲染出的狀態(tài)與它的或者向?qū)?yīng)通過(guò)這種方式消除了組件的局部狀態(tài)是的應(yīng)用的整個(gè)狀態(tài)可控官方同樣推薦使用受控表單組件總結(jié) 首次發(fā)表在個(gè)人博客 受控組件 { this.setState({ value: e.target.val...
摘要:受控組件與非受控組件在官網(wǎng)與國(guó)內(nèi)網(wǎng)上的資料都不多,有些人覺(jué)得它可有可不有,也不在意。受控組件與非受控組件是處理表單的入口。認(rèn)為不能單獨(dú)存在,需要與等控制的屬性或事件一起使用。它們共同構(gòu)成受控組件,受控是受的控制。 受控組件與非受控組件在官網(wǎng)與國(guó)內(nèi)網(wǎng)上的資料都不多,有些人覺(jué)得它可有可不有,也不在意。這恰恰顯示React的威力,滿(mǎn)足不同規(guī)模大小的工程需求。譬如你只是做ListView這樣簡(jiǎn)...
摘要:小明小明兒子,可以看到組件顯示了父組件的。小明受控組件和非受控組件受控組件和非受控組件這些都是指的表單組件,當(dāng)一個(gè)表單的值是通過(guò)改變的而不是通過(guò)是受控組件,否則就是非受控組件。 react眾所周知的前端3大主流框架之一,由于出色的性能,完善的周邊設(shè)施風(fēng)頭一時(shí)無(wú)兩。本文就帶大家一起掌握react。 jsx語(yǔ)法 前端MVVM主流框架都有一套自己的模板處理方法,react則使用它獨(dú)特的jsx...
摘要:受控輸入框只會(huì)顯示通過(guò)傳入的數(shù)據(jù)。例如,數(shù)組中的元素將會(huì)渲染三個(gè)單選框或復(fù)選框。屬性接收一個(gè)布爾值,用來(lái)表示組件是否應(yīng)該被渲染成選中狀態(tài)。 原文地址:React.js Forms: Controlled Components 原文作者:Loren Stewart 譯者:小 B0Y 校對(duì)者:珂珂君 本文涵蓋以下受控組件: 文本輸入框 數(shù)字輸入框 單選框 復(fù)選框 文本域 下拉...
摘要:函數(shù)更新屬性,進(jìn)而更新元素的值。由于箭頭函數(shù)存在于父組件中,所以中的指向父組件。一旦表單被提交,的值就被設(shè)置為。遺憾的是,沒(méi)有節(jié)點(diǎn)是包含了集合的。在這種情況下,這個(gè)節(jié)點(diǎn)列表包含三個(gè)節(jié)點(diǎn)和被選中的值。 原文地址:React Forms: Using Refs 原文作者:Loren Stewart 譯者:萌萌 校對(duì)者:小 boy React 提供了兩種從 元素中獲取值的標(biāo)準(zhǔn)方法。第一...
閱讀 1000·2023-04-25 14:20
閱讀 1876·2021-11-24 10:20
閱讀 3774·2021-11-11 16:55
閱讀 2919·2021-10-14 09:42
閱讀 3472·2019-08-30 15:56
閱讀 1164·2019-08-30 15:55
閱讀 1072·2019-08-30 15:44
閱讀 782·2019-08-29 11:28