react 事件處理&條件渲染

處理事件

react事件使用駝峰命名棚蓄,而不是完全小寫。
通過JSX我們可以傳遞一個函數(shù)作為事件處理程序碍脏。
與DOM綁定事件類似:

function ActionLink() {
  function handleClick(e) {
    e.preventDefault();
    console.log('The link was clicked.');
  }

  return (
    <a href="#" onClick={handleClick}>
      Click me
    </a>
  );
}

注意:在 React 中你不能通過返回 false(即 return false; ) 來阻止默認行為梭依。必須明確調(diào)用 preventDefault 。

當使用一個 ES6 類定義一個組件時典尾,通常的一個事件處理程序是類上的一個方法役拴。
看一個例子:

class Toggle extends React.Component {
  constructor(props) {
    super(props);
    this.state = {isToggleOn: true};

    // 這個綁定是必要的,使`this`在回調(diào)中起作用
    this.handleClick = this.handleClick.bind(this);
  }

  handleClick() {
    console.log('this is:',this);
    this.setState(prevState => ({
      isToggleOn: !prevState.isToggleOn
    }));
  }

  render() {
    return (
      <button onClick={this.handleClick}>
        {this.state.isToggleOn ? 'ON' : 'OFF'}
      </button>
    );
  }
}

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

上面代碼中特意在構(gòu)造函數(shù)中指定了handleClick執(zhí)行時this的指向钾埂。
在JSX回調(diào)中你必須注意this的指向河闰。 在 JavaScript 中,類方法默認沒有綁定(bind)的褥紫。如果你忘記綁定 this.handleClick并將其傳遞給onClick姜性,那么在直接調(diào)用該函數(shù)時,this會是 undefined髓考。

我們可以使用CodePen試試修改代碼的結(jié)果:
把構(gòu)造函數(shù)中的綁定刪掉部念,再次點擊,控制臺打印this is:undefined,并且報錯Cannot read property 'setState' of undefined儡炼。
所以:我們就是要使用方法使handleClick執(zhí)行時的this執(zhí)行正確:

  • 構(gòu)造函數(shù)綁定this妓湘;
  • 箭頭函數(shù);
  • 調(diào)用時綁定onClick={this.handleClick.bind(this)}

所以我們在使用時一定要特別注意事件處理函數(shù)this的指向問題乌询。
還有一點:
setState()可以接收一個函數(shù)多柑,這個函數(shù)接受兩個參數(shù),第一個參數(shù)表示上一個狀態(tài)值楣责,第二參數(shù)表示當前的 props:

this.setState((prevState, props) => ({
    //do something here
}));

條件渲染

在 React 中竣灌,你可以創(chuàng)建不同的組件封裝你所需要的行為。然后秆麸,只渲染它們之中的一些初嘹,取決于你的應(yīng)用的狀態(tài)。

在函數(shù)中使用條件語句

React 中的條件渲染就和在 JavaScript 中的條件語句一樣沮趣。使用 JavaScript 操作符如if或者條件操作符來創(chuàng)建渲染當前狀態(tài)的元素屯烦,并且讓 React 更新匹配的 UI :

function Greeting(props) {
  const isLoggedIn = props.isLoggedIn;
  if (isLoggedIn) {
    return <UserGreeting />;
  }
  return <GuestGreeting />;
}

ReactDOM.render(
  // 修改為 isLoggedIn={true} 試試:
  <Greeting isLoggedIn={false} />,
  document.getElementById('root')
);

在JSX中使用邏輯 && 操作符

在 JavaScript 中, true && expression 總是會得到 expression 房铭,而 false && expression 總是執(zhí)行為 false 驻龟。

render() {
    return (
      <div>
        <h1>Hello,{this.props.name.length>0 && "World"}</h1>
        <h2>It is {this.state.date.toLocaleTimeString()}</h2>
        <button onClick={this.handleClick}>點擊</button>
      </div>
    )
  }

在JSX中使用三目表達式

另一個用于條件渲染元素的內(nèi)聯(lián)方法是使用 JavaScript 的條件操作符 condition ? true : false缸匪。

render() {
    return (
      <div>
        <h1>Hello翁狐,{this.props.name.length>0 && "World"}</h1>
        <h2>It is {this.state.date.toLocaleTimeString()}</h2>
        <button onClick={this.handleClick.bind(this)}>{this.state.on ? 'on' : 'off'}</button>
      </div>
    )
  }

