React筆記(核心概念部分)

核心概念

1. JSX

  • JSX是javascript的語(yǔ)法擴(kuò)展硕糊,讓我們可以在JS中編寫常規(guī)html代碼庵寞,在JSX中可以在大括號(hào){}內(nèi)放置任何有效的javascript表達(dá)式湃密。
  • JSX也是一個(gè)表達(dá)式占调,可以在iffor循環(huán)代碼塊中使用JSX正什。
  • 通過(guò)引號(hào)將屬性值指定為字符串字面量蝌焚,使用大括號(hào)將屬性值指定為j s表達(dá)式裹唆。
  • React DOM 使用 camelCase(小駝峰命名)來(lái)定義屬性的名稱,而不使用 HTML 屬性名稱的命名約定只洒。例如在JSX中class變?yōu)閏lassName品腹。
  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

  • 當(dāng) React 元素為用戶自定義組件時(shí),它會(huì)將 JSX 所接收的屬性以及子組件轉(zhuǎn)換為單個(gè)對(duì)象傳遞給組件红碑,這個(gè)對(duì)象被稱之為 “props”舞吭。
  • 組件無(wú)論是使用函數(shù)聲明還是class聲明泡垃,都不能修改自身的 props,props為只讀羡鸥。

3. State

  • state是組件私有化蔑穴,且完全受控于當(dāng)前組件,簡(jiǎn)單說(shuō)惧浴,完全props存和,state在組件內(nèi)可以隨意修改。定義state應(yīng)該在class構(gòu)造函數(shù)constructor中衷旅,state可以傳遞給子組件捐腿,數(shù)據(jù)是向下流動(dòng)。
  • 關(guān)于修改state柿顶,應(yīng)該使用setState()茄袖,而不是直接賦值。
    • this.setState({name: 'Jade'}); //correct
    • this.state.name = 'jade'; // wrong
  • setState()為異步嘁锯,多個(gè)setState()會(huì)合并為一個(gè)調(diào)用宪祥。所以最好不要依賴它們的值來(lái)更新下一個(gè)狀態(tài)。
  • 關(guān)于異步的問(wèn)題家乘,可以讓setState()接受一個(gè)函數(shù)來(lái)解決蝗羊,該函數(shù)接受兩個(gè)參數(shù),用上一個(gè) state 作為第一個(gè)參數(shù)仁锯,將此次更新被應(yīng)用時(shí)的 props 做為第二個(gè)參數(shù)耀找。

4. 事件處理

  • 不能通過(guò)return false;阻止默認(rèn)行為,只能是e.preventDefault()业崖。

  • JSX中回調(diào)問(wèn)題野芒,事件回調(diào)必須綁定this,不然回調(diào)中thisundefined腻要。原因在于js函數(shù)工作原理:

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

    在js中复罐,傳遞一個(gè)函數(shù)名給一個(gè)變量涝登,然后在變量后加上()調(diào)用這個(gè)方法雄家,此時(shí)方法內(nèi)部的this的指向就丟失。在React中胀滚,OnClick其實(shí)就是一個(gè)中間變量趟济,所以this會(huì)丟失。

  • 關(guān)于事件回調(diào)中this丟失的解決辦法有以下:

    • 使用bind綁定this咽笼,<a onClick={this.click.bind(this)}>點(diǎn)擊</a>顷编。
    • 使用箭頭函數(shù)定義事件回調(diào) this.click = () => { //do something }
    • 使用箭頭函數(shù)調(diào)用事件回調(diào)<a onClick={() => this.click()}>點(diǎn)擊</a>
  • 事件傳遞參數(shù)的方法有兩種,分別是通過(guò)箭頭函數(shù)和bind剑刑,事件對(duì)象e會(huì)被視為第二個(gè)參數(shù)媳纬,不同的是双肤,箭頭函數(shù)的方式必須顯式的傳入e,bind則不需要钮惠,如下:

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

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

5. 表單

  • 受控組件:表單中存在一個(gè)input茅糜,其value值必須是我們?cè)O(shè)置在constructor構(gòu)造函數(shù)中的state的值,通過(guò)onChange事件改變state中的值素挽,最終形成一個(gè)循環(huán)的回路影響蔑赘。
  • 非受控組件:非受控也就意味著我可以不需要設(shè)置它的state屬性,而通過(guò)ref來(lái)操作真實(shí)的DOM预明。

