2018-12-20 props和state

1.概念

1)props是屬性钢悲,可當(dāng)作參數(shù)的傳遞点额,是從上層模塊向下層模塊進(jìn)行的傳遞。

2)state是狀況莺琳,可當(dāng)作局域的變量还棱,即一般在自己的模塊里使用〔训龋可通過setState去改變值诱贿。

2.使用

1)props:組件從概念上來講,就像一個(gè)函數(shù)咕缎≈槭可以接受一個(gè)參數(shù)作為輸入值,這個(gè)參數(shù)就是props凭豪,所以可以把props理解為從外部傳入組件內(nèi)部的數(shù)據(jù)焙蹭。由于是react是單向數(shù)據(jù)流,所以props可以從父級(jí)組件向子組件傳遞嫂伞。

下面是一個(gè)實(shí)現(xiàn)列表的例子:

export default class Item extends React.Component {render () {return (<li>{this.props.item}</li>)}}

import Item from './item'

export default class ItemList extends React.Component{ const itemList = data.map(item=> <Item item=item />); render(){ return ({itemList})} }

在組件中孔厉,我們最好為props配置一個(gè)defaultProps,并且定制它的類型帖努,如:

Item.defaultProps = { item : "Hello World"}

Item.propType = {item: PropType.string}

關(guān)于類型撰豺,有一下幾種:

optionalArray: PropTypes.array,

optionalBool: PropTypes.bool,

optionalFunc: PropTypes.func,

optionalNumber: PropTypes.number,

optionalObject: PropTypes.object,

optionalString: PropTypes.string,

optionalSymbol: PropTypes.symbol

2)State:一個(gè)數(shù)據(jù)的顯示形態(tài)可以由數(shù)據(jù)狀態(tài)和外部參數(shù)決定,外部參數(shù)也就是props拼余,數(shù)據(jù)狀態(tài)就是state污桦。

export default class ItemList extends React.Class{ constructor(){ super(); this.state = {itemList:'一些數(shù)據(jù)'?}? } , render() {return (this.state.itemList)}}

我們通過setState方法去改變state的值。一般我們會(huì)通過異步去獲取數(shù)據(jù)匙监,所以我們一般在didMount階段來執(zhí)行操作:

ComponentDidMount(){

fetch('url').then(response=>response.json()).then((data) => { this.setState({itemList:item})

})}

當(dāng)我們調(diào)用this.setState方法后凡橱,React會(huì)自動(dòng)更新狀態(tài),重新調(diào)用render亭姥,界面就進(jìn)行重新渲染了稼钩。

注意:React在ES6后就去除了getInitialState,規(guī)定state在constructor里實(shí)現(xiàn)达罗。

3.兩者的區(qū)別

1)state是組件自己管理數(shù)據(jù)坝撑,控制自己的狀態(tài),可變

2)props是外部傳入的參數(shù),不可變

3)沒有state的叫坐無狀態(tài)組件巡李,反之叫有狀態(tài)的組件抚笔。

4)多用props,少用state击儡。


4.什么是ES5,ES6

1)什么是ES5

作為ECMAScript第五個(gè)版本(第四版因?yàn)檫^于復(fù)雜廢棄了)蝠引,瀏覽器支持情況可看第一副圖阳谍,增加特性如下。

1. strict模式

嚴(yán)格模式螃概,限制一些用法矫夯,'use?strict';

2.?Array增加方法

增加了every、some?吊洼、forEach训貌、filter?、indexOf冒窍、lastIndexOf递沪、isArray、map综液、reduce款慨、reduceRight方法

PS: 還有其他方法?Function.prototype.bind、String.prototype.trim谬莹、Date.now

3.?Object方法

Object.getPrototypeOf

Object.create

Object.getOwnPropertyNames

Object.defineProperty

Object.getOwnPropertyDescriptor

Object.defineProperties

Object.keys

Object.preventExtensions / Object.isExtensible

Object.seal / Object.isSealed

Object.freeze / Object.isFrozen

PS:只講有什么檩奠,不講是什么。

2)什么是ES6

ECMAScript6在保證向下兼容的前提下附帽,提供大量新特性埠戳,目前瀏覽器兼容情況如下:

ES6特性如下:

1.塊級(jí)作用域 關(guān)鍵字let, 常量const

2.對(duì)象字面量的屬性賦值簡(jiǎn)寫(property value shorthand)

var obj = {

? ? // __proto__

? ? __proto__: theProtoObj,

? ? // Shorthand for ‘handler: handler’

? ? handler,

? ? // Method definitions

? ? toString() {

? ? // Super calls

? ? return "d " + super.toString();

? ? },

? ? // Computed (dynamic) property names

? ? [ 'prop_' + (() => 42)() ]: 42

};

