Vue剛轉(zhuǎn)React的那些事兒

背景: 3月份離職了宛瞄,之后入職新公司胆胰,第一個(gè)任務(wù)是react + ts + node項(xiàng)目赞枕;由于沒有react開發(fā)經(jīng)驗(yàn)就先過了一遍文檔味悄,在開始敲代碼的時(shí)候總是會(huì)忘記語法草戈,然后就做了個(gè)react 基礎(chǔ)語法和注意事項(xiàng) 相關(guān)的文檔,加一些和vue使用的區(qū)別侍瑟,有react經(jīng)驗(yàn)的小伙伴就不需要浪費(fèi)時(shí)間往下看啦~~

那么就開始吧~

  1. 變量作為屬性值及模版中嵌入表達(dá)式
<!--react-->
 <span type={user.type}>{user.name}</span> 
 <!--vue-->
 <span :type="user.type">{{user.name}}</span> 
  1. 單向數(shù)據(jù)流
    react 通過setState來修改唐片,方便定位問題;
    所有 React 組件都必須像純函數(shù)一樣保護(hù)它們的 props 不被更改
    vue也是單向數(shù)據(jù)流不過也還是可以通過黑科技改變props的

  2. 模版嵌套
    組件的嵌套設(shè)計(jì),復(fù)雜大型功能自下而上涨颜,小型功能自上而下费韭,方便處理和測試

  3. react 的 state
    組件私有屬性,用與子組件共享庭瑰,用于可變狀態(tài)(mutable state)星持;
    react如果子組件共用且均需要修改state時(shí)要將state提升到公共父級去,修改需使用setState來處理

  4. 最小state
    通過父級props傳進(jìn)來弹灭;隨著時(shí)間的推移保持不變督暂;能根據(jù)其他props和state技術(shù)出來;
    以上3種情況都不應(yīng)該另用新state

  5. 組件不使用state時(shí)可寫成函數(shù)形式

    function LogoutButton(props) {
      return (
        <button onClick={props.onClick}>
          Logout
        </button>
      );
    }
    <!--組件使用-->
    <LogoutButton />
    
  6. 反向數(shù)據(jù)流
    子組件通知父組件修改state穷吮,通過調(diào)用回調(diào)函數(shù)來解決逻翁,將父組件函數(shù)傳入子組件來進(jìn)行處理;不同于vue是子組件emit事件,父級接收到emit來執(zhí)行相關(guān)函數(shù)

  7. 阻止默認(rèn)事件
    不能通過返回false 的方式阻止默認(rèn)行為捡鱼。你必須顯式的使用 preventDefault

        <!--無法阻止-->
        <a href="#" onclick="console.log('The link was clicked.'); return false">
          Click me
        </a>
    
    <!--正確做法-->
    function ActionLink() {
      function handleClick(e) {
        e.preventDefault();
        console.log('The link was clicked.');
      }
    
      return (
        <a href="#" onClick={handleClick}>
          Click me
        </a>
      );
    }
    
  8. 組件名開頭必須大寫
    React 會(huì)將以小寫字母開頭的組件視為原生 DOM 標(biāo)簽八回。 <div> 代表 HTML 的 div 標(biāo)簽,而 <Welcome />則代表一個(gè)組件,并且需在作用域內(nèi)使用 Welcome缠诅。規(guī)范詳見深入JSX

  9. style

  10. 在模板上直接使用要用‘雙括號(hào)’

  11. 定義style對象添加

 <!--直接在模版添加-->
  <div
    className="board-row"
    style={{color: 'red'}}
  >喂喂溶浴,testtest</div>
  <!--style變量-->
  const devClass = {color:red};
  <div style={ devClass, ..., ....}></div>
  
  <!--如果是font-size等有中線的要改為駝峰-->
   <div style={{fontSize:'14px'}} key={item.title}>
  1. class
    在react中class是保留字因此以className替換,其他差異詳見react屬性差異

    function Square(props) {
      return (
        <button className="square" onClick={props.onClick}>
          {props.value}
        </button>
      );
    }
    
  2. 對比于 vue slot

    1. react 子組件通過props.children可以實(shí)現(xiàn)管引;比起slot props可以傳遞任何東西
        function FancyBorder(props) {
          return (
            <div>
            <!--如果父級傳入children將會(huì)被覆蓋-->
              {props.children}
            </div>
          );
        }
        
        function WelcomeDialog() {
          return (
          <!--此處children不會(huì)被接收士败,會(huì)被子組件所覆蓋-->
            <FancyBorder color="blue" children={11}>
              <h1 className="Dialog-title">
                Welcome
              </h1>
            </FancyBorder>
          );
        }
        
        ReactDOM.render(
          <WelcomeDialog />,
          document.getElementById('root')
        );
    
    1. 父組件直接將組件傳入及子組件props[any]獲取
  3. fragment
    render return時(shí)需要包裹dom元素;
    React 中的一個(gè)常見模式是一個(gè)組件返回多個(gè)元素。Fragments 允許你將子列表分組汉匙,而無需向 DOM 添加額外節(jié)點(diǎn)

    render() {
      return (
        <React.Fragment>
          <ChildA />
          <ChildB />
          <ChildC />
        </React.Fragment>
      );
    }
    

    你可以使用一種新的拱烁,且更簡短的語法來聲明 Fragments;可以像使用任何其他元素一樣使用 <> </>,除了它不支持 key 或?qū)傩?/strong>

    class Columns extends React.Component {
      render() {
        return (
          <>
            <td>Hello</td>
            <td>World</td>
          </>
        );
      }
    }
    
  1. 參數(shù)傳遞噩翠,詳見Context

    1. context:設(shè)計(jì)目的是為了共享那些對于一個(gè)組件樹而言是“全局”的數(shù)據(jù);主要應(yīng)用場景在于很多不同層級的組件需要訪問同樣一些的數(shù)據(jù);
       // Context 可以讓我們無須明確地傳遍每一個(gè)組件戏自,就能將值深入傳遞進(jìn)組件樹。
       // 為當(dāng)前的 theme 創(chuàng)建一個(gè) context(“l(fā)ight”為默認(rèn)值)伤锚。
       const ThemeContext = React.createContext('light');
       
       class App extends React.Component {
         render() {
           // 使用一個(gè) Provider 來將當(dāng)前的 theme 傳遞給以下的組件樹擅笔。
           // 無論多深,任何組件都能讀取這個(gè)值屯援。
           // 在這個(gè)例子中猛们,我們將 “dark” 作為當(dāng)前的值傳遞下去。
           return (
             <ThemeContext.Provider value="dark">
               <Toolbar />
             </ThemeContext.Provider>
           );
         }
       }
       
       // 中間的組件再也不必指明往下傳遞 theme 了狞洋。
       function Toolbar(props) {
         return (
           <div>
             <ThemedButton />
           </div>
         );
       }
       
       class ThemedButton extends React.Component {
         // 指定 contextType 讀取當(dāng)前的 theme context弯淘。
         // React 會(huì)往上找到最近的 theme Provider,然后使用它的值吉懊。
         // 在這個(gè)例子中庐橙,當(dāng)前的 theme 值為 “dark”。
         static contextType = ThemeContext;
         render() {
           return <Button theme={this.context} />;
         }
       }
    
    1. 組件組合(將組件傳入)
    <!--原-->
      <Page user={user} avatarSize={avatarSize} />
      // ... 渲染出 ...
      <PageLayout user={user} avatarSize={avatarSize} />
      // ... 渲染出 ...
      <NavigationBar user={user} avatarSize={avatarSize} />
      // ... 渲染出 ...
      <Link href={user.permalink}>
        <Avatar user={user} size={avatarSize} />
      </Link>
      
    <!--改:只有最頂部的 Page 組件需要知道 Link 和 Avatar 組件是如何使用 user 和 avatarSize 的借嗽。-->
      function Page(props) {
        const user = props.user;
        const userLink = (
          <Link href={user.permalink}>
            <Avatar user={user} size={props.avatarSize} />
          </Link>
        );
        return <PageLayout userLink={userLink} />;
      }
      
      // 現(xiàn)在态鳖,我們有這樣的組件:
      <Page user={user} avatarSize={avatarSize} />
      // ... 渲染出 ...
      <PageLayout userLink={...} />
      // ... 渲染出 ...
      <NavigationBar userLink={...} />
      // ... 渲染出 ...
      {props.userLink}
    
  2. 錯(cuò)誤邊界

部分 UI 的 JavaScript 錯(cuò)誤不應(yīng)該導(dǎo)致整個(gè)應(yīng)用崩潰,為了解決這個(gè)問題恶导,React 16 引入了該概念浆竭;
錯(cuò)誤邊界是一種 React 組件,這種組件可以捕獲并打印發(fā)生在其子組件樹任何位置的 JavaScript 錯(cuò)誤惨寿,并且它會(huì)渲染出備用 UI邦泄,而不是渲染那些崩潰了的子組件樹。錯(cuò)誤邊界在渲染期間裂垦、生命周期方法和整個(gè)組件樹的構(gòu)造函數(shù)中捕獲錯(cuò)誤
  1. 組件首字母必須大寫
import React from 'react';
import { PhotoStory, VideoStory } from './stories';

const components = {
  photo: PhotoStory,
  video: VideoStory
};

function Story(props) {
  // 錯(cuò)誤!!!虎韵!JSX 類型不能是一個(gè)表達(dá)式。
  return <components[props.storyType] story={props.story} />;
  // 正確!!!缸废!JSX 類型可以是大寫字母開頭的變量。
  const SpecificStory = components[props.storyType];
  return <SpecificStory story={props.story} />;
}
  1. 傳遞子集動(dòng)態(tài)變量(直接傳就行) 在此基礎(chǔ)上改
  render() {
    const celsius = scale === 'f' ? tryConvert(temperature, toCelsius) : temperature;
    const fahrenheit = scale === 'c' ? tryConvert(temperature, toFahrenheit) : temperature;
    const tmp = [
      {scale: 'c', key: celsius},
      {scale: 'f', key: fahrenheit},
    ]
    return (
      <div>
        {
          tmp.map(item => {
            return  <TemperatureInput
                scale={item.scale}
                temperature={item.key}
                onTemperatureChange={this.handelCommon}
              />
           })
        }
      </div>
    );
  }
  1. 傳遞當(dāng)前event
 <!--react-->
 <input
   type="text"
   placeholder="Search..."
   value={this.props.filterText}
   onChange={(e)=>this.handleFilterTextChange('sth', e)}
 />
  <!--vue-->
  <searchInput
    v-model="params.nameKey"
    placeholder="搜索名稱"
    icon="android-close"
    @search="searchData"
    @clear="afterChange('nameKey', $event)"
  ></searchInput>
  1. Portal 彈窗??
    Portal 提供了一種將子節(jié)點(diǎn)渲染到存在于父組件以外的 DOM 節(jié)點(diǎn)的優(yōu)秀的方案。
    典型用例是當(dāng)父組件有 overflow: hidden 或 z-index 樣式時(shí)企量,但你需要子組件能夠在視覺上“跳出”其容器测萎。例如,對話框届巩、懸浮卡以及提示框

