props

1.組件使你可以將ui劃分為一個一個獨立歇由,可復用的小部件仅孩,并可以對每個部件進行單獨的設計。
2.從定義上來說印蓖,組件就像JavaScript的函數(shù)辽慕,組件可以接收任意輸入(成為“props”),并返回react元素赦肃,用以描述屏幕顯示內(nèi)容溅蛉。
PS:可以把組件看出一個一個的函數(shù),props就是一個傳入到函數(shù)的對象參數(shù)他宛,里面就是組件所需的一個一個的變量船侧。state就是函數(shù)內(nèi)部定義的變量,可以直接操作

3.組件名稱總是以大寫字母開始厅各。PS:<div/>代表一個DOM標簽镜撩,而<welcome/>則代表一個組件,并且需要在 作用域中 有一個Welcome組件

4.提取組件:不要害怕把一個組件分為多個更小的組件队塘,因為過分復雜的組件一方面不利于復用袁梗,修改起來也麻煩,所以可以根據(jù)情況將其分解為多個小的組件憔古,注意組件的名稱定義要從組件本身的角度命名遮怜,而不是他被使用的上下文環(huán)境。
提取組件可能看起來是一個繁瑣的工作鸿市,但是在大型的 Apps 中可以回報給我們的是大量的可復用組件锯梁。一個好的經(jīng)驗準則是如果你 UI 的一部分需要用多次 (Button,Panel焰情,Avatar)陌凳,或者本身足夠復雜(App,F(xiàn)eedStory内舟,Comment)合敦,最好的做法是使其成為可復用組件。

5.Props是只讀的谒获。無論你用函數(shù)或類的方法來聲明組件蛤肌,它都無法修改其自身props壁却。所有react組件必須都是純函數(shù),并禁止修改其自身props裸准。如果有UI的需求展东,需要動態(tài)的改變,可以使用state炒俱,state允許react組件在不違反規(guī)則的情況下盐肃,根據(jù)用戶操作,網(wǎng)絡影響权悟,或者其他隨便什么東西砸王,來動態(tài)改變其輸出

6.更新UI的方式:
1.ReactDOM.render()方法來更新渲染的輸出

function tick() {
  const element = (
    <div>
      <h1>Hello, world!</h1>
      <h2>It is {new Date().toLocaleTimeString()}.</h2>
    </div>
  );
  ReactDOM.render(
    element,
    document.getElementById('root')
  );
}
setInterval(tick, 1000);

5.this.props 由 React 本身設定, 而 this.state 具有特殊的含義,但如果需要存儲一些不用于視覺輸出的內(nèi)容峦阁,則可以手動向類中添加額外的字段谦铃。

如果在 render() 方法中沒有被引用, 它不應該出現(xiàn)在 state 中。
注意我們把計時器ID直接存在 this 中榔昔。

class Clock extends React.Component {
  constructor(props) {
    super(props);
    this.state = {date: new Date()};
  }

  componentDidMount() {
    this.timerID = setInterval(
      () => this.tick(),
      1000
    );
  }

  componentWillUnmount() {
    clearInterval(this.timerID);
  }

  tick() {
    this.setState({
      date: new Date()
    });
  }

  render() {
    return (
      <div>
        <h1>Hello, world!</h1>
        <h2>It is {this.state.date.toLocaleTimeString()}.</h2>
      </div>
    );
  }
}

ReactDOM.render(
  <Clock />,
  document.getElementById('root')
);

我們來快速回顧一下該過程驹闰,以及調(diào)用方法的順序:

當 <Clock /> 被傳入 ReactDOM.render() 時, React 會調(diào)用 Clock組件的構造函數(shù)。 因為 Clock 要顯示的是當前時間撒会,所以它將使用包含當前時間的對象來初始化 this.state 嘹朗。我們稍后會更新此狀態(tài)。

然后 React 調(diào)用了 Clock 組件的 render() 方法诵肛。 React 從該方法返回內(nèi)容中得到要顯示在屏幕上的內(nèi)容屹培。然后,React 然后更新 DOM 以匹配 Clock 的渲染輸出怔檩。