3.賦值解構(gòu)

let singer = { first: "Bob", last: "Dylan" };

let { first: f, last: l } = singer; // 相當(dāng)于 f = "Bob", l = "Dylan"

let [all, year, month, day] =? /^(\d\d\d\d)-(\d\d)-(\d\d)$/.exec("2015-10-25");

let [x, y] = [1, 2, 3]; // x = 1, y = 2

4.函數(shù)參數(shù) - 默認(rèn)值、參數(shù)打包蕉扮、?數(shù)組展開(Default 整胃、Rest 、Spread)

//Default

function findArtist(name='lu', age='26') {

? ? ...

}

//Rest

function f(x, ...y) {

? // y is an Array

? return x * y.length;

}

f(3, "hello", true) == 6

//Spread

function f(x, y, z) {

? return x + y + z;

}

// Pass each elem of array as argument

f(...[1,2,3]) == 6

5.箭頭函數(shù) Arrow functions

(1).簡(jiǎn)化了代碼形式喳钟,默認(rèn)return表達(dá)式結(jié)果爪模。

(2).自動(dòng)綁定語(yǔ)義this,即定義函數(shù)時(shí)的this荚藻。如上面例子中屋灌,forEach的匿名函數(shù)參數(shù)中用到的this。

6.字符串模板 Template strings

var name = "Bob", time = "today";

`Hello ${name}, how are you ${time}?`

// return "Hello Bob, how are you today?"

7. Iterators(迭代器)+ for..of

迭代器有個(gè)next方法应狱,調(diào)用會(huì)返回:

(1).返回迭代對(duì)象的一個(gè)元素:{ done: false, value: elem }

(2).如果已到迭代對(duì)象的末端:{ done: true, value: retVal }

for (var n of ['a','b','c']) {

? console.log(n);

}

// 打印a共郭、b、c

8.生成器 (Generators)

9.Class

Class,有constructor除嘹、extends写半、super,但本質(zhì)上是語(yǔ)法糖(對(duì)語(yǔ)言的功能并沒有影響尉咕,但是更方便程序員使用)叠蝇。

class Artist {

? ? constructor(name) {

? ? ? ? this.name = name;

? ? }

? ? perform() {

? ? ? ? return this.name + " performs ";

? ? }

}

class Singer extends Artist {

? ? constructor(name, song) {

? ? ? ? super.constructor(name);

? ? ? ? this.song = song;

? ? }

? ? perform() {

? ? ? ? return super.perform() + "[" + this.song + "]";

? ? }

}

let james = new Singer("Etta James", "At last");

james instanceof Artist; // true

james instanceof Singer; // true

james.perform(); // "Etta James performs [At last]"

10.Modules

ES6的內(nèi)置模塊功能借鑒了CommonJS和AMD各自的優(yōu)點(diǎn):

(1).具有CommonJS的精簡(jiǎn)語(yǔ)法、唯一導(dǎo)出出口(single exports)和循環(huán)依賴(cyclic dependencies)的特點(diǎn)年缎。

(2).類似AMD悔捶,支持異步加載和可配置的模塊加載。

// lib/math.js

export function sum(x, y) {

? return x + y;

}

export var pi = 3.141593;

// app.js

import * as math from "lib/math";

alert("2π = " + math.sum(math.pi, math.pi));

// otherApp.js

import {sum, pi} from "lib/math";

alert("2π = " + sum(pi, pi));

Module Loaders:

// Dynamic loading – ‘System’ is default loader

System.import('lib/math').then(function(m) {

? alert("2π = " + m.sum(m.pi, m.pi));

});

// Directly manipulate module cache

System.get('jquery');

System.set('jquery', Module({$: $})); // WARNING: not yet finalized

11.Map + Set + WeakMap + WeakSet

四種集合類型单芜,WeakMap蜕该、WeakSet作為屬性鍵的對(duì)象如果沒有別的變量在引用它們,則會(huì)被回收釋放掉洲鸠。

// Sets

var s = new Set();

s.add("hello").add("goodbye").add("hello");

s.size === 2;

s.has("hello") === true;

// Maps

var m = new Map();

m.set("hello", 42);

m.set(s, 34);

m.get(s) == 34;

//WeakMap

var wm = new WeakMap();

wm.set(s, { extra: 42 });

wm.size === undefined

// Weak Sets

var ws = new WeakSet();

ws.add({ data: 42 });//Because the added object has no other references, it will not be held in the set

12.Math + Number + String + Array + Object APIs

一些新的API

Number.EPSILON