19.componentWillReceiveProps
使用時(shí)最好比較兩個(gè)props一面陷入死循環(huán)硅瞧,不停更新組件參考

等等。恕汇。腕唧。

參考:

  1. https://juejin.im/post/5c2de832f265da6172659b45
  2. https://juejin.im/post/5b8b56e3f265da434c1f5f76

結(jié)語:
有咩有小伙伴能提供個(gè)更恰當(dāng)?shù)奈恼旅滞邸qⅰT娼印聡隆H鼻础F鹈麖U


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末但惶,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子湿蛔,更是在濱河造成了極大的恐慌膀曾,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件阳啥,死亡現(xiàn)場離奇詭異添谊,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)察迟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進(jìn)店門斩狱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人卷拘,你說我怎么就攤上這事喊废。” “怎么了栗弟?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵污筷,是天一觀的道長。 經(jīng)常有香客問我乍赫,道長瓣蛀,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任雷厂,我火速辦了婚禮惋增,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘改鲫。我一直安慰自己诈皿,他們只是感情好林束,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著稽亏,像睡著了一般壶冒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上截歉,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天胖腾,我揣著相機(jī)與錄音,去河邊找鬼瘪松。 笑死咸作,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的宵睦。 我是一名探鬼主播记罚,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼状飞!你這毒婦竟也來了毫胜?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤诬辈,失蹤者是張志新(化名)和其女友劉穎酵使,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體焙糟,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡口渔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了穿撮。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缺脉。...
    茶點(diǎn)故事閱讀 40,115評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖悦穿,靈堂內(nèi)的尸體忽然破棺而出攻礼,到底是詐尸還是另有隱情,我是刑警寧澤栗柒,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布礁扮,位于F島的核電站,受9級特大地震影響瞬沦,放射性物質(zhì)發(fā)生泄漏太伊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一逛钻、第九天 我趴在偏房一處隱蔽的房頂上張望击罪。 院中可真熱鬧马绝,春花似錦鸡典、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽芭概。三九已至赛不,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間罢洲,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工文黎, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留惹苗,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓耸峭,卻偏偏與公主長得像桩蓉,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子劳闹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 作為一個(gè)合格的開發(fā)者院究,不要只滿足于編寫了可以運(yùn)行的代碼。而要了解代碼背后的工作原理本涕;不要只滿足于自己的程序...
    六個(gè)周閱讀 8,449評論 1 33
  • 原教程內(nèi)容詳見精益 React 學(xué)習(xí)指南业汰,這只是我在學(xué)習(xí)過程中的一些閱讀筆記,個(gè)人覺得該教程講解深入淺出菩颖,比目前大...
    leonaxiong閱讀 2,839評論 1 18
  • 40样漆、React 什么是React?React 是一個(gè)用于構(gòu)建用戶界面的框架(采用的是MVC模式):集中處理VIE...
    萌妹撒閱讀 1,017評論 0 1
  • HTML模版 之后出現(xiàn)的React代碼嵌套入模版中晦闰。 1. Hello world 這段代碼將一個(gè)一級標(biāo)題插入到指...
    ryanho84閱讀 6,240評論 0 9
  • 目前放祟,react組件有三種寫法,分別是es5的createClass寫法呻右,es6的class寫法跪妥,以及statel...
    ZoomFunc閱讀 1,658評論 0 1