React知識點小結(jié)

react Dom與JSX關(guān)系

react頁面渲染,由三部分構(gòu)成:state 數(shù)據(jù) + JSX模版 => 真實Dom(顯示)

正常react渲染頁面的步驟
  1. 頁面首次加載:state 數(shù)據(jù) + JSX模版 => 真實dom顯示
  2. 頁面改變:state 數(shù)據(jù)改變
  3. state + JSX模版重新生成 Dom 替換原始Dom 顯示
react改進方式一:
  1. 頁面首次加載:state 數(shù)據(jù) + JSX模版 => 真實dom顯示
  2. 頁面改變:state 數(shù)據(jù)改變
  3. state + JSX模版重新生成新的Dom 但是不直接替換原始Dom 顯示
  4. 將新的Dom和老的Dom做比對,找出差異
  5. 將新的Dom中修改的部分 替換到老的Dom中
react改進方式二(也是目前react實現(xiàn)的方式):
  1. 頁面首次加載:state 數(shù)據(jù) + JSX模版 => 生成虛擬Dom(JS對象) => 生成真實dom顯示
//虛擬Dom
['div',{id:'id1'},['span',{},'hello']]
//真實Dom
<div>
  <span>hello2</span>
</div>
  1. 頁面改變:state 數(shù)據(jù)改變
  2. 生成新的虛擬Dom,(即一個JS對象,用它來翻譯成真實Dom)
//虛擬Dom
['div',{id:'id1'},['span',{},'hello2']]
  1. 比對兩個虛擬Dom(兩個JS對象比對),更改虛擬 Dom值
['div',{id:'id1'},['span',{},'hello2']]
  1. 由更改后的虛擬Dom重新生成 真實Dom顯示
<div>
  <span>hello2</span>
</div>
改進方式二的優(yōu)勢:
  1. 操作都是JS對象,減少來對Dom的創(chuàng)建和比對。JS對象在js中比較替換是直接操控JS自身對象(Diff 算法),性能消耗比較小,若是 生成新的Dom對象及對Dom對象的比對,需要操作系統(tǒng)的application的方法,性能消耗大。
  2. 若兩次setState時間較短,react會對比兩次JS對象,最后只重新生成一次Dom

Diff 算法 -- 層層比對,父級相同則比對child,若child不同,直接替換,后續(xù)child不進行比對了。算法簡單,因此比對速度快。因此在循環(huán)中key,盡量別使用index,這樣就會使每次的循環(huán)都不能復用之前的index對象。引入Key值的原因就是為了提高虛擬Dom比對性能

ref 使用

// 1. 直接賦值
<input ref={(inputValue)=>{this.inputValue = inputValue}}> </input>
//使用:
console.log(this.inputValue.value);
 // 2. 
<input ref="inputValue"> </input>
//使用:
console.log(this.refs.inputValue.value);

ref的使用可以由以上兩種方法, 但是react并不推薦大量使用ref,建議用數(shù)據(jù)驅(qū)動的方式操作Dom。
例如:利用ref的方式獲取dom,在和setState同時使用會出問題:因為SetState是異步的,直接通過ref獲取Dom節(jié)點從而取得的值可能不是最新的值。解決方案:setState后第二個參數(shù)里執(zhí)行:

this.setState({
                dataList: tempList,
            }, ()=> {
                console.log(this.refs.inputValue.value);
            })

react 路由

  • 路由分為三種:靜態(tài)路由:urlPath不同跳轉(zhuǎn)不同頁面;動態(tài)路由:頁面之間跳轉(zhuǎn)定義參數(shù)類型; get路由:頁面之間跳轉(zhuǎn),和get請求一樣方便傳多個參數(shù),一般用 cnpm install url --save 使用URL庫進行參數(shù)解析, 本文樣例Demo中有使用例子
路由類型 路由注冊 路由跳轉(zhuǎn) 路由接收
靜態(tài)路由 <Route exact path="/" component={RouterHome} /> <Link to="/">Home</Link> -
動態(tài)路由 <Route path="/RouterContent/:myParams" component={RouteContent} /> <Link to={`/RouterContent/${value}`}> {value} </Link> this.props.match.params.myParams
get路由 <Route path="/RouterContent" component={RouteContent} /> <Link to={`/RouterContent?aid=${value}`}>{value}</Link> this.props.location.search

