文章涉及的內容可能不全面,但量不少,須要慢慢看。我花了很長的時間整理,用心分享心得,但願對你們有所幫助。可是不免會有打字的錯誤或理解的錯誤點,但願發現的能夠郵箱告訴我1163675970@qq.com,我會及時的進行修改,只但願對你有所幫助,謝謝。javascript
React 是一個由 facebook 開源的 前端框架,核心專一於視圖,目的是實現組件化開發;css
咱們能夠很直觀的將有一個複雜的頁面分割成若干個獨立的組件,每一個組件包含本身的 html 結構、樣式和js邏輯,而後再將這些組件組合,便可完成一個複雜的頁面。這樣既減小了邏輯的複雜度,又實現了代碼的重用;html
1.安裝 react 的腳手架 create-react-app :前端
npm install create-react-app -g
複製代碼
2.使用 react 腳手架初始化一個項目:create-react-app 項目名,例如 :vue
create-react-app first-app
複製代碼
3.等待依賴安裝完成,而後執行:java
cd first-app
npm start
複製代碼
react由兩部分組成:node
須要咱們處理的是react
看圖webpack
https://create-react-app.dev
複製代碼
全局環境安裝腳手架git
$ npm install -g create-react-app
複製代碼
基於腳手架快速構建工程化的項目
$ create-react-app xxx (若是電腦上安裝了yarn,默認基於yarn安裝)
複製代碼
不想安裝在全局,能夠基於npx一步到位 $ npx create-react-app xxx
|- node_modules 全部安裝的模塊
|- public
|- index.html SPA單頁面應用中,各組件最後合併渲染完成的結果都會放入到頁面的#root盒子中呈現
|- xxx.html MPA/SPA這裏存放的是最後編譯頁面的模板
|- 咱們還可能會在此放一些公共資源,把這些資源直接基於SRC/LINK的方式調入到頁面模板中,而不是基於webpack最後合併在一塊兒(不建議:可是項目中,可能存在一些木塊不支持CommonJS/ES6Module規範,此時咱們只能在這裏直接引入使用了)
|- src 整個項目的大部分源碼都寫在這個目錄下
|- index.js 項目的入口,webpack從這個文件開始導入打包(MPA中須要建立多入口文件)
|- api 數據處理
|- store REDUX公共狀態管理的
|- assets 存儲公共資源的(圖片和樣式)
|- utils 公共的JS模塊
|- routes 路由管理的
|- components 公共的組件
|- ...
|- package.json
複製代碼
若是執行yarn start/build 提示少模塊,咱們則少了誰就安裝誰
|- scripts
|- start.js => $ yarn start
|- build.js => $ yarn build
|- config
|- 這裏存儲的就是webpack的配置項
複製代碼
PACKAGE.JSON
"scripts": {
"startMac": "PORT=8081 node scripts/start.js",
"start": "set PORT=8081&&set HOST=127.0.0.1&&set HTTPS=true&&node scripts/start.js",
"build": "node scripts/build.js"
},
複製代碼
修改less的處理配置
config/webpack.config.js
const cssRegex = /\.(css|less)$/;
{
test: cssRegex,
exclude: cssModuleRegex,
use: getStyleLoaders({
importLoaders: 1,
sourceMap: isEnvProduction && shouldUseSourceMap,
}, "less-loader"),
// Don't consider CSS imports dead code even if the // containing package claims to have no side effects. // Remove this when webpack adds a warning or an error for this. // See https://github.com/webpack/webpack/issues/6571 sideEffects: true, }, 複製代碼
jsx 語法是一種 js 和 HTML 混寫的語法,將組件的結構,數據甚至樣式都聚合在一塊兒定義組件,最終通過編譯造成普通的 javascript;
在 jsx 中,長得像 HTML 元素的就是 react 元素,React 使用 jsx 語法開發,學習 React 須要掌握 jsx 語法;
jsx 能夠寫在 js 文件中,也能夠新建 .jsx 文件;可是在 js 文件中須要導入 React
import React from 'react';
// 導入 React 以後才能開始寫 jsx 語法
複製代碼
import React from 'react'
import ReactDOM from 'react-dom'
let data = {
name: '帥哥',
age: 18
};
let h = <h1 id="xyz">姓名:{ data.name }, 年齡:{ data.age }</h1>; // 這個 h 就是一個 react 元素,也能夠成jsx元素,這個元素是虛擬DOM(js對象)
// 把 react 元素渲染到頁面中
ReactDOM.render(h, document.querySelector('#root'), () => {
console.log('100');
console.log(document.getElementById('xyz'))
});
複製代碼
JSX 元素須要放到 ReactDOM.render() 函數中,且最外層只能有一個根節點;
須要注意 jsx 是js,寫 jsx 需注意遵照 js 的語法;
jsx 元素能夠經過 { } 來使用表達式,注意只能是表達式,不容許寫語句
jsx 元素一樣可使用行內屬性,可是 原來 html 行內的 class 屬性,在 jsx 中有特殊意義,須要改爲 className ;原有的 label 的 for 屬性,須要改爲 htmlFor ; style屬性要寫成對象的形式
jsx 元素(react元素)並非真正的 DOM,而是虛擬 DOM ,最終通過 babel 編譯成普通js的對象;
示例:
let d1 = <div className="x1">這是一個div { false ? 1 : 0 }</div>
let d2 = (<div className={ false ? 'x1' : 'y1' }> 這是一個div <p>這裏面減值能夠寫一個html</p> </div>); // 若是換行用小括號包裹起來
let d3 = <div style={{color: 'red', background: '#000'}}>11111<label htmlFor="name"><input type="text" defaultValue={data.name} id="name" /></label></div>; ReactDOM.render(d3, document.getElementById('root')); 複製代碼
在 react 中使用樣式,直接在 js 中經過 import 導入 css 樣式;最終打包的時候,webpack 會幫咱們把樣式處理好;
示例
import React from 'react'
import ReactDOM from 'react-dom'
import './css/3-css.css' // 在 react 中使用樣式,直接在 js 中經過 import 導入 css 樣式
let p1 = <p className="p1">這是一個p標籤</p>; // 注意不能使用 class 指定元素類名,而應該使用 className 屬性
ReactDOM.render(p1, document.querySelector('#root'));
複製代碼
React 和 Vue 相似都是數據驅動的,均可以根據給定的數據生成一組 DOM 元素,或者根據數據的特定狀況生成或者不生成 DOM 元素;在 Vue 中使用 v-for 指令,可是 React 沒有指令系統,須要使用 數組的 map 方法,在 map方法的回調函數中返回要生成的 jsx 元素;
示例
import React from 'react'
import ReactDOM from 'react-dom'
let ary = [
{
name: '瘦大大',
age: 18,
title: '宇宙集團軍總司令'
},
{
name: '胖小小',
age: 17,
title: '銀河小魔仙'
}
];
// 在 Vue 中使用 v-for,可是 React 中沒有指令
// 在 React 中使用列表渲染,須要使用 數組的 map 方法,在 map 方法的回調函數中返回要生成多個的元素;
// 使用傳統的匿名函數:
let lis = ary.map(function (item, index) {
return <li key={index}>姓名:{item.name};年齡:{item.age};職務:{item.title}</li>
}); // map 方法將原數組映射成一個新數組,
console.log(lis); // 虛擬 DOM 數組
let ul = (<ul> {lis} {/*使用列表渲染出來的數據,在 html 裏面使用須要使用 { lis }*/} </ul>);
// 使用 箭頭函數
let ul2 = (<ol> { ary.map((item, index) => <li key={index}>name: {item.name}; age: {item.age}; title: {item.title}</li>) } </ol>);
ReactDOM.render(ul2, document.querySelector('#root'));
複製代碼
條件渲染
React 一樣沒有 v-if,可是須要條件渲染,就須要使用 if-else 等判斷語句
示例
let flag = Math.round(Math.random() * 10)
let el;
if (flag > 5) {
el = <h1>大於5</h1>
} else {
el = <h1> 小於等於 5</h1>
}
複製代碼
React.createElement() 方法是用來建立虛擬 DOM 的方法,而 jsx 語法中,jsx 元素就是 createElement 方法的語法糖;
示例
import React from 'react';
import ReactDOM from 'react-dom';
let ele = (<h1 x="1" y="2"> hello <span s="1">1</span> <span>2</span> </h1>);
let eleByCreateElement = React.createElement(
'h1',
{x: 1, y: 2},
'hello',
React.createElement('span', {s: 1}, 1),
React.createElement('span', null, 2)
);
// React.createElement(type, props, ...children)
// type: 標籤類型
// props: 行內屬性,對象數據類型
// children: 從第三個參數開始都是 type 的子元素
ReactDOM.render(eleByCreateElement, document.getElementById('root'));` javascript 複製代碼