react環境搭建

豐臣正一發表於2020-07-21

React是當下前端生態圈流行的框架之一,與Vue和Angular並稱前端三架馬車。今天,我們就一起來學習下React,今天的主要內容有。

  • 利用React腳手架create-react-app搭建專案
  • 編寫一個React計陣列件

利用React腳手架create-react-app搭建專案

這裡筆者例舉兩種利用create-react-app搭建專案的方式

全域性安裝

npm i -g create-react-app
create-react-app my-app
cd my-app && npm start

npx安裝

npx create-react-app my-app
cd my-app && npm start

這兩種方案各有各的好處,我們先說全域性安裝吧。npm i -g create-react-app只需要執行一次,後面你在任意目錄執行create-react-app project就可以建立一個react專案的腳手架,這免去了開發者很多配置的工作。npx安裝需要的npm版本在5.2.0以上,它的原理大致是先去全域性的node_modules下找找看有沒有這個包,沒有的話再去本地專案找找有沒有這個包,還是沒有就去遠端拉一個最新的下來。

這兩種筆者更傾向於使用第二種npx安裝的方式。這裡我給出兩個理由,第一個,當下前端發展太快了,各種包庫更新迭代的太快,如果你全域性安裝的話,用接地氣的話感覺就是有點跟不上時代(PS: 除非是去那種網路不通的公司)。第二個,它有可能跟其他的全域性包產生一個衝突,就以create-react-app為例,如果你本地安裝了yarn的全域性包,你將有機會看到yarnpkg add --exact react react-dom react-scripts --cwd has failed的錯誤,大致應該是沒有用npm install而是用yarn導致的,這裡刪掉全域性的yarn包可以解決這個問題。

編寫一個React計陣列件

我們要實現這樣一個元件,點選加號按鈕數字加1,點選減號按鈕數字減1。

我們先定義一個檔案ClickCounter.js, 這裡的命名規範講一下,類似於JAVA的導包com.ataola.utils這種,使用者的這個行為是點選,點選是為了計數。當然啦使用者點選它還可以搞些別的事情,比如說報名啊,回到頂部等等等等,所以把Click放在前面,Counter放在後面。

JSX語法

即Javascript的語法擴充套件。擴充套件了以後,你可以把一坨HTML程式碼丟到Javascript裡面來寫。形如樓下這樣。

render() {
    return (
      <div>
        <button onClick={ this.Add }>Add</button>
        <button onClick={ this.Reduce }>Reduce</button>
        <div>Count: { this.state.count }</div>
      </div>
    )
  }

在Render函式中,我們返回一段html程式碼,寫著一個加一個減按鈕,然後顯示相應的包。

引入相應的元件包

import React, { Component } from 'react';

編寫相關類

class ClickCounter extends Component {
  constructor(props) {
    super(props);
    this.state = { count: 0 };
    this.Add = this.Add.bind(this);
    this.Reduce = this.Reduce.bind(this);
  }

  Add() {
    this.setState({ count: this.state.count + 1 });
  }

  Reduce() {
    this.setState({ count: this.state.count - 1 })
  }

  render() {
    return (
      <div>
        <button onClick={ this.Add }>Add</button>
        <button onClick={ this.Reduce }>Reduce</button>
        <div>Count: { this.state.count }</div>
      </div>
    )
  }
}

暴露相應的類

export default ClickCounter;

在index.js中引入我們建立的類,並加入到渲染函式中

import ClickCounter from './ClickCounter';

ReactDOM.render(
  <React.StrictMode>
    <ClickCounter/>
  </React.StrictMode>,
  document.getElementById('root')
);

至此我們已經學會了搭建React專案,並能夠設計簡單的React元件。

問題思考

this.setState({ count: this.state.count + 1 });這句我能不能修改成this.state.count++?

這句話的意思翻譯過來就是,我能不能直接手動擋操作state裡面的變數?答案肯定是能寫成那種形式,你能訪問到那個物件,你給它加加有問題嗎?但是從React設計理念上,這是非常暴力魯棒的做法,你就想嘛,難道這個setState是放著讓你看噠,很顯然不是的。因為React在設計state時候是非同步的,當你呼叫setState的時候,它會被放入非同步佇列中,所以它也不是馬上去改變state裡面的資料。而你這個加加的寫法是同步的馬上去修改,假如說哈,你的加法是用加加這種寫法,然後你的減法是用setState()這種,當你點選加的時候React,它心態崩了呀,它也不知道你想幹嘛,它想幹的是非同步的事情,而你要乾的是同步的事情,它瘋了。。。。。

好在,現在的編譯器啊、或者配合ESLint智慧,它會巧妙地提示你Do not mutate state directly. Use setState() react/no-direct-mutation-stateDo not mutate state directly. Use setState() react/no-direct-mutation-state,讓你巧妙地避開這種違背框架設計理念的寫法。

思考一下,Vue裡面可不可以,當然是可以的啦。

具體的參考下樓下地址:

React demo1: https://github.com/ataola/react-Inkjet/tree/master/code/demo-1

Vue demo1: https://github.com/ataola/vue-Graffiti/tree/master/code/demo1

參考文獻

《深入淺出React和Redux》 機械工業出版社 程墨 編著

知識共享許可協議
本作品採用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議進行許可。

相關文章