react項目入門03

1. 腳手架安裝[create-react-app]

腳手架特點:模塊化芦拿,組件化,工程化(可通過命令編譯)
(https://github.com/facebookincubator/create-react-app)

npm install -g create-react-app
create-react-app my-app

或者

yarn create react-app antd-demo

  • .gitignore
  • package.json 包描述文件
    1.標識(name version) 2.依賴 3.運行script (npm run)

2.修改 webpack 的配置

引入 react-app-rewired 并修改 package.json 里的啟動配置:

$ yarn add react-app-rewired

引入 react-app-rewired 并修改 package.json 里的啟動配置查邢。由于新的 react-app-rewired@2.x版本的關(guān)系蔗崎,你需要還需要安裝 customize-cra(antd 3.16.2)

$ yarn add customize-cra

/* package.json */
"scripts": {
-   "start": "react-scripts start",
-   "build": "react-scripts build",
-   "test": "react-scripts test --env=jsdom",
+   "start": "react-app-rewired start",
+   "build": "react-app-rewired build",
+   "test": "react-app-rewired test --env=jsdom",
}

然后在項目根目錄創(chuàng)建一個 config-overrides.js 用于修改默認配置扰藕。

module.exports = function override(config, env) {
  // do stuff with the webpack config...
  return config;
};

3.antd-mobile按需加載

babel-plugin-import 是一個用于按需加載組件代碼和樣式的 babel 插件(原理)缓苛,安裝它并修改 config-overrides.js 文件。

yarn add babel-plugin-import

// const { injectBabelPlugin } = require('react-app-rewired');
 // module.exports = function override(config, env) {
//config = injectBabelPlugin(['import', { libraryName: 'antd-mobile', style: 'css' }], config);
  //  return config;
  //};
     const { override, fixBabelImports } = require('customize-cra');
     module.exports = override(
       fixBabelImports('import', {
         libraryName: 'antd-mobile',
         libraryDirectory: 'es',
        style: 'css',
      }),
     );

更改引用方式

- import Button from 'antd-mobile/lib/button';
+ import { Button } from 'antd-mobile';

3.2.less配置

yarn add less less-loader

修改config-overrides.js

const { override, fixBabelImports, addLessLoader } = require('customize-cra');

module.exports = override(
    fixBabelImports('import', {
        libraryName: 'antd',
        libraryDirectory: 'es',
        style: true,
    }),
    addLessLoader({
        javascriptEnabled: true,
    }),
);
  • 使用
import "./index.less";
 <p className="name">{val.name}</p>

4.配置別名

const path = require('path');
function resolve(dir) { return path.join(__dirname, '.', dir)
}
module.exports = function override(config, env) {
    config.resolve.alias = { '@': resolve('src')
    } return config;
}

重啟開發(fā)服務(wù)器后邓深,就可以使用@來表示'src'的絕對路徑了

5驗證 propTypes

yarn add prop-types

  • 第一個方法:defaultProps
    給對象設(shè)置默認屬性未桥,如果傳來的對象沒有對應(yīng)值,則把這里的屬性賦值給該對象芥备。
  • 第二個方法:propTypes
    設(shè)置props的類型冬耿,如上:name規(guī)定為string類型,isRequeired是說明該值不能為空萌壳,必須傳遞
  • 注意為了性能考慮亦镶,只在開發(fā)環(huán)境驗證 propTypes

import PropTypes from 'prop-types';
export default class Item extends React.PureComponent {

    static defaultProps = {
        name: 'item',
        age:18
    };

    static propTypes = {
        name:PropTypes.string.isRequired,
        age:PropTypes.number.isRequired,
    };

    render() {
        let {name,age} = this.props;
        return (
            <div>
                <div>name:{name} , </div>
                <div>age:{age}</div>
            </div>
        )
    }
}

6. 組件三大屬性

  • state:組件內(nèi)部可變狀態(tài)數(shù)據(jù)
  • props:組件外部數(shù)據(jù)
  • refs:標識組件某個元素,不要過度使用
<input type="text" ref={node=>this.inputa=node}/>

ref=回調(diào)函數(shù)袱瓮,第一次渲染是執(zhí)行缤骨,node是當前的dom元素,函數(shù)體里面將node保存到組件對象this上尺借。通過this.inputa.value取值绊起。

其他
  • todo list
    unshift()
  • style={{width: 10}},外側(cè){}表示里面是js代碼,內(nèi)存{}表示里面是js對象

7. form

  • 受控組件: 表單輸入數(shù)據(jù)自動收集到狀態(tài)燎斩,提交時直接讀狀態(tài)虱歪,寫法復(fù)雜蜂绎;但操作狀態(tài)符合react思想,官方推薦
<input type="text" value={this.state.val} onChange={this.handleChange}/>
  • 非受控組件: 需要提交時才讀取輸入框中的數(shù)據(jù)实蔽,寫法簡單,但操作原生dom不符合react思想
submit=()=>{ const name=this.inputa.value}
<input type="text" ref={node=>this.inputa=node}/>

項目中均可使用荡碾,無效率差別。

8. 組件生命周期

  • render
  • componentDidMount: 初始化異步操作局装,開啟監(jiān)聽坛吁,發(fā)送ajax請求
  • componentWillUnmount:收尾工作,eg.清理定時器
 componentDidMount() {
    this.intervalId = setInterval(function() {
      console.log("定時器執(zhí)行...");
    }, 200);
  }
  componentWillUnmount() {
      clearInterval(this.intervalId);
  }
  • 定時器需放到當前組件對象this里面铐尚,才能在不同作用域調(diào)用到

參考使用React構(gòu)建精簡版本掘金(一)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末拨脉,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子宣增,更是在濱河造成了極大的恐慌玫膀,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件爹脾,死亡現(xiàn)場離奇詭異帖旨,居然都是意外死亡,警方通過查閱死者的電腦和手機灵妨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門解阅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人泌霍,你說我怎么就攤上這事更啄〗庠澹” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵颅筋,是天一觀的道長赂鲤。 經(jīng)常有香客問我乎婿,道長柱衔,這世上最難降的妖魔是什么堪唐? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮缅疟,結(jié)果婚禮上分别,老公的妹妹穿的比我還像新娘。我一直安慰自己窿吩,他們只是感情好,可當我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布错览。 她就那樣靜靜地躺著纫雁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪倾哺。 梳的紋絲不亂的頭發(fā)上轧邪,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天刽脖,我揣著相機與錄音,去河邊找鬼忌愚。 笑死曲管,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的硕糊。 我是一名探鬼主播院水,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼简十!你這毒婦竟也來了檬某?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤螟蝙,失蹤者是張志新(化名)和其女友劉穎恢恼,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體胰默,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡场斑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了牵署。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片漏隐。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖碟刺,靈堂內(nèi)的尸體忽然破棺而出锁保,到底是詐尸還是另有隱情,我是刑警寧澤半沽,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布爽柒,位于F島的核電站,受9級特大地震影響者填,放射性物質(zhì)發(fā)生泄漏浩村。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一占哟、第九天 我趴在偏房一處隱蔽的房頂上張望心墅。 院中可真熱鬧,春花似錦榨乎、人聲如沸怎燥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽铐姚。三九已至,卻和暖如春肛捍,著一層夾襖步出監(jiān)牢的瞬間隐绵,已是汗流浹背之众。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留依许,地道東北人棺禾。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像峭跳,于是被迫代替她去往敵國和親膘婶。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,472評論 2 348