Number.isInteger(Infinity) // false

Number.isNaN("NaN") // false

Math.acosh(3) // 1.762747174039086

Math.hypot(3, 4) // 5

Math.imul(Math.pow(2, 32) - 1, Math.pow(2, 32) - 2) // 2

"abcde".includes("cd") // true

"abc".repeat(3) // "abcabcabc"

Array.from(document.querySelectorAll('*')) // Returns a real Array

Array.of(1, 2, 3) // Similar to new Array(...), but without special one-arg behavior

[0, 0, 0].fill(7, 1) // [0,7,7]

[1, 2, 3].find(x => x == 3) // 3

[1, 2, 3].findIndex(x => x == 2) // 1

[1, 2, 3, 4, 5].copyWithin(3, 0) // [1, 2, 3, 1, 2]

["a", "b", "c"].entries() // iterator [0, "a"], [1,"b"], [2,"c"]

["a", "b", "c"].keys() // iterator 0, 1, 2

["a", "b", "c"].values() // iterator "a", "b", "c"

Object.assign(Point, { origin: new Point(0,0) })

13.?Proxies

使用代理(Proxy)監(jiān)聽對(duì)象的操作堂淡,然后可以做一些相應(yīng)事情。

var target = {};

var handler = {

? get: function (receiver, name) {

? ? return `Hello, ${name}!`;

? }

};

var p = new Proxy(target, handler);

p.world === 'Hello, world!';

可監(jiān)聽的操作: get扒腕、set绢淀、has、deleteProperty瘾腰、apply更啄、construct、getOwnPropertyDescriptor居灯、defineProperty祭务、getPrototypeOf、setPrototypeOf怪嫌、enumerate义锥、ownKeys、preventExtensions岩灭、isExtensible拌倍。

14.Symbols

Symbol是一種基本類型。Symbol 通過調(diào)用symbol函數(shù)產(chǎn)生噪径,它接收一個(gè)可選的名字參數(shù)柱恤,該函數(shù)返回的symbol是唯一的。

var key = Symbol("key");

var key2 = Symbol("key");

key == key2? //false

15.Promises

Promises是處理異步操作的對(duì)象找爱,使用了 Promise 對(duì)象之后可以用一種鏈?zhǔn)秸{(diào)用的方式來組織代碼梗顺,讓代碼更加直觀(類似jQuery的deferred?對(duì)象)。

function fakeAjax(url) {

? return new Promise(function (resolve, reject) {

? ? // setTimeouts are for effect, typically we would handle XHR

? ? if (!url) {

? ? ? return setTimeout(reject, 1000);

? ? }

? ? return setTimeout(resolve, 1000);

? });

}

// no url, promise rejected

fakeAjax().then(function () {

? console.log('success');

},function () {

? console.log('fail');

});

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末车摄,一起剝皮案震驚了整個(gè)濱河市寺谤,隨后出現(xiàn)的幾起案子仑鸥,更是在濱河造成了極大的恐慌,老刑警劉巖变屁,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件眼俊,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡粟关,警方通過查閱死者的電腦和手機(jī)疮胖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來闷板,“玉大人澎灸,你說我怎么就攤上這事』坠福” “怎么了击孩?”我有些...
    開封第一講書人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵迫悠,是天一觀的道長(zhǎng)鹏漆。 經(jīng)常有香客問我,道長(zhǎng)创泄,這世上最難降的妖魔是什么艺玲? 我笑而不...
    開封第一講書人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮鞠抑,結(jié)果婚禮上饭聚,老公的妹妹穿的比我還像新娘。我一直安慰自己搁拙,他們只是感情好秒梳,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著箕速,像睡著了一般酪碘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上盐茎,一...
    開封第一講書人閱讀 49,950評(píng)論 1 291
  • 那天兴垦,我揣著相機(jī)與錄音,去河邊找鬼字柠。 笑死探越,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的窑业。 我是一名探鬼主播钦幔,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼常柄!你這毒婦竟也來了节槐?” 一聲冷哼從身側(cè)響起搀庶,我...
    開封第一講書人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎铜异,沒想到半個(gè)月后哥倔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡揍庄,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年咆蒿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蚂子。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡沃测,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出食茎,到底是詐尸還是另有隱情蒂破,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布别渔,位于F島的核電站附迷,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏哎媚。R本人自食惡果不足惜喇伯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望拨与。 院中可真熱鬧稻据,春花似錦、人聲如沸买喧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)淤毛。三九已至今缚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間钱床,已是汗流浹背荚斯。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留查牌,地道東北人事期。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像纸颜,于是被迫代替她去往敵國(guó)和親兽泣。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容