react頁(yè)面中存在多個(gè)input時(shí)巧妙設(shè)置value屬性方式
react頁(yè)面中存在多個(gè)input時(shí)巧妙設(shè)置value屬性
筆者以前是一直在用jquery進(jìn)行開(kāi)發(fā)的,才轉(zhuǎn)react沒(méi)多長(zhǎng)時(shí)間,對(duì)別的倒是沒(méi)什么感觸,就是這個(gè)input輸入框是深深的抵觸,感覺(jué)很煩人,簡(jiǎn)單的一個(gè)輸入框,你就必須要設(shè)置changeValue的方法去給input加上,這樣你輸入的內(nèi)容才能夠正確的展示到UI頁(yè)面中,也因此,如果你頁(yè)面中存在多個(gè)input時(shí),簡(jiǎn)直就是噩夢(mèng)了
因?yàn)槟闶紫纫獮檫@些所有的input框綁定上onChange的方法,然后還需要在this.state中去設(shè)置不同的input對(duì)應(yīng)不同的值,最后還需要在changeValue的方法中去一一監(jiān)聽(tīng)input輸入時(shí)去修改對(duì)應(yīng)的input的值,很是麻煩,筆者之前在寫一個(gè)注冊(cè)流程的時(shí)候被折磨的苦不堪言,最近閑下來(lái)可以去優(yōu)化一下以前的代碼,找到了一個(gè)可以優(yōu)化一下changeValue的方法
以前筆者的寫法是這樣的:
render部分name的名字是和state中的一一對(duì)應(yīng)的。
此處輸入框部分是可以單獨(dú)提取成一個(gè)獨(dú)立的小組件的,這樣就不需要每寫一個(gè)input框就需要綁定一次方法,這樣也更符合react官方推薦的做法,不過(guò)因?yàn)檫@里不是本文介紹的重點(diǎn),就沒(méi)有修改了,著重展示一下修改changeValue的方法,現(xiàn)在是根據(jù)input的name名稱去一一判斷究竟是哪個(gè)input,然后將input對(duì)應(yīng)的value值進(jìn)行修改,但是這樣最大的一個(gè)問(wèn)題就是當(dāng)頁(yè)面中input多的時(shí)候你的changValue方法會(huì)非常的繁瑣,秉承著所有用到switch方法的地方都能優(yōu)化的原則
筆者做了一下優(yōu)化,將changeValue方法改寫為:
是的,僅僅改成了三行,而且你無(wú)論有多少個(gè)input,這個(gè)方法是永遠(yuǎn)不需要去做改變的,唯一需要做到的規(guī)范就是state中的屬性名要于input中的name名稱加以對(duì)應(yīng),其實(shí)這算是對(duì)象的屬性賦值的另一種寫法,因?yàn)樵趯?duì)象中Key無(wú)法以變量的方式去讀取,所以筆者只好將對(duì)象單提出來(lái)賦值給變量o
更簡(jiǎn)單的方式:
_changeValue(e){ this.setState({ [e.target.name] : e.target.value }) }
react中input框設(shè)置value報(bào)錯(cuò)解析
react input 不設(shè)置onChange的常見(jiàn)錯(cuò)誤截圖
表單是前端非常重要的一塊內(nèi)容,并且往往包含了錯(cuò)誤校驗(yàn)等邏輯?! ?/p>
React對(duì)表單元素做了專門的優(yōu)化處理,他對(duì)表單元素做了一些抽象,使得他們的使用方式更統(tǒng)一更規(guī)范。
約束性和非約束性組件
表單里面出來(lái)了一個(gè)新的概念叫“約束性組件”。那么如何理解約束性組件和非約束性組件呢。
約束性組件,簡(jiǎn)單的說(shuō),就是由react管理了它的value,而非約束性組件的value就是原生的DOM管理的。
他們的寫法上也有很大區(qū)別。
非約束性組件這么寫:
<input type="text" defaultValue="a" />
這個(gè)defaultValue
其實(shí)就是原生DOM中的value
屬性。這樣寫出的來(lái)的組件,其value值就是用戶輸入的內(nèi)容,React完全不管理輸入的過(guò)程。
而約束性組件是這么寫的:
<input type="text" value={this.state.name} onChange={this.handleChange} /> //...省略部分代碼 handleChange: function(e) { this.setState({name: e.target.value}); }
這里,value屬性不再是一個(gè)寫死的值,他是this.state.name
,而this.state.name
是由this.handleChange
負(fù)責(zé)管理的。
這個(gè)時(shí)候?qū)嶋H上 input 的 value 根本不是用戶輸入的內(nèi)容。而是onChange 事件觸發(fā)之后,由于 this.setState 導(dǎo)致了一次重新渲染。不過(guò)React會(huì)優(yōu)化這個(gè)渲染過(guò)程,實(shí)際它依然是通過(guò)設(shè)置input的value來(lái)實(shí)現(xiàn)的。
但是一定要注意,約束性組件顯示的值和用戶輸入的值雖然很多時(shí)候是相同的,但他們根本是兩碼事。約束性組件顯示的是this.state.name
的值。你可以在handleChange中對(duì)用戶輸入的值做任意的處理,比如你可以做錯(cuò)誤校驗(yàn)。
對(duì)比約束性組件和非約束性組件的輸入流程:
非約束性組件: 用戶輸入A -> input 中顯示A
約束性組件: 用戶輸入A -> 觸發(fā)onChange事件 -> handleChange 中設(shè)置 state.name = “A” -> 渲染input使他的value變成A
正式因?yàn)檫@樣,強(qiáng)烈推薦使用約束性組件,因?yàn)樗芨玫目刂平M件的生命流程。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
作為老司機(jī)使用 React 總結(jié)的 11 個(gè)經(jīng)驗(yàn)教訓(xùn)
這篇文章主要介紹了作為老司機(jī)使用 React 總結(jié)的 11 個(gè)經(jīng)驗(yàn)教訓(xùn),需要的朋友可以參考下2017-04-04react-native聊天室|RN版聊天App仿微信實(shí)例|RN仿微信界面
這篇文章主要介紹了react-native聊天室|RN版聊天App仿微信實(shí)例|RN仿微信界面,需要的朋友可以參考下2019-11-11在React項(xiàng)目中實(shí)現(xiàn)一個(gè)簡(jiǎn)單的錨點(diǎn)目錄定位
錨點(diǎn)目錄定位功能在長(zhǎng)頁(yè)面和文檔類網(wǎng)站中非常常見(jiàn),它可以讓用戶快速定位到頁(yè)面中的某個(gè)章節(jié),本文講給大家介紹一下React項(xiàng)目中如何實(shí)現(xiàn)一個(gè)簡(jiǎn)單的錨點(diǎn)目錄定位,文中有詳細(xì)的實(shí)現(xiàn)代碼,需要的朋友可以參考下2023-09-09react項(xiàng)目實(shí)踐之webpack-dev-serve
這篇文章主要介紹了react項(xiàng)目實(shí)踐之webpack-dev-serve,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-09-09