React環境搭建


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 國際許可協議進行許可。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM