react筆記

1.如果你熟悉 HTML,那么 JSX 對于你來說是沒有任何壓力的,因為 HTML 中的所有標簽,在 JSX 中都是支持的,基本上沒有學習成本,只有如下幾點略微的不同:

·?class 屬性變?yōu)?className

·?tabindex 屬性變?yōu)?tabIndex

·?for 屬性變?yōu)?htmlFor

·?textarea 的值通過需要通過 value 屬性來指定

·?style 屬性的值接收一個對象,css 的屬性變?yōu)轳劮鍖懛ǎ纾篵ackgroundColor。

2.需要注意,不管那種方式,組件的名稱首字母必須為大寫。嚴格來說,是 JSX 要求用戶自定義的組件名首字母必須為大寫

3.屬性必須為只讀的,這一點非常重要,請嚴格遵守。對應到上面說到的,如果把組件理解為一個函數(shù),那么這個函數(shù)必須為一個純函數(shù)(Pure function),在純函數(shù)中不能修改其參數(shù),確定的輸入必須有確定的輸出。

雖然有些時候,你修改了組件的屬性,貌似也能正常工作。沒錯,因為 JavaScript 語言特性的原因,沒人能阻止你這么做。但是請先相信我,嚴格遵守這條規(guī)則不僅能讓你少踩很多坑,而且能讓你的應用穩(wěn)定性更強、維護性更強。如果你直接修改組件的屬性,React 并不會感知到此修改,從而不會重新渲染組件,就導致了當前組件的視圖展示與數(shù)據(jù)不一致。

4.?React 提供了相應的機制可以設置組件屬性的默認值,如下所示,你需要通過組件的靜態(tài)字段?defaultProps?來設置組件屬性的默認值。如下所示:

import?React, {Component} from 'react';

class?HelloMessage?extends?Component?{

????render() {

????????return?<div>Hello?{this.props.name}.</div>;

????}

}HelloMessage.defaultProps = {

????name: 'World'

}

這樣就可以了,<HelloMessage />?這樣不為組件設置任何屬性,那么它就會在頁面上展示Hello World.。

5.?我期望其?name?屬性只能是字符串類型的,你要是給我一個 Object,我是沒法正確展示的。為了在開發(fā)過程中盡快的發(fā)現(xiàn)這類問題,React 為組件添加了類型檢查的機制,你需要給組件設置靜態(tài)字段?propTypes?來設置組件各個屬性的類型檢查器。

import?React, {Component} from 'react';

import?PropTypes?from 'prop-types';

class?HelloMessage?extends?Component?{

????render() {

????????return?<div>Hello?{this.props.name}.</div>;

????}

}HelloMessage.defaultProps = {

????name: 'World'

}HelloMessage.propTypes = {

????name: PropTypes.string

}

6.下面是 React 提供的可用的數(shù)據(jù)類型檢查器。

·?PropTypes.array

·?PropTypes.bool

·?PropTypes.func

·?PropTypes.number

·?PropTypes.object

·?PropTypes.string

·?PropTypes.symbol

·?PropTypes.element?元素,其實就是 JSX 表達式,上一篇文章有說過 JSX 是?React.createElement?的語法糖,一個 JSX 表達式實際上會生成一個 JS 對象,在 React 中稱之為元素(Element)。

·?PropTypes.node?所有可以被渲染的數(shù)據(jù)類型,包括:數(shù)值, 字符串, 元素或者這些類型的數(shù)組。

·?PropTypes.instanceOf(Message)?某個類的實例

·?PropTypes.oneOf(['News', 'Photos'])?枚舉,屬性值必須為其中的某一個值。

·?PropTypes.oneOfType([PropTypes.string, PropTypes.number])?類型枚舉,屬性必須為其中某一個類型。

·?PropTypes.arrayOf(PropTypes.number)?屬性為一個數(shù)組,且數(shù)組中的元素必須符合指定類型。

·?PropTypes.objectOf(PropTypes.number)?屬性為一個對象,且對象中的各個字段的值必須符合指定類型。

·?PropTypes.any?任何類型

如果你想指定某些屬性為必需屬性,你可以鏈式調動其?isRequired?來標識某個屬性對于當前組件來說是必需的。

7.設置組件的屬性值

屬性的值可以用一對大括號?{ }?來包圍,其中可以指定任意的 JavaScript 表達式。如下所示:

return?(

????<User

????????name="Tom"????????????????????????????// 字符串

????????age={18} ?????????????????????????????// 數(shù)值

????????isActivated={true} ???????????????????// 布爾值

????????interests={['basketball', 'music']} ??// 數(shù)組

????????address={{ city:?'Beijing', road:?'BeiWuHuan'?}} // 對象

????/>

)

8.ReactDOM.render 在一個單頁面 web 應用中通常只調用一次。

組件可以通過 setState 改變內部狀態(tài) state 來更新視圖。

setState 多數(shù)情況下是異步的。

不要直接使用當前 state 的值生成下一個 state。

不要直接通過 this.state 修改 state。

9.

?

?

?

?

擴展運算符

擴展運算符用三個點號表示,功能是把數(shù)組或類數(shù)組對象展開成一系列用逗號隔開的值

var?foo = function(a, b, c) {

????console.log(a);

????console.log(b);

????console.log(c);

}

var?arr = [1, 2, 3];

//傳統(tǒng)寫法

foo(arr[0], arr[1], arr[2]);
//使用擴展運算符foo(...arr);//1

//2

//3

?

ES6 yield

一、介紹

  yield 關鍵字用來暫停和繼續(xù)一個生成器函數(shù)。我們可以在需要的時候控制函數(shù)的運行。?
  yield 關鍵字使生成器函數(shù)暫停執(zhí)行,并返回跟在它后面的表達式的當前值。與return類似,但是可以使用next方法讓生成器函數(shù)繼續(xù)執(zhí)行函數(shù)yield后面內容,直到遇到y(tǒng)ield暫停或return返回或函數(shù)執(zhí)行結束。

二、使用

函數(shù)返回對象包括value和done。其中value值是yield后面表達式值或return后面表達式值。done用于表示函數(shù)運行

function* ge() { ???//聲明時需要添加*,普通函數(shù)內部不能使用yield關鍵字,否則會出錯

??yield?'1';

??yield?'2';

??yield?'3';

??return?'4';

}

?

var a = ge(); ???//調用函數(shù)后不會運行,而是返回指向函數(shù)內部狀態(tài)的指針

a.next(); ???//?{ value:?'1', done:?false?} ??遇到y(tǒng)ield暫停

a.next(); ???//?{ value:?'2', done:?false?}

a.next(); ???//?{ value:?'3', done:?false?}

a.next(); ???//?{ value:?'4', done:?true} ???函數(shù)執(zhí)行完畢,返回done

a.next(); ???//?{ value:?undefined, done:?true} ?已經(jīng)執(zhí)行完畢,返回undefined

如果next沒有帶有參數(shù)true,yield不能返回值,返回undefined;next函數(shù)帶有參數(shù)true,即.next(true)時,那么yield就可以返回表達式的值,用于賦值。如果next帶有其他參數(shù),那么它就會將當前yield返回值置為該參數(shù)。如:

var?i = yield?1; ??// 將1賦值給i

三、for…of

for…of循環(huán)可以自動遍歷Generator函數(shù)時生成的Iterator對象。

function* ge()?{?

??yield?'1';

??yield?'2';

??yield?'3';

??return?'4';

}for(let?v of ge()){

??alert(V); ???// 1 2 3 4

}

?

四、yield與異步

函數(shù)在遇到y(tǒng)ield后暫停運行,我們可以在需要的地方使用next讓它繼續(xù)運行。并且必要時可以使用next傳入?yún)?shù)。

對于一些可能被多處引用的功能模塊,建議提煉成業(yè)務組件統(tǒng)一管理。這些組件一般有以下特征:

只負責一塊相對獨立,穩(wěn)定的功能;

沒有單獨的路由配置;

可能是純靜態(tài)的,也可能包含自己的 state,但不涉及 dva 的數(shù)據(jù)流,僅受父組件(通常是一個頁面)傳遞的參數(shù)控制。

?

?

model里面包括以下五部分:namespacestatereducerseffectssubscriptions,缺一不可。注意,這里也需要從service層導入相應的方法。

·?namespace 命名空間

namespace: 'projects'

·?state 相當于原生React中的state狀態(tài),用于存放數(shù)據(jù)的初始值。

state: {

????projectsData:?[]}

·?reducers 用于存放能夠改變view的action,這里按照官方說明,不應該做數(shù)據(jù)的處理,只是用來return state,從而改變view層的展示。

reducers:?{

????getProjectAllData(state, action) {

????????return { ...state, ...action.payload?};

????},

}

·?effects 用于和后臺交互,是處理異步數(shù)據(jù)邏輯的地方。

effects: {

????*getAllProjects({ payload = {} }, { call, put }) {

????????try?{

????????????const?res = yield?call(projectsService.checkBranches, payload);

????????????yield?put({

????????????????type: 'getProjectData',

????????????????payload: {

????????????????????projectsData: res.data

????????????????}

????????????});

????????} catch?(e) {

????????????message.warning(e.message);

????????}

????},

}

·?subscriptions 訂閱監(jiān)聽,比如監(jiān)聽路由,進入頁面如何如何,就可以在這里處理。相當于原生React中的componentWillMount方法。就比如上述代碼,監(jiān)聽/project路由,進入該路由頁面后,將發(fā)起getAllProjects aciton,獲取頁面數(shù)據(jù)。

subscriptions: {

????setup({ dispatch, history }) {

????????return?history.listen(({ pathname }) => {

????????????if?(pathname === '/projects') {

????????????????dispatch({

????????????????????type: 'getAllProjects'

????????????????});

????????????}

????????});

????}

}

數(shù)據(jù)流向

數(shù)據(jù)的改變發(fā)生通常是通過用戶交互行為或者瀏覽器行為(如路由跳轉等)觸發(fā)的,當此類行為會改變數(shù)據(jù)的時候可以通過 dispatch 發(fā)起一個 action,如果是同步行為會直接通過 Reducers?改變 State ,如果是異步行為(副作用)會先觸發(fā) Effects 然后流向 Reducers?最終改變 State。

?

在react怎樣引入jQuery

安裝jQuery

npm i jquery -S

在那個地方使用jQuery就在什么地方引入jQuery

import $ from ?'jquery'

類似

?

使用Link,先引入Link

import {

????BrowserRouter as Router,

????Route,

????Link

} from 'react-router-dom'

有個很笨的辦法可以出來效果:用menu的點擊事件獲取當前option的key存入state中,顯示內容根據(jù)key值判斷顯示隱藏。方法雖然很笨,但是效果還行!

?

導航欄樣式,好好看

上,模型展示時必須引jquery

?

改layout布局樣式,(我只改了margin)

解決es6兼容ie問題。上述兩行代碼

?

百度:Generator函數(shù)

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,182評論 6 543
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,489評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,290評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,776評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,510評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,866評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,860評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,036評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,585評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,331評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,536評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,058評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,754評論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,154評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,469評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,273評論 3 399
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,505評論 2 379

推薦閱讀更多精彩內容

  • react 基本概念解析 react 的組件聲明周期 react 高階組件,context, redux 等高級...
    南航閱讀 1,080評論 0 1
  • 作為一個合格的開發(fā)者,不要只滿足于編寫了可以運行的代碼。而要了解代碼背后的工作原理;不要只滿足于自己的程序...
    六個周閱讀 8,475評論 1 33
  • 關于JSX 考慮這樣一段代碼:const element = Hello, world! ;這段代碼既不是字符串...
    帶三本書閱讀 378評論 0 1
  • 是不是要足夠長的時間,才可以決定一件事情呢。比如把畢業(yè)后的這三年半串起來,你大概才能明白什么樣的生活是適合自己的。...
    更向遠行閱讀 138評論 1 1
  • Enhancements [Elixir] Support Erlang 17.5 and 18.0[Mix] S...
    EzVoodoo閱讀 182評論 0 1