寫於 2016.05.14css
項目地址:jrainlau/react-es6html
git clone https://github.com/jrainlau/react-learning
cd react-learning && npm install
npm run dev
而後瀏覽器打開localhost:8080便可
複製代碼
最近在家閒得無聊,因此打算折騰一下react。在此以前,我是一個vue的重度使用用戶,可是看到react確實很是火爆,因此也就趁此機會去了解一下react,增加一下見識。前端
學習react的參考資料,很大一部分來自 @阮一峯 的React入門實例教程。可是阮大神是用傳統的script
標籤以及es5的寫法,因此我針對教程,經過配置webpack,最終使用es6的寫法來改寫教程的demo,結合組件化的思想,完成最終的demo的改寫。vue
環境配置參照了@minooo 的文章:webpack-es6-react (爲系統學習React佈一個良好的開局)。這裏引用一些關鍵包的說明:react
package.json 中的 包/庫 部分說明
babel-core
babel6 的基礎模塊babel-eslint
ESLint 是前端JS代碼檢測利器。而 babel-eslint 則容許你檢測全部的 Babel 代碼。babel-loader
這個包容許你使用 Babel 和 webpack 轉譯(Transpiling) JavaScript 文件。babel-plugin-react-transform
這個插件經過任意轉換的方式去封裝 React 組件。換句話說,你能夠爲所欲爲的擺弄你的組件了。babel-plugin-transform-runtime
在 Babel 轉換過程當中,詳細的展現引用的相關輔助工具和內置命令,並自動的聚合填充你的代碼而不會污染全局。babel-preset-es2015
此預設包含了全部的 es2015 插件。babel-preset-react
此預設包含了全部的 React 插件。babel-preset-stage-0
此預設包含了 stage 0 中的全部插件。eslint
JavaScript 語法檢測利器:分析出你代碼潛在的錯誤和非標準用法。eslint-plugin-react
ESLint 中關於 React 語法檢測的插件。react-transform-hmr
一個 React 轉換裝置,該裝置經過引用 Hot Module Replacement API 使熱重載 React 的類成爲可能。react-transform-catch-errors
呈現你 React 組件的錯誤信息。webpack-dev-server
爲 wepack app 提供一個服務器,若是你的代碼有任何變化,瀏覽器將自動刷新顯示,極大的方便前期開發。babel-runtime
Babel 自帶的運行環境。
另外,我增長了style-loader
,css-loader
,less
,less-loader
這四個包用於加載.less
文件模塊。(注意,less-loader
與less
必須同時存在才能正常工做。)linux
根目錄下文件部分說明
.babelrc
: 什麼是.babelrc
文件呢?熟悉 linux 的同窗必定知道,rc 結尾的文件一般表明運行時自動加載的文件,配置等。一樣在這裏也是有一樣做用的。裏面的env
字段,能夠對 BABEL_ENV 或 NODE_ENV 指定不一樣的環境變量,進行不一樣編譯。eslintignore
通知eslint
忽略那些不該該被檢測的文件。eslintrc
eslint 配置文件,使 JavaScript 代碼規範化,標準化書寫。
首先能夠參考這篇文章React on ES6+,裏面說起了關於如何使用es6進行react開發的方法。webpack
使用
React.Component
代替React.createClass
git
// The ES5 way
var Photo = React.createClass({
handleDoubleTap: function(e) { … },
render: function() { … },
});
// The ES6+ way
class Photo extends React.Component {
handleDoubleTap(e) { … }
render() { … }
}
複製代碼
使用
static
關鍵字完成屬性初始化工做(這是es7的內容,注意state
能夠直接經過state = { key: value }
來定義)es6
// The ES5 way
var Video = React.createClass({
getDefaultProps: function() {
return {
autoPlay: false,
maxLoops: 10,
};
},
getInitialState: function() {
return {
loopsRemaining: this.props.maxLoops,
};
},
propTypes: {
autoPlay: React.PropTypes.bool.isRequired,
maxLoops: React.PropTypes.number.isRequired,
posterFrameSrc: React.PropTypes.string.isRequired,
videoSrc: React.PropTypes.string.isRequired,
},
});
// The ES6+ way
class Video extends React.Component {
static defaultProps = {
autoPlay: false,
maxLoops: 10,
}
static propTypes = {
autoPlay: React.PropTypes.bool.isRequired,
maxLoops: React.PropTypes.number.isRequired,
posterFrameSrc: React.PropTypes.string.isRequired,
videoSrc: React.PropTypes.string.isRequired,
}
state = {
loopsRemaining: this.props.maxLoops,
}
}
複製代碼
在
constractor
中定義state
github
// The ES5 way
var Video = React.createClass({
getInitialState: function() {
return {
loopsRemaining: ...
};
}
});
//The ES6 way
class Video extends React.Component {
constructor(props) {
super(props)
this.state = {
loopsRemaining: ...
}
}
}
複製代碼
經過es6的模塊功能,能夠很方便地利用webpack實現頁面組件化。
咱們總共有7個小的demo,我把它們做爲不一樣的組件,最終加載到根組件中:
// app.js
import React, { Component } from 'react'
import Component1 from './demo1.js'
import Component2 from './demo2.js'
import Component3 from './demo3.js'
import Component4 from './demo4.js'
import Component5 from './demo5.js'
import Component6 from './demo6.js'
import Component7 from './demo7.js'
export default class Demo extends Component {
render() {
return (
<div>
<Component1></Component1>
<Component2></Component2>
<Component3 title='Props example'></Component3>
<Component4>
<span>Hello</span>
<span>React</span>
</Component4>
<Component5 content='This is the content'></Component5>
<Component6></Component6>
<Component7></Component7>
</div>
)
}
}
複製代碼
具體請進入個人項目查看代碼。
能夠看到,經過es6的改寫,在react中實現組件化是很是清晰簡單的,只須要把須要的組件import進來便可。
另外,因爲我很是討厭行內樣式,而且是不寫less會死星人,因此並無按照官方推薦的樣子去定義一個style object
,而是經過less-loader
在須要定義樣式的地方直接把樣式require進來,像這樣:
// demo7.js
render() {
let word = this.state.words
require('../less/test.less')
return (
<div>
<h3 className='test-h1'>DEMO 7, state</h3>
<p>{ word }</p>
<input type="text" onChange={ this.stateFn }/>
<hr/>
</div>
)
}
複製代碼
這個demo僅僅做爲入門學習使用,react更多深層次的內容可能會在後續慢慢更新,好比加上react-router,redux什麼的……若是這篇文章可以對你有所啓發是最好不過,若是有任何錯漏也歡迎拍磚指出,謝謝你們~