React基礎(五):事件,狀態

首先,我們要說的就是組件的事件。

事件我們都懂,就是點擊一下,鼠標移入,鍵盤按一下,這些都算事件。那麼在 React 裏面,組件的事件要怎麼用?

首先,我們先準備一個組件:

然後我們希望在點擊按鈕的時候,a 能夠自加一,那麼應該怎麼給它加事件?

我們先用原生的方法加一個 onclick 看看效果。

可以看到,控制檯報錯了,它說,你想用的是不是 onClick?

實際上來說,全小寫的事件是原生的事件,這個我們都懂。

那麼爲了跟原生事件有所區分,所以 React 的事件,它的首字母是大寫的,也就是 onClick。

那麼我們改過之後,它仍然是錯的,說 onClick 需要的是一個 function,但是你給我的卻是一個字符串。

所以,React 這裏它不像原生事件,原生事件在這裏給字符串,function 其實都行。

而在這裏,必須得給個 function。

那麼我們如果 onClick=" function () { } " 這麼寫的話,其實它還是一個字符串。因爲我們用的是引號。

所以我們得用花括號 { }。

可以看到,現在它就不會有問題了。

當然,我們都知道,一般我們都很少去加行間事件,同樣的,在 React 裏面,我們也極少把這個函數直接寫在裏面。

所以我們會選擇把它提到外面去。

可以看到這樣寫是沒有問題的,那麼下面我們就來寫,點擊按鈕,a++

當我們點擊按鈕的時候,a 不僅沒自加,還報了一堆錯。它說,a 這個屬性是不存在的。

這裏需要注意的是,在原生 js 裏面,this 是一個很脆弱的東西。基本上來說,你隨便把它給一個事件,或者給個定時器啥的,它裏面的 this 就亂了。同樣的,其實在 React 裏面 this 一樣很脆弱。

我們在 fn 裏面寫的 this,按理來說,應該是 Cmp1 組件的實例。那麼實際上呢?

我們可以打印出來看下:

其實這個 fn 本來是一個方法,它裏面的 this 也應該是實例,這些都沒錯。但是你把它給事件了。那這個 this 自然也就變了。

原生如此,React 也自然如此。那應該怎麼辦?

我們可以用 bind,傳到 bind(this) 裏面的 this,其實和 render 裏面的 this 是一致的。

而 render 它並沒有作爲一個事件註冊給別人,所以它裏面的 this 還是對的,那麼綁它的 this 就沒問題了。

所以,在所有 React 事件裏面的 this,我們都需要用 bind 來綁住它。

然後我們點擊了很多次按鈕,發現頁面根本沒有變化,但是 a 的值確實是已經變了。那爲什麼會這樣?

這個時候,其實涉及到一個極其重要的事情,那就是你現在用的是一個普通的屬性 this.a,你讓一個類的普通屬性去加加減減,其實是沒用的。如果你真的希望 a 變了之後,頁面裏的東西也能跟着變,你必須得讓這個組件重新渲染纔行。

也就是說,這個組件只有在重新渲染的時候,它纔會把真正新 a 的值給輸出出來。如果不重新渲染,那它一定保留上一次渲染的結果。

那麼現在的問題就變成了,this.a 這個屬性變了,爲什麼不重新渲染?

其實我們可以反過來想,爲什麼要重新渲染?屬性多了去了,難道每一個都替你看着嗎?並不是的。

實際上來說,我們在 constructor 裏面就不應該用屬性,而是用狀態。

如果你這個組件想重新渲染,必須得修改狀態。因爲狀態修改的時候,這個組件會自動的重新渲染。

所以,接下來,我們就來了解下,什麼是狀態。

 

React 裏面最強的地方就在於組件,而組件當中的精華就在於它的狀態。

所謂狀態,簡單來說,就是這個組件可以變的那些部分。

其實它也是 this 身上的一個屬性,就叫 state。我們可以在 constructor 裏面對它進行一個初始化。

然後對應的,this.a 就需要換成 this.state.a 了。

但是我們會發現,點了按鈕也不行。

所以,普通的修改狀態不行,必須得用 this.setState 來設置狀態。其實就是 setState 在調用 render。

this.setState 它裏面需要一個 json,因爲你可以同時修改多個狀態。

這次就沒問題了,一開始的時候初始渲染一次,然後每點擊一次按鈕,它就重新渲染一次。

所以,狀態最大的特點就是:一旦它發生變化,就會導致整個組件重新渲染。我們如果有什麼東西變了,是希望直接體現在頁面當中,讓用戶能看見的,那你必須得把它放到狀態裏面。

狀態這裏還需要注意的一點就是:狀態的初始化只能放在 constructor 中完成。

 

屬性和狀態,這兩個東西比較容易混淆,那麼它們有什麼不同呢?我們一起來看看。

比如,現在我們給 Cmp1 傳了一個屬性 a = 12 進去:

可以看到,當點擊按鈕的時候,立馬就報錯了,說你不能給一個只讀的屬性 a 賦值。

注意,這裏是 React 裏面極其重要的一個地方:props 是隻讀的,props 它內部所有的東西只能讀取,不能寫入。

如果你希望某個東西變,那你就只能往狀態裏面放。

所以:屬性是隻讀的,而狀態是可變的。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章