當 Clock 輸出被插入到 DOM 中時褪秀,React 調(diào)用 componentDidMount() 生命周期鉤子。在該方法中珠洗,Clock 組件請求瀏覽器設置一個定時器來一次調(diào)用 tick()溜歪。

瀏覽器會每隔一秒調(diào)用一次 tick()方法若专。在該方法中许蓖, Clock 組件通過 setState() 方法并傳遞一個包含當前時間的對象來安排一個 UI 的更新。通過 setState(), React 得知了組件 state(狀態(tài))的變化, 隨即再次調(diào)用 render() 方法调衰,獲取了當前應該顯示的內(nèi)容膊爪。 這次,render() 方法中的 this.state.date 的值已經(jīng)發(fā)生了改變嚎莉, 從而米酬,其輸出的內(nèi)容也隨之改變。React 于是據(jù)此對 DOM 進行更新趋箩。

如果通過其他操作將 Clock 組件從 DOM 中移除了, React 會調(diào)用 componentWillUnmount() 生命周期鉤子, 所以計時器也會被停止赃额。

6.正確地使用 State(狀態(tài))
關于 setState() 有三件事是你應該知道的:
(1) 不要直接修改 state(狀態(tài))

例如加派,這樣將不會重新渲染一個組件:

// 錯誤
this.state.comment = 'Hello';
用 setState() 代替:

// 正確
this.setState({comment: 'Hello'});

唯一可以分配 this.state 的地方是構造函數(shù)。

(2)state(狀態(tài)) 更新可能是異步的
React 為了優(yōu)化性能跳芳,有可能會將多個 setState() 調(diào)用合并為一次更新芍锦。
因為 this.props 和 this.state 可能是異步更新的,你不能依賴他們的值計算下一個state(狀態(tài))飞盆。
例如, 以下代碼可能導致 counter(計數(shù)器)更新失斅α稹:

// 錯誤
this.setState({
  counter: this.state.counter + this.props.increment,
});

要彌補這個問題,使用另一種 setState() 的形式吓歇,它接受一個函數(shù)而不是一個對象孽水。這個函數(shù)將接收前一個狀態(tài)作為第一個參數(shù),應用更新時的 props 作為第二個參數(shù):

// 正確
this.setState((prevState, props) => ({
  counter: prevState.counter + props.increment
}));

我們在上面使用了一個[箭頭函數(shù)]但是也可以使用一個常規(guī)的函數(shù):

// 正確
this.setState(function(prevState, props) {
  return {
    counter: prevState.counter + props.increment
  };
});

(3)state(狀態(tài))更新會被合并
當你調(diào)用 setState()城看, React 將合并你提供的對象到當前的狀態(tài)中女气。
例如,你的狀態(tài)可能包含幾個獨立的變量:

constructor(props) {
    super(props);
    this.state = {
      posts: [],
      comments: []
    };
  }

然后通過調(diào)用獨立的 setState() 調(diào)用分別更新它們:

  componentDidMount() {
    fetchPosts().then(response => {
      this.setState({
        posts: response.posts
      });
    });

    fetchComments().then(response => {
      this.setState({
        comments: response.comments
      });
    });
  }

合并是淺合并测柠,所以 this.setState({comments}) 不會改變 this.state.posts 的值主卫,但會完全替換this.state.comments 的值。

7.數(shù)據(jù)向下流動
無論作為父組件還是子組件鹃愤,它都無法獲悉一個組件是否有狀態(tài)簇搅,同時也不需要關心另一個組件是定義為函數(shù)組件還是類組件。

這就是 state(狀態(tài)) 經(jīng)常被稱為 本地狀態(tài) 或 封裝狀態(tài)的原因软吐。 它不能被擁有并設置它的組件 以外的任何組件訪問瘩将。

一個組件可以選擇將 state(狀態(tài)) 向下傳遞,作為其子組件的 props(屬性):

