初識React

定義組件的兩種方式

  • 函數(shù)定義
function Welcome(props) {
  return <h1>Hello, {props.name}</h1>;
}
  • 類定義
class Welcome extends React.Component {
  render() {
    return <h1>Hello, {this.props.name}</h1>;
  }
}

使用React時个盆,值得注意的點:

  • 所有的React組件必須像純函數(shù)那樣使用它們的props,不要修改傳入的props。(純函數(shù)拌牲,也就是不改變傳入值的函數(shù))

  • 正確使用狀態(tài):關于setState()有三點值得注意:

  1. 不要直接更新狀態(tài),使用setState()更新
// Correct
this.setState({comment: 'Hello'});
  1. 狀態(tài)更新可能是異步的(this.props, this.state可能異步更新歌粥,不應依靠它們?nèi)ビ嬎阈碌膕tate值)塌忽,如
// Wrong
this.setState({
  counter: this.state.counter + this.props.increment,
});

可使用setState()的第二種形式,傳入一個函數(shù)(函數(shù)的第一個參數(shù)為上一個state的值失驶,第二個參數(shù)為此次更新的props)

// Correct
this.setState((prevState, props) => ({
  counter: prevState.counter + props.increment
}));
  1. 狀態(tài)更新合并
    當你調用 setState() 時土居,React 將你提供的對象合并(淺合并)到當前狀態(tài)。
    (這里的淺合并是什么意思嬉探?擦耀?)
  • 數(shù)據(jù)自頂向下流動
    任何狀態(tài)始終由某些特定組件所有,并且從該狀態(tài)導出的任何數(shù)據(jù)或 UI 只能影響樹中下方的組件甲馋。
    父組件或子組件都不能知道某個組件是有狀態(tài)還是無狀態(tài)埂奈,并且它們不應該關心某組件是被定義為一個函數(shù)還是一個類。這就是為什么狀態(tài)通常被稱為局部或封裝定躏。 除了擁有并設置它的組件外账磺,其它組件不可訪問芹敌。
    組件可以選擇將其狀態(tài)作為屬性傳遞給其子組件。

  • 事件處理:若用類的方法垮抗,需要綁定事件的this

// 兩種綁定this方法
<button onClick={(e) => this.deleteRow(id, e)}>Delete Row</button>
<button onClick={this.deleteRow.bind(this, id)}>Delete Row</button>

值得注意的是氏捞,通過 bind 方式向監(jiān)聽函數(shù)傳參,在類組件中定義的監(jiān)聽函數(shù)冒版,事件對象 e 要排在所傳遞參數(shù)的后面

class Popper extends React.Component{
    constructor(){
        super();
        this.state = {name:'Hello world!'};
    }
    
    preventPop(name, e){    //事件對象e要放在最后
        e.preventDefault();
        alert(name);
    }
    
    render(){
        return (
            <div>
                <p>hello</p>
                {/* Pass params via bind() method. */}
                <a  onClick={this.preventPop.bind(this,this.state.name)}>Click</a>
            </div>
        );
    }
}
  • 阻止組件渲染:讓 render 方法返回 null 而不是它的渲染結果即可實現(xiàn)液茎。
  • key會作為給React的提示,但不會傳遞給你的組件辞嗡。如果需要使用和key相同的值捆等,請將其作為屬性傳遞
const content = posts.map((post) =>
  <Post
    key={post.id}
    id={post.id}
    title={post.title} />
);
  • 受控組件:在React中,可變的狀態(tài)通常保存在組件的狀態(tài)屬性中续室,并且只能用 setState()方法進行更新栋烤。我們通過使react變成一種單一數(shù)據(jù)源的狀態(tài)來結合二者。React負責渲染表單的組件仍然控制用戶后續(xù)輸入時所發(fā)生的變化挺狰。相應的明郭,其值由React控制的輸入表單元素稱為“受控組件”。

  • 狀態(tài)提升:狀態(tài)都是首先添加在需要渲染數(shù)據(jù)的組件中丰泊。此時薯定,如果另一個組件也需要這些數(shù)據(jù),你可以將數(shù)據(jù)提升至離它們最近的父組件中瞳购。你應該在應用中保持自上而下的數(shù)據(jù)流话侄,而不是嘗試在不同組件中同步狀態(tài)。

  • 組合VS繼承:建議使用組合而不是繼承來復用組件之間的代碼学赛。

一些組件不能提前知道它們的子組件是什么满葛。這些組件使用 children 屬性將子元素直接傳遞到輸出。

function FancyBorder(props) {
  return (
    <div className={'FancyBorder FancyBorder-' + props.color}>
      {props.children}
    </div>
  );
}

function WelcomeDialog() {
  return (
    <FancyBorder color="blue">
      <h1 className="Dialog-title">
        Welcome
      </h1>
      <p className="Dialog-message">
        Thank you for visiting our spacecraft!
      </p>
    </FancyBorder>
  );
}

請記住罢屈,組件可以接受任意元素,包括基本數(shù)據(jù)類型篇亭、React 元素或函數(shù)缠捌。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市译蒂,隨后出現(xiàn)的幾起案子曼月,更是在濱河造成了極大的恐慌,老刑警劉巖柔昼,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件哑芹,死亡現(xiàn)場離奇詭異,居然都是意外死亡捕透,警方通過查閱死者的電腦和手機聪姿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門碴萧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人末购,你說我怎么就攤上這事破喻。” “怎么了盟榴?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵曹质,是天一觀的道長。 經(jīng)常有香客問我擎场,道長羽德,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任迅办,我火速辦了婚禮宅静,結果婚禮上,老公的妹妹穿的比我還像新娘礼饱。我一直安慰自己坏为,他們只是感情好,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布镊绪。 她就那樣靜靜地躺著匀伏,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蝴韭。 梳的紋絲不亂的頭發(fā)上够颠,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天,我揣著相機與錄音榄鉴,去河邊找鬼履磨。 笑死,一個胖子當著我的面吹牛庆尘,可吹牛的內(nèi)容都是我干的剃诅。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼驶忌,長吁一口氣:“原來是場噩夢啊……” “哼矛辕!你這毒婦竟也來了?” 一聲冷哼從身側響起付魔,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤聊品,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后几苍,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體翻屈,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年妻坝,在試婚紗的時候發(fā)現(xiàn)自己被綠了伸眶。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惊窖。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖赚抡,靈堂內(nèi)的尸體忽然破棺而出爬坑,到底是詐尸還是另有隱情,我是刑警寧澤涂臣,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布盾计,位于F島的核電站,受9級特大地震影響赁遗,放射性物質發(fā)生泄漏署辉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一岩四、第九天 我趴在偏房一處隱蔽的房頂上張望哭尝。 院中可真熱鬧,春花似錦剖煌、人聲如沸材鹦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽桶唐。三九已至,卻和暖如春茉兰,著一層夾襖步出監(jiān)牢的瞬間尤泽,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工规脸, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留坯约,地道東北人。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓莫鸭,卻偏偏與公主長得像闹丐,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子被因,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355

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