React | 那個在 Class Component 中的 Arrow function (箭頭函式)

神Q超人
Enjoy life enjoy coding
4 min readApr 13, 2019
Photo by Nick Fewings on Unsplash

在 React 中,一般在 Component 內的 Method 都這麼定義:

然後這麼做比較麻煩的地方是,如果需要用到 this.setState 等事件,就得在呼叫時另外指定 this ,不然就是在 constructor 中直接定義了 this

接下來換成以 Arrow function 定義 Method :

雖然 Arrow function (箭頭函式)還在提案階段,但使用 Arrow function 的好處除了比較潮外,還能夠利用定義 Arrow function 時 this 不會變動的特性,就不用在使用時另外指定 this 了,不然摸摸你的良心,為每個 Method 綁定 this 真心覺得煩對吧?

好啦!那重點來了,因為使用了 React 所以我們會使用 webpack 去編譯對吧?然後編譯時就會使用 Babel 去當作 Loader 對吧?然後那些 Loader 一定有編譯 ES6 的 @babel/preset-env 和 JSX 的 @babel/preset-react 對吧?但是上面那個關於 Class Component 的 Arrow function 都不在那兩個 Loader 的管轄範圍內。

對,所以這篇的重點就是要說:

如果想使用潮潮的 Arrow function 在 Class Component 中,就得再裝 @babel/plugin-proposal-class-properties

npm install --save-dev @babel/plugin-proposal-class-properties

@babel/plugin-proposal-class-properties 是Babel 提供對 Class 的 Plugin ,這個 Plugin 會去處理 Class 內的語法,官網這裡有註明哪些語法會被處理

如果是使用 .babelrc.js 設定 Babel 的編譯,那只需要將這個 Plugin 添加上去:

module.exports = {
presets: ['@babel/preset-env', '@babel/preset-react'],
plugins: ['@babel/plugin-proposal-class-properties'],
}

如果是使用 webpack.config.js 設定 Babel 編譯的話,也是再把 Plugin 加上去就行了:

rules: [
{
test: /.js$/,
exclude: /node_modules/,
use: {
loader: 'babel-loader',
options: {
presets: ['@babel/preset-react','@babel/preset-env'],
plugins: ['@babel/plugin-proposal-class-properties'],
}
}
}
]

基本上 Coding Blog 的文章大略都會是這樣子,可能抓個五分鐘就能快速讀完 😂 ,也算是記錄自己都遇到哪些問題,所以也歡迎大家提出自己在工作上碰到的問題和踩過的坑 ,一起學習一起變強 ✌️ 。

參考文章

  1. https://stackoverflow.com/questions/42063854/arrow-function-syntax-not-working-with-webpack
  2. https://babeljs.io/docs/en/babel-plugin-proposal-class-properties

--

--