6. 組件之間通訊

  • 父子通訊:

    • // Context 可以讓我們無(wú)須明確地傳遍每一個(gè)組件缩赛,就能將值深入傳遞進(jìn)組件樹。
      // 使用場(chǎng)景: 嵌套多層的組件撰糠,且每層組件可能都會(huì)用到某個(gè)變量
      // 缺點(diǎn):導(dǎo)致組件的復(fù)用性降低
      const NameContext = React.createContext('Jade'); // 默認(rèn)值‘Jade’
      class App extends React.Component {
        render() {
          return (
            // 使用Provider酥馍,將變量傳遞給下面的所有組件
              <NameContext.provider value='Jadeee'>
              <PageHeader />
            </NameContext>
          )
        }
      }
      
      class PageHeader extends React.Component {
        render() {
          // 中組件不用在手動(dòng)傳遞了
          return <UserName />
        }
      }
        
      class UserName extends React.Component {
        
        static contentType = NameContext;
        render() {
          return <p> {this.context} </P>
        }
      }
      
    • // 父子通訊主要通過(guò)props傳遞參數(shù),數(shù)據(jù)自上而下流動(dòng)窗慎,實(shí)現(xiàn)父子通訊
      class ChildrenComponent extends React.Component {
          constructor(props) {
              super(props);
          }
      
          render() {
              return (
                  {/* 接受從父組件傳遞而來(lái)的title */}
                  <h1> {this.props.title} </h1>
              )
          }
      }
      
      class ParentComponent extends React.Component {
          constructor(props) {
              super(props);
              this.state = {
                title: '標(biāo)題'
              }
          }
      
          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() {
              // 調(diào)用父組件方法并將參數(shù)傳遞給父組件
              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);
          }
      
          // 子組件調(diào)用综慎,val參數(shù)為子組件傳遞過(guò)來(lái)
          onClickChildren(val) {
              console.log(val); // children component
          }
      
          render() {
              return (
                  <div>
                          {/* 將onClickChildren()方法作為props傳遞給子組件 */}
                       <ChildrenComponent 
                              onClickChildren={this.onClickChildren.bind(this)} />
                  </div>
              )
          }
      }
      
  • 子子通訊:

    • eventBus
    • Redux
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末绒极,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌一也,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,270評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件擒滑,死亡現(xiàn)場(chǎng)離奇詭異情萤,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)较屿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門隧魄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人隘蝎,你說(shuō)我怎么就攤上這事购啄。” “怎么了嘱么?”我有些...
    開封第一講書人閱讀 165,630評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵狮含,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我曼振,道長(zhǎng)几迄,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,906評(píng)論 1 295
  • 正文 為了忘掉前任冰评,我火速辦了婚禮映胁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘甲雅。我一直安慰自己解孙,他們只是感情好坑填,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著弛姜,像睡著了一般穷遂。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上娱据,一...
    開封第一講書人閱讀 51,718評(píng)論 1 305
  • 那天蚪黑,我揣著相機(jī)與錄音,去河邊找鬼中剩。 笑死忌穿,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的结啼。 我是一名探鬼主播掠剑,決...
    沈念sama閱讀 40,442評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼郊愧!你這毒婦竟也來(lái)了朴译?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,345評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤属铁,失蹤者是張志新(化名)和其女友劉穎眠寿,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體焦蘑,經(jīng)...
    沈念sama閱讀 45,802評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡盯拱,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了例嘱。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片狡逢。...
    茶點(diǎn)故事閱讀 40,117評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖拼卵,靈堂內(nèi)的尸體忽然破棺而出奢浑,到底是詐尸還是另有隱情,我是刑警寧澤腋腮,帶...
    沈念sama閱讀 35,810評(píng)論 5 346
  • 正文 年R本政府宣布雀彼,位于F島的核電站,受9級(jí)特大地震影響低葫,放射性物質(zhì)發(fā)生泄漏详羡。R本人自食惡果不足惜仍律,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評(píng)論 3 331
  • 文/蒙蒙 一嘿悬、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧水泉,春花似錦善涨、人聲如沸窒盐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蟹漓。三九已至,卻和暖如春源内,著一層夾襖步出監(jiān)牢的瞬間葡粒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工膜钓, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留嗽交,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,377評(píng)論 3 373
  • 正文 我出身青樓颂斜,卻偏偏與公主長(zhǎng)得像夫壁,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子沃疮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評(píng)論 2 355