三大框架一大抄css
.vue
文件,來建立對應的組件;
React如何實現組件化:你們注意,React中有組件化的概念,可是,並無像vue這樣的組件模板文件;React中,一切都是以JS來表現的;所以要學習React,JS要合格;ES6 和 ES7 (async 和 await) 要會用;html
DOM:瀏覽器中,提供的概念;用JS對象,表示頁面上的元素,並提供了操做元素的API;前端
虛擬DOM:是框架中的概念;而是開發框架的程序員,手動用JS對象來模擬DOM元素和嵌套關係;vue
tree diff:新舊兩棵DOM樹,逐層對比的過程,就是 Tree Diff; 當整顆DOM逐層對比完畢,則全部須要被按需更新的元素,必然可以找到;node
component diff:在進行Tree Diff的時候,每一層中,組件級別的對比,叫作 Component Diff;react
element diff:在進行組件對比的時候,若是兩個組件類型相同,則須要進行 元素級別的對比,這叫作 Element Diff;webpack
npm init -y
快速初始化項目src
源代碼目錄和dist
產品目錄index.html
cnpm i webpack webpack-cli -D
cnpm
: 全局運行 npm i cnpm -g
src
-> index.js
dist
-> main.js
mode
選項(爲必選項),可選的值爲:development
和 production
;運行 cnpm i react react-dom -S
安裝包程序員
ReactDOM.render()
在index.html
頁面中,建立容器:es6
<!-- 容器,未來,使用 React 建立的虛擬DOM元素,都會被渲染到這個指定的容器中 --> <div id="app"></div>
導入 包:web
import React from 'react' import ReactDOM from 'react-dom'
建立虛擬DOM元素:
// 這是 建立虛擬DOM元素的 API <h1 title="啊,五環" id="myh1">你比四環多一環</h1> // 第一個參數: 字符串類型的參數,表示要建立的標籤的名稱 // 第二個參數:對象類型的參數, 表示 建立的元素的屬性節點 // 第三個參數: 子節點 const myh1 = React.createElement('h1', { title: '啊,五環', id: 'myh1' }, '你比四環多一環')
渲染:
// 3. 渲染虛擬DOM元素 // 參數1: 表示要渲染的虛擬DOM對象 // 參數2: 指定容器,注意:這裏不能直接放 容器元素的Id字符串,須要放一個容器的DOM對象 ReactDOM.render(myh1, document.getElementById('app'))
什麼是JSX語法:就是符合 xml 規範的 JS 語法;(語法格式相對來講,要比HTML嚴謹不少)
安裝 babel
插件
cnpm i babel-core babel-loader babel-plugin-transform-runtime -D
cnpm i babel-preset-env babel-preset-stage-0 -D
安裝可以識別轉換jsx語法的包 babel-preset-react
cnpm i babel-preset-react -D
添加 .babelrc
配置文件
{ "presets": ["env", "stage-0", "react"], "plugins": ["transform-runtime"] }
添加babel-loader配置項:
module: { //要打包的第三方模塊 rules: [ { test: /\.js|jsx$/, use: 'babel-loader', exclude: /node_modules/ } ] }
jsx 語法的本質:並非直接把 jsx 渲染到頁面上,而是 內部先轉換成了 createElement 形式,再渲染的;
在 jsx 中混合寫入 js 表達式:在 jsx 語法中,要把 JS代碼寫到 { }
中
在 jsx 中 寫註釋:推薦使用{ /* 這是註釋 */ }
爲 jsx 中的元素添加class類名:須要使用className
來替代 class
;htmlFor
替換label的for
屬性
在JSX建立DOM的時候,全部的節點,必須有惟一的根元素進行包裹;
在 jsx 語法中,標籤必須 成對出現,若是是單標籤,則必須自閉和!
當 編譯引擎,在編譯JSX代碼的時候,若是遇到了
<
那麼就把它看成 HTML代碼去編譯,若是遇到了{}
就把 花括號內部的代碼看成 普通JS代碼去編譯;
使用構造函數來建立組件,若是要接收外界傳遞的數據,須要在 構造函數的參數列表中使用
props
來接收;必需要向外return一個合法的JSX建立的虛擬DOM;
建立組件:
function Hello () { // return null return <div>Hello 組件</div> }
爲組件傳遞數據:
// 使用組件並 爲組件傳遞 props 數據 <Hello name={dog.name} age={dog.age} gender={dog.gender}></Hello> // 在構造函數中,使用 props 形參,接收外界 傳遞過來的數據 function Hello(props) { // props.name = 'zs' console.log(props) // 結論:不管是 Vue 仍是 React,組件中的 props 永遠都是隻讀的;不能被從新賦值; return <div>這是 Hello 組件 --- {props.name} --- {props.age} --- {props.gender}</div> }
父組件向子組件傳遞數據
使用{...obj}屬性擴散傳遞數據
將組件封裝到單獨的文件中
注意:組件的名稱首字母必須是大寫
在導入組件的時候,如何省略組件的.jsx
後綴名:
// 打開 webpack.config.js ,並在導出的配置對象中,新增 以下節點: resolve: { extensions: ['.js', '.jsx', '.json'], // 表示,這幾個文件的後綴名,能夠省略不寫 alias: { '@': path.join(__dirname, './src') } }
在導入組件的時候,配置和使用@
路徑符號
使用 class 關鍵字來建立組件
ES6 中 class 關鍵字,是實現面向對象編程的新形式;
constructor
的基本使用extends
關鍵字實現繼承最基本的組件結構:
class 組件名稱 extends React.Component { render(){ return <div>這是 class 建立的組件</div> } }
有狀態組件和無狀態組件之間的本質區別就是:有無state屬性!
CommentList: [ { id: 1, user: '張三', content: '哈哈,沙發' }, { id: 2, user: '李四', content: '哈哈,板凳' }, { id: 3, user: '王五', content: '哈哈,涼蓆' }, { id: 4, user: '趙六', content: '哈哈,磚頭' }, { id: 5, user: '田七', content: '哈哈,樓下山炮' } ]
style
樣式localIdentName
設置生成的類名稱,可選的參數有:
:local()
和 :global()
React Developer Tools - Chrome 擴展下載安裝地址
理解React中虛擬DOM的概念
理解React中三種Diff算法的概念
使用JS中createElement的方式建立虛擬DOM
使用ReactDOM.render方法
使用JSX語法並理解其本質
掌握建立組件的兩種方式
理解有狀態組件和無狀態組件的本質區別
理解props和state的區別