ant Design 使用

css 入門補充小知識

  1. ID選擇符,調(diào)用的時候需要 <p id='bold'> </p>
// csss:
p#bold {
    color: red;
}
//js:
<p id='bold'>
          這個段落應該是粗體
</p>
  1. 群選擇符
/*群選擇符, 表示同時對逗號分割對標簽操作*/
p,h1,h2 {
    text-align: center;
}
  • inherit: 繼承父級的上層屬性
  • background-attachment: fixed 背景圖片是否跟著網(wǎng)頁滑動
  • font-style : 是否斜體,oblique italic normal
  • font-weight: 字體粗細,font-size:字體大小
  • line-height: 行與行間距。
  • font-variant: 全部大小寫,但是首字母的大寫會更大些
  • text-indent: 文本首行縮進,px或者%
  • text-align: 文本對齊
  • text-decoration: 上滑線,下劃線,刪除線
  • text-transform: 首字母大寫,變大寫,變小寫
  • :link: 設(shè)置未訪問鏈接屬性,:visited 設(shè)置訪問過鏈接屬性,:active 鼠標點擊與釋放,:hover 鼠標懸停時
  • float: left,right // 向哪個方向浮動
  • display:
    display: flex; //將對象作為彈性伸縮盒顯示
    display: block;//block是一塊狀元素的方式顯示
  • position:
    static(靜態(tài)定位): 默認值。沒有定位,元素出現(xiàn)在正常的流中(忽略 top, bottom, left, right 或者 z-index 聲明)
    relative(相對定位):生成相對定位的元素,通過top,bottom,left,right的設(shè)置相對于其正常(原先本身)位置進行定位。可通過z-index進行層次分級。
    absolute(絕對定位):生成絕對定位的元素,相對于 static 定位以外的第一個父元素進行定位。元素的位置通過 "left", "top", "right" 以及 "bottom" 屬性進行規(guī)定。可通過z-index進行層次分級。
    fixed(固定定位):生成絕對定位的元素,相對于瀏覽器窗口進行定位。元素的位置通過 "left", "top", "right" 以及 "bottom" 屬性進行規(guī)定??赏ㄟ^z-index進行層次分級。
  • display: flex , Flex 布局以后,子元素的float、clear和vertical-align屬性將失效 。更多flex布局參考 阮一峰flex布局教程
flex容器(父組件)屬性名 枚舉值 備注
flex-direction row、row-reverse、column 、column-reverse 布局方向: ??、 ?? 、??、??
flex-wrap nowrap、wrap、wrap-reverse 不換行、換行(第一行在最上方)、換行(第一行在最下方)
flex-flow <flex-direction> direction和wrap,都可以設(shè)置
justify-content flex-start、flex-end、center、space-between、space-around 居左、居右、居中、兩邊對齊、均分間隔相等
align-items flex-start、flex-end、center、baseline、stretch 項目的第一行文字的基線對齊 、 默認值
align-content flex-start、flex-end、center、space-between 、space-around 定義了多根軸線的對齊方式。如果項目只有一根軸線,該屬性不起作用
flex項目(子組件)屬性名 枚舉值 備注
order <integer> 項目排列順序。從0開始數(shù)字越小越靠前
flex-grow <number> 放大比例,默認為0 不放大
flex-shrink <number> 縮小比例,默認為1,若空間不足,所有項目都將縮小
flex-basis <length> 跟width、height一樣,占據(jù)固定空間
flex <flex-grow, flex-shrink> || <flex-basis>都可設(shè)置 flex:分數(shù)百分數(shù)多個數(shù)
align-self auto、flex-start、flex-end、center、baseline、stretch 單個子組件和其他子組件不同對齊方式,覆蓋align-items:--_-
css 沖突
  • 更具體的,聽從最具體的樣式, id > 類別 > 元素
  • 兩個層級樣式表,遵循離內(nèi)容比較近的樣式
  • !important ,申明指示的位置優(yōu)先,幫助診斷是否沖突
  • 選擇符,
  • 元素

本文樣例Demo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容