React筆記(核心概念部分)

核心概念

1. JSX

  • JSX是javascript的語法擴展,讓我們可以在JS中編寫常規html代碼,在JSX中可以在大括號{}內放置任何有效的javascript表達式。
  • JSX也是一個表達式,可以在iffor循環代碼塊中使用JSX。
  • 通過引號將屬性值指定為字符串字面量,使用大括號將屬性值指定為j s表達式。
  • React DOM 使用 camelCase(小駝峰命名)來定義屬性的名稱,而不使用 HTML 屬性名稱的命名約定。例如在JSX中class變為className。
  const name = 'Jade';
  const element = <div>
    <h1 className='weclome'>Hello, {name}</h1>
    <input type='text' defaultValue={name} />
  </div>;

  ReactDOM.render(
     element,
     document.getElementById('root')
  );

2. props

  • 當 React 元素為用戶自定義組件時,它會將 JSX 所接收的屬性以及子組件轉換為單個對象傳遞給組件,這個對象被稱之為 “props”。
  • 組件無論是使用函數聲明還是class聲明,都不能修改自身的 props,props為只讀。

3. State

  • state是組件私有化,且完全受控于當前組件,簡單說,完全props,state在組件內可以隨意修改。定義state應該在class構造函數constructor中,state可以傳遞給子組件,數據是向下流動。
  • 關于修改state,應該使用setState(),而不是直接賦值。
    • this.setState({name: 'Jade'}); //correct
    • this.state.name = 'jade'; // wrong
  • setState()為異步,多個setState()會合并為一個調用。所以最好不要依賴它們的值來更新下一個狀態。
  • 關于異步的問題,可以讓setState()接受一個函數來解決,該函數接受兩個參數,用上一個 state 作為第一個參數,將此次更新被應用時的 props 做為第二個參數。

4. 事件處理

  • 不能通過return false;阻止默認行為,只能是e.preventDefault()

  • JSX中回調問題,事件回調必須綁定this,不然回調中thisundefined。原因在于js函數工作原理:

    const obj = {
        name: 'Jade',
        say: function () {
            console.log(this);
        }
    };
    const test = obj.say;
    
    obj.say(); // {name: "Jade", say: ?}
    test(); // undefined
    

    在js中,傳遞一個函數名給一個變量,然后在變量后加上()調用這個方法,此時方法內部的this的指向就丟失。在React中,OnClick其實就是一個中間變量,所以this會丟失。

  • 關于事件回調中this丟失的解決辦法有以下:

    • 使用bind綁定this,<a onClick={this.click.bind(this)}>點擊</a>。
    • 使用箭頭函數定義事件回調 this.click = () => { //do something }
    • 使用箭頭函數調用事件回調<a onClick={() => this.click()}>點擊</a>
  • 事件傳遞參數的方法有兩種,分別是通過箭頭函數和bind,事件對象e會被視為第二個參數,不同的是,箭頭函數的方式必須顯式的傳入e,bind則不需要,如下:

    • <a onClick={(e) => this.click(id, e)}>點擊</a>

    • <a onClick={this.click.bind(this, id)}>點擊</a>

5. 表單

  • 受控組件:表單中存在一個input,其value值必須是我們設置在constructor構造函數中的state的值,通過onChange事件改變state中的值,最終形成一個循環的回路影響。
  • 非受控組件:非受控也就意味著我可以不需要設置它的state屬性,而通過ref來操作真實的DOM。

6. 組件之間通訊

  • 父子通訊:

    • // Context 可以讓我們無須明確地傳遍每一個組件,就能將值深入傳遞進組件樹。
      // 使用場景: 嵌套多層的組件,且每層組件可能都會用到某個變量
      // 缺點:導致組件的復用性降低
      const NameContext = React.createContext('Jade'); // 默認值‘Jade’
      class App extends React.Component {
        render() {
          return (
            // 使用Provider,將變量傳遞給下面的所有組件
              <NameContext.provider value='Jadeee'>
              <PageHeader />
            </NameContext>
          )
        }
      }
      
      class PageHeader extends React.Component {
        render() {
          // 中組件不用在手動傳遞了
          return <UserName />
        }
      }
        
      class UserName extends React.Component {
        
        static contentType = NameContext;
        render() {
          return <p> {this.context} </P>
        }
      }
      
    • // 父子通訊主要通過props傳遞參數,數據自上而下流動,實現父子通訊
      class ChildrenComponent extends React.Component {
          constructor(props) {
              super(props);
          }
      
          render() {
              return (
                  {/* 接受從父組件傳遞而來的title */}
                  <h1> {this.props.title} </h1>
              )
          }
      }
      
      class ParentComponent extends React.Component {
          constructor(props) {
              super(props);
              this.state = {
                title: '標題'
              }
          }
      
          render() {
              return (
                  {/* 將this.state.title傳遞給子組件 */}
                   <ChildrenComponent title={this.state.title} />
              )
          }
      }
      
  • 子父通訊:

    • class ChildrenComponent extends React.Component {
          constructor(props) {
              super(props);
              this.state = {
                name: 'children component'
              }
          }
      
          clickBtn() {
              // 調用父組件方法并將參數傳遞給父組件
              this.props.onClickChildren(this.state.name);
          }
      
          render() {
              return (
                  <button type="button" onClick={this.clickBtn.bind(this)}>
                      Click Me!
                  </button>
              )
          }
      }
      
      class ParentComponent extends React.Component {
          constructor(props) {
              super(props);
          }
      
          // 子組件調用,val參數為子組件傳遞過來
          onClickChildren(val) {
              console.log(val); // children component
          }
      
          render() {
              return (
                  <div>
                          {/* 將onClickChildren()方法作為props傳遞給子組件 */}
                       <ChildrenComponent 
                              onClickChildren={this.onClickChildren.bind(this)} />
                  </div>
              )
          }
      }
      
  • 子子通訊:

    • eventBus
    • Redux
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,406評論 6 538
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,034評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 177,413評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,449評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,165評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,559評論 1 325
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,606評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,781評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,327評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,084評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,278評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,849評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,495評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,927評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,172評論 1 291
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,010評論 3 396
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,241評論 2 375