防止組件渲染

在下面的例子中,根據(jù)名為warn的 prop 值凌蔬,呈現(xiàn) <WarningBanner /> 露懒。如果 prop 值為 false ,則該組件不渲染:

function WarningBanner(props) {
  if (!props.warn) {
    return null;
  }

  return (
    <div className="warning">
      Warning!
    </div>
  );
}

從組件的 render方法返回 null 不會影響組件生命周期方法的觸發(fā)砂心。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末懈词,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子辩诞,更是在濱河造成了極大的恐慌坎弯,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,744評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件译暂,死亡現(xiàn)場離奇詭異抠忘,居然都是意外死亡,警方通過查閱死者的電腦和手機秧秉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評論 3 392
  • 文/潘曉璐 我一進店門褐桌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人象迎,你說我怎么就攤上這事荧嵌∏河唬” “怎么了?”我有些...
    開封第一講書人閱讀 163,105評論 0 353
  • 文/不壞的土叔 我叫張陵啦撮,是天一觀的道長谭网。 經(jīng)常有香客問我,道長赃春,這世上最難降的妖魔是什么愉择? 我笑而不...
    開封第一講書人閱讀 58,242評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮织中,結(jié)果婚禮上锥涕,老公的妹妹穿的比我還像新娘。我一直安慰自己狭吼,他們只是感情好层坠,可當我...
    茶點故事閱讀 67,269評論 6 389
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著刁笙,像睡著了一般破花。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上疲吸,一...
    開封第一講書人閱讀 51,215評論 1 299
  • 那天座每,我揣著相機與錄音,去河邊找鬼摘悴。 笑死峭梳,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的烦租。 我是一名探鬼主播延赌,決...
    沈念sama閱讀 40,096評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼叉橱!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起者蠕,我...
    開封第一講書人閱讀 38,939評論 0 274
  • 序言:老撾萬榮一對情侶失蹤窃祝,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后踱侣,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體粪小,經(jīng)...
    沈念sama閱讀 45,354評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,573評論 2 333
  • 正文 我和宋清朗相戀三年抡句,在試婚紗的時候發(fā)現(xiàn)自己被綠了探膊。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,745評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡待榔,死狀恐怖逞壁,靈堂內(nèi)的尸體忽然破棺而出流济,到底是詐尸還是另有隱情,我是刑警寧澤腌闯,帶...
    沈念sama閱讀 35,448評論 5 344
  • 正文 年R本政府宣布绳瘟,位于F島的核電站,受9級特大地震影響姿骏,放射性物質(zhì)發(fā)生泄漏糖声。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,048評論 3 327
  • 文/蒙蒙 一分瘦、第九天 我趴在偏房一處隱蔽的房頂上張望蘸泻。 院中可真熱鬧,春花似錦嘲玫、人聲如沸悦施。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽歼争。三九已至,卻和暖如春渗勘,著一層夾襖步出監(jiān)牢的瞬間沐绒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評論 1 269
  • 我被黑心中介騙來泰國打工旺坠, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留乔遮,地道東北人。 一個月前我還...
    沈念sama閱讀 47,776評論 2 369
  • 正文 我出身青樓取刃,卻偏偏與公主長得像蹋肮,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子璧疗,可洞房花燭夜當晚...
    茶點故事閱讀 44,652評論 2 354

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

  • 本筆記基于React官方文檔坯辩,當前React版本號為15.4.0。 1. 安裝 1.1 嘗試 開始之前可以先去co...
    Awey閱讀 7,705評論 14 128
  • 深入JSX date:20170412筆記原文其實JSX是React.createElement(componen...
    gaoer1938閱讀 8,061評論 2 35
  • 以下內(nèi)容是我在學習和研究React時崩侠,對React的特性漆魔、重點和注意事項的提取、精練和總結(jié)却音,可以做為React特性...
    科研者閱讀 8,232評論 2 21
  • 最近看了一本關(guān)于學習方法論的書改抡,強調(diào)了記筆記和堅持的重要性。這幾天也剛好在學習React系瓢,所以我打算每天堅持一篇R...
    gaoer1938閱讀 1,675評論 0 5
  • 3. JSX JSX是對JavaScript語言的一個擴展語法阿纤, 用于生產(chǎn)React“元素”,建議在描述UI的時候...
    pixels閱讀 2,823評論 0 24