reactjs精品教程資料-day1

React.js - 第1天

備注說明:該筆記來自于黑馬培訓(xùn)課筆記,因?yàn)橘|(zhì)量好,為方便學(xué)習(xí)和 查閱。


1. React簡介

  • React 起源于 Facebook 的內(nèi)部項(xiàng)目,因?yàn)樵摴緦κ袌錾纤?JavaScript MVC 框架,都不滿意,就決定自己寫一套,用來架設(shè) Instagram(照片交友) 的網(wǎng)站。做出來以后,發(fā)現(xiàn)這套東西很好用,就在2013年5月開源了。
  • Angular1 2009 年 谷歌 MVC 不支持 組件化開發(fā)
  • 由于 React 的設(shè)計(jì)思想極其獨(dú)特,屬于革命性創(chuàng)新,性能出眾,代碼邏輯卻非常簡單。所以,越來越多的人開始關(guān)注和使用,認(rèn)為它可能是將來 Web 開發(fā)的主流工具。
  • 清楚兩個(gè)概念:
    • library(庫):小而巧的庫,只提供了特定的API;優(yōu)點(diǎn)就是 船小好掉頭,可以很方便的從一個(gè)庫切換到另外的庫;但是代碼幾乎不會改變;
    • Framework(框架):大而全的是框架;框架提供了一整套的解決方案;所以,如果在項(xiàng)目中間,想切換到另外的框架,是比較困難的;

      2. 前端三大主流框架

      三大框架一大抄

  • Angular.js:出來較早的前端框架,學(xué)習(xí)曲線比較陡,NG1學(xué)起來比較麻煩,NG2 ~ NG5開始,進(jìn)行了一系列的改革,也提供了組件化開發(fā)的概念;從NG2開始,也支持使用TS(TypeScript)進(jìn)行編程;
  • Vue.js:最火(關(guān)注的人比較多)的一門前端框架,它是中國人開發(fā)的,對我我們來說,文檔要友好一些;
  • React.js:最流行(用的人比較多)的一門框架,因?yàn)樗脑O(shè)計(jì)很優(yōu)秀;

    3. React與vue的對比

    組件化方面

  • 什么是模塊化:是從代碼的角度來進(jìn)行分析的;把一些可復(fù)用的代碼,抽離為單個(gè)的模塊;便于項(xiàng)目的維護(hù)和開發(fā);
  • 什么是組件化: 是從 UI 界面的角度 來進(jìn)行分析的;把一些可服用的UI元素,抽離為單獨(dú)的組件;便于項(xiàng)目的維護(hù)和開發(fā);
  • 組件化的好處:隨著項(xiàng)目規(guī)模的增大,手里的組件越來越多;很方便就能把現(xiàn)有的組件,拼接為一個(gè)完整的頁面;
  • Vue是如何實(shí)現(xiàn)組件化的: 通過 .vue 文件,來創(chuàng)建對應(yīng)的組件;
    • template 結(jié)構(gòu)
    • script 行為
    • style 樣式
  • React如何實(shí)現(xiàn)組件化:大家注意,React中有組件化的概念,但是,并沒有像vue這樣的組件模板文件;React中,一切都是以JS來表現(xiàn)的;因此要學(xué)習(xí)React,JS要合格;ES6 和 ES7 (async 和 await) 要會用;

    開發(fā)團(tuán)隊(duì)方面

  • React是由FaceBook前端官方團(tuán)隊(duì)進(jìn)行維護(hù)和更新的;因此,React的維護(hù)開發(fā)團(tuán)隊(duì),技術(shù)實(shí)力比較雄厚;
  • Vue:第一版,主要是有作者 尤雨溪 專門進(jìn)行維護(hù)的,當(dāng) Vue更新到 2.x 版本后,也有了一個(gè)以 尤雨溪 為主導(dǎo)的開源小團(tuán)隊(duì),進(jìn)行相關(guān)的開發(fā)和維護(hù);

    社區(qū)方面

  • 在社區(qū)方面,React由于誕生的較早,所以社區(qū)比較強(qiáng)大,一些常見的問題、坑、最優(yōu)解決方案,文檔、博客在社區(qū)中都是可以很方便就能找到的;
  • Vue是近兩年才火起來的,所以,它的社區(qū)相對于React來說,要小一些,可能有的一些坑,沒人踩過;

    移動(dòng)APP開發(fā)體驗(yàn)方面

  • Vue,結(jié)合 Weex 這門技術(shù),提供了 遷移到 移動(dòng)端App開發(fā)的體驗(yàn)(Weex,目前只是一個(gè) 小的玩具, 并沒有很成功的 大案例;)
  • React,結(jié)合 ReactNative,也提供了無縫遷移到 移動(dòng)App的開發(fā)體驗(yàn)(RN用的最多,也是最火最流行的);

    4. 為什么要學(xué)習(xí)React

  • 和Angular1相比,React設(shè)計(jì)很優(yōu)秀,一切基于JS并且實(shí)現(xiàn)了組件化開發(fā)的思想;
  • 開發(fā)團(tuán)隊(duì)實(shí)力強(qiáng)悍,不必?fù)?dān)心斷更的情況;
  • 社區(qū)強(qiáng)大,很多問題都能找到對應(yīng)的解決方案;
  • 提供了無縫轉(zhuǎn)到 ReactNative 上的開發(fā)體驗(yàn),讓我們技術(shù)能力得到了拓展;增強(qiáng)了我們的核心競爭力;
  • 很多企業(yè)中,前端項(xiàng)目的技術(shù)選型采用的是React.js;

    5. React中幾個(gè)核心的概念

    虛擬DOM(Virtual Document Object Model)

    • DOM的本質(zhì)是什么:瀏覽器中的概念,用JS對象來表示 頁面上的元素,并提供了操作 DOM 對象的API;
    • 什么是React中的虛擬DOM:是框架中的概念,是程序員 用JS對象來模擬 頁面上的 DOM 和 DOM嵌套;
    • 為什么要實(shí)現(xiàn)虛擬DOM(虛擬DOM的目的):為了實(shí)現(xiàn)頁面中, DOM 元素的高效更新
    • DOM和虛擬DOM的區(qū)別
      • DOM:瀏覽器中,提供的概念;用JS對象,表示頁面上的元素,并提供了操作元素的API;
      • 虛擬DOM:是框架中的概念;而是開發(fā)框架的程序員,手動(dòng)用JS對象來模擬DOM元素和嵌套關(guān)系;
        • 本質(zhì): 用JS對象,來模擬DOM元素和嵌套關(guān)系;
    • tree diff:新舊兩棵DOM樹,逐層對比的過程,就是 Tree Diff; 當(dāng)整顆DOM逐層對比完畢,則所有需要被按需更新的元素,必然能夠找到;
    • component diff:在進(jìn)行Tree Diff的時(shí)候,每一層中,組件級別的對比,叫做 Component Diff;
      • 如果對比前后,組件的類型相同,則暫時(shí)認(rèn)為此組件不需要被更新;
      • 如果對比前后,組件類型不同,則需要移除舊組件,創(chuàng)建新組件,并追加到頁面上;
  • 運(yùn)行npm init -y 快速初始化項(xiàng)目
  • 在項(xiàng)目根目錄創(chuàng)建src源代碼目錄和dist產(chǎn)品目錄
  • 在 src 目錄下創(chuàng)建 index.html
  • 使用 cnpm 安裝 webpack ,運(yùn)行cnpm i webpack webpack-cli -D
    • 如何安裝 cnpm: 全局運(yùn)行 npm i cnpm -g
  • 注意:webpack 4.x 提供了 約定大于配置的概念;目的是為了盡量減少 配置文件的體積;
    • 默認(rèn)約定了:
    • 打包的入口是src -> index.js
    • 打包的輸出文件是dist -> main.js
    • 4.x 中 新增了 mode 選項(xiàng)(為必選項(xiàng)),可選的值為:developmentproduction;

      7. 在項(xiàng)目中使用 react

  • 運(yùn)行 cnpm i react react-dom -S 安裝包
    • react: 專門用于創(chuàng)建組件和虛擬DOM的,同時(shí)組件的生命周期都在這個(gè)包中
    • react-dom: 專門進(jìn)行DOM操作的,最主要的應(yīng)用場景,就是ReactDOM.render()
  • index.html頁面中,創(chuàng)建容器:
    <!-- 容器,將來,使用 React 創(chuàng)建的虛擬DOM元素,都會被渲染到這個(gè)指定的容器中 --><div id="app"></div>
  • 導(dǎo)入 包:
    import React from 'react'import ReactDOM from 'react-dom'
  • 創(chuàng)建虛擬DOM元素:
    // 這是 創(chuàng)建虛擬DOM元素的 API    <h1 title="啊,五環(huán)" id="myh1">你比四環(huán)多一環(huán)</h1>//  第一個(gè)參數(shù): 字符串類型的參數(shù),表示要?jiǎng)?chuàng)建的標(biāo)簽的名稱//  第二個(gè)參數(shù):對象類型的參數(shù), 表示 創(chuàng)建的元素的屬性節(jié)點(diǎn)//  第三個(gè)參數(shù): 子節(jié)點(diǎn)const myh1 = React.createElement('h1', { title: '啊,五環(huán)', id: 'myh1' }, '你比四環(huán)多一環(huán)')
  • 渲染:
    // 3. 渲染虛擬DOM元素// 參數(shù)1: 表示要渲染的虛擬DOM對象// 參數(shù)2: 指定容器,注意:這里不能直接放 容器元素的Id字符串,需要放一個(gè)容器的DOM對象ReactDOM.render(myh1, document.getElementById('app'))
    ?

    8. JSX語法

    什么是JSX語法:就是符合 xml 規(guī)范的 JS 語法;(語法格式相對來說,要比HTML嚴(yán)謹(jǐn)很多)

  • 如何啟用 jsx 語法?
    • 安裝 babel 插件
      • 運(yùn)行cnpm i babel-core babel-loader babel-plugin-transform-runtime -D
      • 運(yùn)行cnpm i babel-preset-env babel-preset-stage-0 -D
    • 安裝能夠識別轉(zhuǎn)換jsx語法的包 babel-preset-react
      • 運(yùn)行cnpm i babel-preset-react -D
    • 添加 .babelrc 配置文件
      {  "presets": ["env", "stage-0", "react"],  "plugins": ["transform-runtime"]}
    • 添加babel-loader配置項(xiàng):
      module: { //要打包的第三方模塊    rules: [      { test: /\.js|jsx$/, use: 'babel-loader', exclude: /node_modules/ }    ]}
      ?
  • jsx 語法的本質(zhì):并不是直接把 jsx 渲染到頁面上,而是 內(nèi)部先轉(zhuǎn)換成了 createElement 形式,再渲染的;
  • 在 jsx 中混合寫入 js 表達(dá)式:在 jsx 語法中,要把 JS代碼寫到 { }
    • 渲染數(shù)字
    • 渲染字符串
    • 渲染布爾值
    • 為屬性綁定值
    • 渲染jsx元素
    • 渲染jsx元素?cái)?shù)組
    • 將普通字符串?dāng)?shù)組,轉(zhuǎn)為jsx數(shù)組并渲染到頁面上【兩種方案】
  • 在 jsx 中 寫注釋:推薦使用{ /* 這是注釋 */ }
  • 為 jsx 中的元素添加class類名:需要使用className 來替代 class;htmlFor替換label的for屬性
  • 在JSX創(chuàng)建DOM的時(shí)候,所有的節(jié)點(diǎn),必須有唯一的根元素進(jìn)行包裹;
  • 在 jsx 語法中,標(biāo)簽必須 成對出現(xiàn),如果是單標(biāo)簽,則必須自閉和!

    當(dāng) 編譯引擎,在編譯JSX代碼的時(shí)候,如果遇到了<那么就把它當(dāng)作 HTML代碼去編譯,如果遇到了 {} 就把 花括號內(nèi)部的代碼當(dāng)作 普通JS代碼去編譯;

    9. React中創(chuàng)建組件

    第1種 - 創(chuàng)建組件的方式

    使用構(gòu)造函數(shù)來創(chuàng)建組件,如果要接收外界傳遞的數(shù)據(jù),需要在 構(gòu)造函數(shù)的參數(shù)列表中使用props來接收;

    必須要向外return一個(gè)合法的JSX創(chuàng)建的虛擬DOM;

  • 創(chuàng)建組件:
    function Hello () {     // return null     return <div>Hello 組件</div>}
  • 為組件傳遞數(shù)據(jù):
    // 使用組件并 為組件傳遞 props 數(shù)據(jù)<Hello name={dog.name} age={dog.age} gender={dog.gender}></Hello>// 在構(gòu)造函數(shù)中,使用 props 形參,接收外界 傳遞過來的數(shù)據(jù)function Hello(props) {  // props.name = 'zs'  console.log(props)  // 結(jié)論:不論是 Vue 還是 React,組件中的 props 永遠(yuǎn)都是只讀的;不能被重新賦值;  return <div>這是 Hello 組件 --- {props.name} --- {props.age} --- {props.gender}</div>}
    ?
  • 父組件向子組件傳遞數(shù)據(jù)
  • 使用{…obj}屬性擴(kuò)散傳遞數(shù)據(jù)
  • 將組件封裝到單獨(dú)的文件中
  • 注意:組件的名稱首字母必須是大寫
  • 在導(dǎo)入組件的時(shí)候,如何省略組件的.jsx后綴名:
    // 打開 webpack.config.js ,并在導(dǎo)出的配置對象中,新增 如下節(jié)點(diǎn):resolve: {    extensions: ['.js', '.jsx', '.json'], // 表示,這幾個(gè)文件的后綴名,可以省略不寫    alias: {        '@': path.join(__dirname, './src')    }  }
  • 在導(dǎo)入組件的時(shí)候,配置和使用@路徑符號

    第2種 - 創(chuàng)建組件的方式

    使用 class 關(guān)鍵字來創(chuàng)建組件

    ES6 中 class 關(guān)鍵字,是實(shí)現(xiàn)面向?qū)ο缶幊痰男滦问剑?/p>

    了解ES6中 class 關(guān)鍵字的使用

  • class 中 constructor 的基本使用
  • 實(shí)例屬性和實(shí)例方法
  • 靜態(tài)屬性和靜態(tài)方法
  • 使用 extends 關(guān)鍵字實(shí)現(xiàn)繼承

    基于class關(guān)鍵字創(chuàng)建組件

  • 最基本的組件結(jié)構(gòu):
    class 組件名稱 extends React.Component {    render(){        return <div>這是 class 創(chuàng)建的組件</div>    }}

    10. 兩種創(chuàng)建組件方式的對比

  • 構(gòu)造函數(shù)創(chuàng)建出來的組件:叫做“無狀態(tài)組件”
  • class關(guān)鍵字創(chuàng)建出來的組件:叫做“有狀態(tài)組件”

    有狀態(tài)組件和無狀態(tài)組件之間的本質(zhì)區(qū)別就是:有無state屬性!

    11. 一個(gè)小案例,鞏固有狀態(tài)組件和無狀態(tài)組件的使用

    通過for循環(huán)生成多個(gè)組件

  • 數(shù)據(jù):
    CommentList: [ { id: 1, user: '張三', content: '哈哈,沙發(fā)' }, { id: 2, user: '李四', content: '哈哈,板凳' }, { id: 3, user: '王五', content: '哈哈,涼席' }, { id: 4, user: '趙六', content: '哈哈,磚頭' }, { id: 5, user: '田七', content: '哈哈,樓下山炮' }]

    設(shè)置樣式

  • 使用普通的 style 樣式
  • 啟用 css-modules
  • 使用localIdentName設(shè)置生成的類名稱,可選的參數(shù)有:
    • [path] 表示樣式表所在路徑
    • [name] 表示 樣式表文件名
    • [local] 表示樣式的定義名稱
    • [hash:length] 表示32位的hash值
  • 使用 :local():global()

    安裝 React Developer Tools 調(diào)試工具

    React Developer Tools - Chrome 擴(kuò)展下載安裝地址

    總結(jié)

    理解React中虛擬DOM的概念
    理解React中三種Diff算法的概念
    使用JS中createElement的方式創(chuàng)建虛擬DOM
    使用ReactDOM.render方法
    使用JSX語法并理解其本質(zhì)
    掌握創(chuàng)建組件的兩種方式
    理解有狀態(tài)組件和無狀態(tài)組件的本質(zhì)區(qū)別
    理解props和state的區(qū)別

    相關(guān)文章

  • 2018 年,React 將獨(dú)占前端框架鰲頭?
  • 前端框架三巨頭年度走勢對比:Vue 增長率最高
  • React數(shù)據(jù)流和組件間的溝通總結(jié)
  • 單向數(shù)據(jù)流和雙向綁定各有什么優(yōu)缺點(diǎn)?
  • 怎么更好的理解虛擬DOM?
  • React中文文檔 - 版本較低
  • React 源碼剖析系列 - 不可思議的 react diff
  • 深入淺出React(四):虛擬DOM Diff算法解析
  • 一看就懂的ReactJs入門教程(精華版)
  • CSS Modules 用法教程
  • 將MarkDown轉(zhuǎn)換為HTML頁面
  • win7命令行 端口占用 查詢進(jìn)程號 殺進(jìn)程
  • ?

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

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