国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

拆解高頻面試題:你是如何理解單向數據流的?

開發 前端
狀態可以簡單的理解為數據,與 props 類似,但是 state 是私有的,并且完全受控于當前組件,因此組件狀態指的就是一個組件自己維護的數據。

[[422460]]

本文轉載自微信公眾號「勾勾的前端世界」,作者西嶺 。轉載本文請聯系勾勾的前端世界公眾號。

今天的主要內容是組件狀態。

狀態可以簡單的理解為數據,與 props 類似,但是 state 是私有的,并且完全受控于當前組件,因此組件狀態指的就是一個組件自己維護的數據。

上篇我們也提到了一個非常重要的點:數據驅動UI。意思也很簡單,就是頁面所展示的內容,完全是受狀態控制的,這也就是所謂 MVVM 的理念。UI 的改變,全部交給框架本身來做,我們只需要管理好 “數據(狀態)” 就可以了。

那么在 React 中,如何對狀態進行管理呢?這就是本章節的重點,也是整個 React 學習的重點:組件的狀態管理。

基本使用

state 的使用是非常簡單的,我們在類中聲明一個名為 state 的對象,對象中的元素就是當前組件所維護的狀態數據,獲取展示數據時,只需要在 jsx 中,使用 this.state.xx 的方式獲取就可以了。

  1. import React, { Component }from'react' 
  2.  
  3. exportclass States extends Component { 
  4.   // 聲明 state 對象 
  5.   state = { 
  6.     name:'xiling'
  7.     age:18 
  8.   } 
  9.  
  10.   render() { 
  11.     return ( 
  12.       <> 
  13.         <h2>state 狀態</h2> 
  14.         {/* 使用 this.state.xx 獲取數據 */} 
  15.         <p>{this.state.name}</p> 
  16.         <p>{this.state.age}</p> 
  17.       </> 
  18.     ) 
  19.   } 
  20.  
  21. exportdefault States 

前面我們說,state 數據是可以控制界面的,那么我們如何修改 state 從而讓界面發生改變呢?

修改狀態

想要修改 state 的值,最直觀的方式就是直接使用 this.state={} 的方式直接修改。我們設置一個按鈕,當點擊按鈕時,通過 this.state={} 發現是不起作用的,那應該怎么做呢?

React 給我們提供了專門的 this.setState({}) 方法,我們需要調用 this.setState({}) 方法將需要修改的數據傳入才能正確的修改 state 的值。

至于為什么,需要我們理解 React 數據流才能搞懂,這里就不再詳細介紹,你只需要記住這個規則就可以了。

  1. import React, { Component }from'react' 
  2.  
  3. exportclass States extends Component { 
  4.   // 聲明 state 對象 
  5.   state = { 
  6.     name:'xiling'
  7.     age:18 
  8.   } 
  9.  
  10.   // 箭頭函數 
  11.   changes = ()=>{ 
  12.     // console.log(22) 
  13.     // this.state.name = 'xiling' // 錯誤的使用方式 
  14.     this.setState({name:'西嶺'})  
  15.   } 
  16.  
  17.   render() { 
  18.     return ( 
  19.       <> 
  20.         <h2>state 狀態</h2> 
  21.         {/* 使用 this.state.xx 獲取數據 */} 
  22.         <p>{this.state.name}</p> 
  23.         <p>{this.state.age}</p> 
  24.         <buttononClick={this.changes}>改變state</button> 
  25.       </> 
  26.     ) 
  27.   } 
  28.  
  29. exportdefault States 

一旦 state 的值發生了改變,那么 JSX 中使用 state 的地方就會自動發生改變。

這里也需要注意一點,因為 setState 方法是類中的屬性(方法),我們需要使用 this 進行獲取,因此,事件綁定的處理函數就需要使用箭頭函數來固定 this 的指向,一定不要使用普通的函數 (類方法) 聲明,否則會因為找不到方法而直接報錯。

自頂向下的單向數據流

關于數據流的問題,是面試中高頻次出現的典型題目,一般情況下面試官會直接問:“你是如何理解單向數據流的 ? ”。

注意,這不是一個單獨的個體問題,而是數據流問題的綜合體。解答這個問題,你需要解釋:

什么是數據流?

為什么是自頂向下的?

單向數據流是什么意思?

為什么是單向的?不能是雙向的數據流嘛?

單向數據流有什么作用呢?

面試題一旦拆開,你會發現面試官問出來的幾乎每一個詞都需要解釋。寶兒,這個問題,真不簡單啊!

那么,我應該怎么解答呢?

說實話,并沒有標準答案,因為數據流這個問題,涉及到了框架本身的設計理念,需要你對框架的設計有深入理解,你要站在框架作者的角度看待問題;但是,對于初學者來說,這個問題顯然超綱了。

完犢子,那么重要,我又學不了是嘛?不是,你需要學很多遍,這只是第一遍。

開始之前,我們先來看一段普通的 JS 代碼:

  1. var datas = { 
  2.   name:'lisi'
  3.   age:18 
  4.  
  5. var l1 = datas 
  6. var l2 = l1 
  7. var l3 = l2 
  8.  
  9. l1.age=20 
  10. console.log(l1.age,l2.age,l3.age) // 20 20 20 
  11.  
  12. l3.age=26 
  13. console.log(l1.age,l2.age,l3.age) // 26 26 26 

你會發現,無論我們是修改那個變量的 age 屬性,其他數據都會跟著改變,原因也很簡單,大家都是共享一個內存數據的。

但是,賦值的前后邏輯上,我們可以將 L3 節點看作孫子,L2 節點看做父親,L1 節點看做爺爺。

任意一個節點的數據改變之后,所有節點的數據都會跟著改變,我們就可以把這種現象看做是數據在“變量節點”上的流動。

但是,這樣的數據流動,是雙向的,拿 L2這個節點來說,只要數據改變,上層的 L1 節點和下層的 L3 節點都會跟著改變。

雖然這個例子并不恰當,但是回到 React 組件中,道理是一樣的,所謂數據的流動就是數據在組件間的傳遞。前面我們用了很大的篇幅講解的組件間的值傳遞,其實就是在講數據流這個概念的具體用法。

那么,我們在數據流前面加上一個“單向”的定語,叫 “單向數據流” 是什么意思呢?其實現在你理解起來很簡單,就是數據在某個節點被改變后,只會影響一個方向上的其他節點。

那所謂的自頂向下又怎么解釋呢?

更簡單了,就是數據只會影響到下一個層級的節點,不會影響上一個層級的節點。用上面的例子解釋,就是如果 L2 數據改變,只會影響到 L3,不會影響到 L1 或者其他節點。

這就是 “自頂向下的單向數據流”。那么我們在 React 框架中,就可以明確定義單向數據流:規范數據的流向,數據由外層組件向內層組件進行傳遞和更新。

那么,在具體的代碼實現中,是怎么體現出來的呢?翠花,上代碼:

圖有點看不清,接下來,我們看具體代碼的演示:

  1. // ========== App============ 
  2. import React, { Component } from'react' 
  3. import C1 from'./C1' 
  4. exportclass App extends Component { 
  5.   state = { 
  6.     name:"xiling" 
  7.   } 
  8.   render() { 
  9.     return ( 
  10.       <div> 
  11.         <h1>App</h1> 
  12.         <p> APP 中的值: 
  13.           <bstyle={{ color:"red" }}> 
  14.             {this.state.name
  15.           </b> 
  16.         </p> 
  17.         <C1toC1={this.state.name}></C1> 
  18.       </div> 
  19.     ) 
  20.   } 
  21.  
  22. exportdefault App 
  23.  
  24.  
  25. // ========== C1 ============ 
  26. import React, { Component } from'react' 
  27. import C2 from'./C2' 
  28. exportclass C1 extends Component { 
  29.  
  30.  
  31.   render() { 
  32.     return ( 
  33.       <div> 
  34.         <h2>C1</h2> 
  35.         <p>傳入C1 的值(App傳入): 
  36.           <bstyle={{ color:"red" }}> 
  37.             {this.props.toC1} 
  38.           </b> 
  39.         </p> 
  40.         <C2toC2={this.props.toC1}></C2> 
  41.       </div> 
  42.     ) 
  43.   } 
  44.  
  45. exportdefault C1 
  46.  
  47.  
  48. // ========== C2 ============ 
  49. import React, { Component } from'react' 
  50. import C3 from'./C3' 
  51. exportclass C2 extends Component { 
  52.  
  53.   state = { 
  54.     name:this.props.toC2 
  55.   } 
  56.  
  57.   changes = () => { 
  58.     this.setState({ 
  59.       name:Math.random() 
  60.     }) 
  61.   } 
  62.  
  63.   render() { 
  64.     return ( 
  65.       <div> 
  66.         <h2>C2</h2> 
  67.         <buttononClick={() => { this.changes() }}> 
  68.           修改 
  69.         </button> 
  70.         <p>傳入C2 的值(C1傳入): 
  71.           <bstyle={{ color:"red" }}> 
  72.             {this.state.name
  73.           </b> 
  74.         </p> 
  75.         <C3toC3={this.state.name}></C3> 
  76.       </div> 
  77.     ) 
  78.  
  79.   } 
  80.  
  81. exportdefault C2 
  82.  
  83.  
  84. // ========== C3 ============ 
  85. import React, { Component } from'react' 
  86.  
  87. exportclass C3 extends Component { 
  88.   render() { 
  89.     return ( 
  90.       <div> 
  91.         <h2>C3</h2> 
  92.         傳入C3 的值(C2傳入): 
  93.         <bstyle={{ color:"red" }}> 
  94.           {this.props.toC3} 
  95.         </b> 
  96.       </div> 
  97.     ) 
  98.   } 
  99.  
  100. exportdefault C3 

最后,我們再來解釋,為什么?有什么用?

其實這才是這個問題的核心,不同的技術理解,就會有不同的角度解釋,我這里僅一家之言,你且聽聽罷。

我們設想這樣的情景:

父組件的數據通過props傳遞給子組件,而子組件里更新了 props,導致父組件和其他關聯組件的數據更新,UI 渲染也會隨數據而更新。

毫無疑問,這是會導致嚴重的數據紊亂和不可控。

因此絕大多數框架在這方面做了處理。而 React 在這方面的處理,就是直接規定了 Props 為只讀的,而不是可更改的。這也就是我們前面看到的數據更新不能直接通過 this.state 操作,想要更新,就需要通過 React 提供的專門的 this.setState() 方法來做。

單向數據流其實就是一種框架本身對數據流向的限制。

 

暫時先說這些吧,等我們學的越多,經驗越豐富,對它的理解也就會越深刻,看待它的角度也就越全面。

 

責任編輯:武曉燕 來源: 勾勾的前端世界
相關推薦

2021-02-23 12:43:39

Redis面試題緩存

2019-11-26 10:30:11

CSS前端面試題

2021-01-22 11:58:30

MySQL數據庫開發

2019-12-26 09:52:33

Redis集群線程

2021-08-05 05:04:50

熱部署模型字節

2022-04-15 09:23:29

Kubernetes面試題

2022-08-22 18:57:29

React前端面試

2023-11-15 07:54:03

HashMap數據結構

2020-08-31 12:20:07

Python面試題代碼

2022-07-26 09:03:50

冪等性數據狀態機

2021-11-02 10:10:38

面試元素語言

2020-03-03 17:47:07

UDP TCP面試題

2023-10-20 15:58:27

Python刪除指定字符

2021-12-08 11:18:21

Spring Bean面試題生命周期

2023-11-27 07:47:14

2014-09-19 11:17:48

面試題

2020-06-04 14:40:40

面試題Vue前端

2021-03-12 13:57:13

零拷貝技術

2019-12-19 14:38:08

Flink SQL數據流Join

2025-03-20 07:54:57

點贊
收藏

51CTO技術棧公眾號

亚洲大片在线观看| 亚洲国产成人精品无码区99| 欧美国产精品久久| 涩涩视频在线观看免费| 亚洲天堂网站在线观看视频| 青青草视频一区| 蜜芽视频在线观看| 99九九视频| 欧美日韩高清在线| 久本草在线中文字幕亚洲| 羞羞小视频视频| 欧美寡妇偷汉性猛交| xxxxxxxxx欧美| 久久成人精品| 伦理av在线| 成人在线国产视频| 欧美丰满片xxx777| 亚洲精品成人在线| 欧美/亚洲一区| 国产三线在线| a在线视频观看| 日韩av手机在线| 精品视频一区二区不卡| 久久国产综合精品| 66精品视频在线观看| 最新四虎影在线在永久观看www| 国产富婆一区二区三区| 亚洲电影免费观看高清| 99精品欧美一区| 国产不卡av一区二区| 日本不卡不卡| 日韩精品xxxx| 成人黄色免费看| 日韩成人久久久| 亚洲日本va午夜在线影院| 亚洲国产一区二区三区高清| 国产另类xxxxhd高清| 97午夜影院| 韩国精品一区二区三区六区色诱| 精品无人区乱码1区2区3区在线| 国产三级欧美三级| 午夜日本精品| 国产精品天堂蜜av在线播放 | 日韩中文欧美在线| 日韩一级特黄| 日韩资源在线| 青草全福视在线| 国产精品女主播| 亚洲精品久久久久久下一站| 国产精品久久久久永久免费观看 | 欧美成人精品一区二区男人看| 日韩极品视频在线观看 | 成人频在线观看| 亚洲不卡中文字幕| 2019中文字幕免费视频| 欧美一二三四在线| 国产精品私人影院| 老**午夜毛片一区二区三区| 最新国产一区二区| 国产精品刘玥久久一区| 色婷五月综激情亚洲综合| 久久精品人人做人人爽电影| 久久久久久久久久亚洲| 日韩一二在线观看| 亚洲综合在线第一页| 国产成人免费在线观看不卡| 91超碰成人| 精品久久亚洲| 中文字幕在线三区| 美女的尿口免费视频| 日本精品免费视频| 91探花福利精品国产自产在线| 日韩中文在线中文网在线观看| 在线观看日韩电影| 97se亚洲国产综合自在线观| 亚洲乱码久久| 自拍视频一区| 欧美高清影院| 美女精品视频| 黄网在线观看| 嫩模私拍啪啪| 国产乱子夫妻xx黑人xyx真爽| 国产精品 日韩| 欧美亚洲激情在线| 在线观看日韩专区| 欧美一区二区三区系列电影| 一区二区三区四区不卡视频| 不卡一二三区首页| 免费一区二区视频| 欧美成人一区二免费视频软件| 欧美在线在线| 欧美成a人片在线观看久| 77777影视视频在线观看| 黄色一级影院| 欧美 激情 在线| 中文精品一区二区三区| 国产乱码精品一区二区三区卡 | 国产传媒一区在线| 午夜在线视频观看日韩17c| 性人久久久久| 九九九精品视频| 色戒汤唯在线| 国产露出视频在线观看| 成人在线看片网站| 狠狠躁狠狠躁视频专区| 国产www免费| www.午夜色| 久久综合九九| 国产成人av一区二区三区| 国产综合在线视频| 最新国产精品拍自在线播放| 亚洲国产欧美一区二区丝袜黑人 | 久久蜜桃香蕉精品一区二区三区| 日韩精品欧美成人高清一区二区| 色婷婷色综合| 日韩理论电影中文字幕| 久久在线观看| 亚洲人成777| 蜜桃成人精品| 韩国成人漫画| 牛牛精品在线| 99自拍视频在线观看| 国产精品一区二区婷婷| 亚洲高清福利| 91精品国产一区二区三密臀| 色成人亚洲网| jizz18女人| 精品999在线| 国产理论在线播放| 欧美色图另类小说| 欧美日韩不卡在线视频| 亚洲激情免费视频| 视色,视色影院,视色影库,视色网| 亚洲精品成人a8198a| 亚洲 日韩 国产第一区| 亚洲国产成人不卡| 欧美一区二区三区在线免费观看| 国产精品国产精品| 官网99热精品| 精品欧美一区二区精品久久| 国产亚洲一区二区三区在线播放| 动漫一区二区在线| 一本一本久久a久久精品综合小说| 大胆亚洲人体视频| 成人性生交大片免费看中文网站| 岛国精品一区二区| 99国产精品久久久久久久久久久| 9l国产精品久久久久麻豆| av动漫一区二区| 国产午夜亚洲精品午夜鲁丝片| 91啪亚洲精品| 国产欧美日本一区二区三区| 亚洲欧美日韩在线播放| 亚洲欧美日韩综合aⅴ视频| 亚洲欧美日韩国产另类专区| 国产传媒欧美日韩成人| 欧美国产视频一区二区| 男女激情免费视频| 人狥杂交一区欧美二区| 日韩黄色片在线观看| 久久久久久久久久久电影| 日韩电视剧免费观看网站| 久久国产精品久久| 神马久久午夜| 蜜桃一区二区三区在线观看| 538prom精品视频线放| 久久综合88中文色鬼| 欧美一区二区三区精美影视| 男人的天堂av高清在线| 狠狠操一区二区三区| 日本我和搜子同居的日子高清在线| 日本免费高清视频| 亚洲kkk444kkk在线观看| 国产在线视频资源| 牛牛电影国产一区二区| 黄色成人小视频| 亚洲另类av| 亚洲人成免费| 国产高清无密码一区二区三区| 国产日韩综合av| 欧美日韩黄色大片| 日韩精品一区在线观看| 一本色道久久88综合亚洲精品ⅰ| 欧美激情视频一区二区| 国产精品视频一区二区高潮| 国产综合欧美在线看| 26uuu成人| 99热一区二区| 午夜视频在线看| 怡红院成人在线| 国产精品一区高清| 日韩和欧美一区二区| 久久综合成人精品亚洲另类欧美 | 成在在线免费视频| 国产精品黄色av| 俺去亚洲欧洲欧美日韩| 久久躁狠狠躁夜夜爽| 国产精品白丝jk喷水视频一区| 日韩电影天堂视频一区二区| 很黄很污的网站|