表單
????????在?React?里少办,HTML?表單元素的工作方式和其他的?DOM?元素有些不同苞慢。
????????一般來說,表單以及表單中的控件(如:input英妓、select……)是頁面中與?JavaScript?打交道最多的元素了挽放。雖然我們可以通過?ref?的
????????形式去操作它們,但是這樣會比較麻煩蔓纠,React.js?為我們提供了一個更好的方式把?React.js?中的數(shù)據(jù)以及邏輯與表單控件關聯(lián)起來辑畦。
受控組件
????????`受控組件`?:?用?props?傳入數(shù)據(jù)的話,組件可以被認為是受控(因為組件被父級傳入的?props?控制)
????????`非受控組件`?:?數(shù)據(jù)只保存在組件內(nèi)部的?state?的話腿倚,是非受控組件(因為外部沒辦法直接控制?state)
廣義來說纯出,頁面中的任意元素都是一個獨立的組件,表單控件也是敷燎,它們內(nèi)部也會維護屬于自己的狀態(tài)(如:value暂筝,selected,checked……)懈叹,當然這些狀態(tài)是由原生實現(xiàn)的乖杠,而非?React.js?來控制的分扎,但是有的時候我們希望通過?React.js?來管理和維護表單控件的狀態(tài)澄成,我們把這種控件(控件)稱為:?**受控組件**,?針對不同的組件畏吓,狀態(tài)的維護方式也有所差異
????????????-?input
????????????-?textarea
????????????-?select
通過?state?來控制組件狀態(tài)
? ? ????-?創(chuàng)建?state?與組件的某個狀態(tài)進行綁定
? ? ? ? -?監(jiān)聽組件某些事件來更新?state
input
通過受控組件墨状,可以更加便捷的操控組件交互
textarea
????????textarea?與?input?類似,但是需要注意的是:?使用?value?菲饼,而不是?內(nèi)容(innerHTML)
select
????????select?在?React.js?中也做了一些處理肾砂,不在是通過?selected?屬性來表示選中元素,而是通過?select?標簽的?value?屬性
多選
????????我們還可以設置多選?select宏悦,對應的?value?就是一個數(shù)組
單選
????????radio?和下面的?checkbox?需要注意的是镐确,受控的屬性不在是?value?包吝,而是?checked
非受控組件
????????話又說回來,通過上面的學習源葫,我們知道诗越,每個受控組件,且不同的類型的受控組件它能控制的狀態(tài)只有那么一些:value息堂、checked嚷狞,
????????但是實際上一個組件的狀態(tài)遠遠不止這些,比如?input?的焦點荣堰、禁用床未、只讀?等,都是組件的狀態(tài)振坚,如果每一個狀態(tài)都通過上面的方式
????????來管理薇搁,就會特別的麻煩了。這個時候屡拨,我們就需要用其他方式來處理了:DOM
Refs?&?DOM
????????React.js?提供了多種方式來獲取?DOM?元素
????????????????-?回調(diào)?Refs
????????????????-?React.createRef()
ref?屬性
? ??????引用的意思只酥,通過?ref?來綁定組件(原生元素),對組件(元素)進行操作
????????無論是?回調(diào)?Refs?還是?React.createRef()呀狼,都需要通過一個屬性?ref?來進行設置
回調(diào)?Refs
????????這種方式裂允,我們在前面已經(jīng)使用過了
React.createRef()
????????該方法返回一個?ref?對象,在?jsx?通過?ref?屬性綁定該對象哥艇,該對象下的?current?屬性就指向了綁定的元素或組件對象
建議
????????-?盡量避免從?props?中派生?state
????????-?盡量使用?props绝编,避免使用?state