8.處理事件
通過 React 元素處理事件跟在 DOM 元素上處理事件非常相似凹耙。但是有一些語法上的區(qū)別:

React 事件使用駝峰命名姿现,而不是全部小寫。
通過 JSX , 你傳遞一個函數(shù)作為事件處理程序肖抱,而不是一個字符串备典。
在 React 中略有不同:

<button onClick={activateLasers}>
  Activate Lasers
</button>
class LoggingButton extends React.Component {
  handleClick() {
    console.log('this is:', this);
  }

  render() {
    // 這個語法確保 `this` 被綁定在 handleClick 中
    return (
      <button onClick={(e) => this.handleClick(e)}>
        Click me
      </button>
    );
  }
}

這個語法的問題是,每次 LoggingButton 渲染時都創(chuàng)建一個不同的回調(diào)意述。在多數(shù)情況下提佣,沒什么問題。然而荤崇,如果這個回調(diào)被作為 prop(屬性) 傳遞給下級組件拌屏,這些組件可能需要額外的重復渲染。我們通常建議在構造函數(shù)中進行綁定术荤,以避免這類性能問題倚喂。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市瓣戚,隨后出現(xiàn)的幾起案子端圈,更是在濱河造成了極大的恐慌焦读,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件舱权,死亡現(xiàn)場離奇詭異吨灭,居然都是意外死亡,警方通過查閱死者的電腦和手機刑巧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門喧兄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人啊楚,你說我怎么就攤上這事吠冤。” “怎么了恭理?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵拯辙,是天一觀的道長。 經(jīng)常有香客問我颜价,道長涯保,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任周伦,我火速辦了婚禮夕春,結果婚禮上,老公的妹妹穿的比我還像新娘专挪。我一直安慰自己及志,他們只是感情好,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布寨腔。 她就那樣靜靜地躺著速侈,像睡著了一般。 火紅的嫁衣襯著肌膚如雪迫卢。 梳的紋絲不亂的頭發(fā)上倚搬,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天,我揣著相機與錄音乾蛤,去河邊找鬼每界。 笑死,一個胖子當著我的面吹牛幻捏,可吹牛的內(nèi)容都是我干的盆犁。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼篡九,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了醋奠?” 一聲冷哼從身側(cè)響起榛臼,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤伊佃,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后沛善,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體航揉,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年金刁,在試婚紗的時候發(fā)現(xiàn)自己被綠了帅涂。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡尤蛮,死狀恐怖媳友,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情产捞,我是刑警寧澤醇锚,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站坯临,受9級特大地震影響焊唬,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜看靠,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一赶促、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧挟炬,春花似錦芳杏、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至泊脐,卻和暖如春空幻,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背容客。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工秕铛, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人缩挑。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓但两,卻偏偏與公主長得像,于是被迫代替她去往敵國和親供置。 傳聞我的和親對象是個殘疾皇子谨湘,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354

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

  • 組件和 Props 組件讓你將 UI 拆分成獨立的,可復用的部件,并且把每個部件都隔離出來單獨考慮紧阔。 從概念上講坊罢,...
    soojade閱讀 590評論 0 1
  • Components使得UI被劃分為一個個獨立、可復用的零件擅耽,并單獨考慮每個零件活孩。在概念上,組件就像是JavaSc...
    莫銘閱讀 702評論 0 0
  • React版本:15.4.2**翻譯:xiyoki ** 組件允許你將UI拆分為獨立的可重用的部分乖仇,并孤立地考慮每...
    前端xiyoki閱讀 486評論 0 0
  • 最近看了一本關于學習方法論的書憾儒,強調(diào)了記筆記和堅持的重要性。這幾天也剛好在學習React乃沙,所以我打算每天堅持一篇R...
    gaoer1938閱讀 1,675評論 0 5
  • 組件可以將UI切分成一些獨立的起趾、可復用的部分,這樣我們就只需專注于構建每一個單獨的部分崔涂。組件就像是函數(shù)阳掐,他可以接收...
    張延偉閱讀 304評論 0 1