reactjs精品教程資料-day2

React.js - 第2天

備注說明:該筆記來自于黑馬培訓(xùn)課筆記愚隧,因?yàn)橘|(zhì)量好,為方便學(xué)習(xí)和 查閱钞螟。

0. 安裝 React Developer Tools 調(diào)試工具

React Developer Tools - Chrome 擴(kuò)展下載安裝地址

主要內(nèi)容

  • 學(xué)習(xí) 創(chuàng)建組件的第二種方式
  • 美化React組件的樣式
  • 小Demo穿起來之前學(xué)習(xí)的知識(shí)點(diǎn)
  • React中綁定事件
  • React組件的生命周期

    1. React中創(chuàng)建組件

    第1種 - 創(chuàng)建組件的方式

    使用構(gòu)造函數(shù)來創(chuàng)建組件勤众,如果要接收外界傳遞的數(shù)據(jù)论寨,需要在 構(gòu)造函數(shù)的參數(shù)列表中使用props來接收赖临;

    必須要向外return一個(gè)合法的JSX創(chuàng)建的虛擬DOM胞锰;

  • 創(chuàng)建組件:
    function Hello () {    // return null    return <div>Hello 組件</div>}
  • 為組件傳遞數(shù)據(jù):
    // 使用組件并 為組件傳遞 props 數(shù)據(jù)<Hello name={dog.name} age={dog.age} gender={dog.gender}></Hello>// 在構(gòu)造函數(shù)中,使用 props 形參兢榨,接收外界 傳遞過來的數(shù)據(jù)function Hello(props) {  // props.name = 'zs'  console.log(props)  // 結(jié)論:不論是 Vue 還是 React嗅榕,組件中的 props 永遠(yuǎn)都是只讀的;不能被重新賦值吵聪;  return <div>這是 Hello 組件 --- {props.name} --- {props.age} --- {props.gender}</div>}
    ?
  • 父組件向子組件傳遞數(shù)據(jù)
  • 使用{…obj}屬性擴(kuò)散傳遞數(shù)據(jù)
  • 將組件封裝到單獨(dú)的文件中
  • 注意:組件的名稱首字母必須是大寫
  • 在導(dǎo)入組件的時(shí)候凌那,如何省略組件的.jsx后綴名:
    // 打開 webpack.config.js ,并在導(dǎo)出的配置對(duì)象中吟逝,新增 如下節(jié)點(diǎn):resolve: {    extensions: ['.js', '.jsx', '.json'], // 表示帽蝶,這幾個(gè)文件的后綴名,可以省略不寫    alias: {        '@': path.join(__dirname, './src')    }  }
  • 在導(dǎo)入組件的時(shí)候块攒,配置和使用@路徑符號(hào)

    第2種 - 創(chuàng)建組件的方式

    使用 class 關(guān)鍵字來創(chuàng)建組件

    ES6 中 class 關(guān)鍵字励稳,是實(shí)現(xiàn)面向?qū)ο缶幊痰男滦问剑?/p>

    了解ES6中 class 關(guān)鍵字的使用

  • class 中 constructor 的基本使用
  • 實(shí)例屬性和實(shí)例方法
  • 靜態(tài)屬性和靜態(tài)方法
  • 使用 extends 關(guān)鍵字實(shí)現(xiàn)繼承

    基于class關(guān)鍵字創(chuàng)建組件

  • 最基本的組件結(jié)構(gòu):
    // 如果要使用 class 定義組件,必須 讓自己的組件局蚀,繼承自 React.Componentclass 組件名稱 extends React.Component {    // 在 組件內(nèi)部,必須有 render 函數(shù),作用:渲染當(dāng)前組件對(duì)應(yīng)的 虛擬DOM結(jié)構(gòu)    render(){        // render 函數(shù)中恕稠,必須 返回合法的 JSX 虛擬DOM結(jié)構(gòu)        return <div>這是 class 創(chuàng)建的組件</div>    }}

    2. 兩種創(chuàng)建組件方式的對(duì)比

    注意:使用 class 關(guān)鍵字創(chuàng)建的組件琅绅,有自己的私有數(shù)據(jù)(this.state) 和 生命周期函數(shù);

    注意:使用 function 創(chuàng)建的組件鹅巍,只有props千扶,沒有自己的私有數(shù)據(jù)和 生命周期函數(shù);

  • 構(gòu)造函數(shù)創(chuàng)建出來的組件:叫做“無狀態(tài)組件”【無狀態(tài)組件今后用的不多】
  • class關(guān)鍵字創(chuàng)建出來的組件:叫做“有狀態(tài)組件”【今后用的最多】
  • 什么情況下使用有狀態(tài)組件骆捧?什么情況下使用無狀態(tài)組件澎羞?
    • 如果一個(gè)組件需要有自己的私有數(shù)據(jù),則推薦使用:class創(chuàng)建的有狀態(tài)組件敛苇;
    • 如果一個(gè)組件不需要有私有的數(shù)據(jù)妆绞,則推薦使用:無狀態(tài)組件;
    • React官方說:無狀態(tài)組件枫攀,由于沒有自己的state和生命周期函數(shù)括饶,所以運(yùn)行效率會(huì)比 有狀態(tài)組件稍微高一些;

      有狀態(tài)組件和無狀態(tài)組件之間的本質(zhì)區(qū)別就是:有無state屬性来涨、和 有無生命周期函數(shù)图焰;

  • 組件中的 propsstate/data 之間的區(qū)別
    • props 中的數(shù)據(jù)都是外界傳遞過來的;
    • state/data 中的數(shù)據(jù)蹦掐,都是組件私有的技羔;(通過 Ajax 獲取回來的數(shù)據(jù)僵闯,一般都是私有數(shù)據(jù));
    • props 中的數(shù)據(jù)都是只讀的藤滥;不能重新賦值鳖粟;
  • 數(shù)據(jù):
    CommentList: [ { id: 1, user: '張三', content: '哈哈,沙發(fā)' }, { id: 2, user: '李四', content: '哈哈超陆,板凳' }, { id: 3, user: '王五', content: '哈哈牺弹,涼席' }, { id: 4, user: '趙六', content: '哈哈,磚頭' }, { id: 5, user: '田七', content: '哈哈时呀,樓下山炮' }]

    4. 設(shè)置樣式

  • 使用普通的 style 樣式
    <h1 style={ {color: 'red', fontWeight: 200} }></h1>
  • 啟用 css-modules
    1. 修改 webpack.config.js這個(gè)配置文件张漂,為 css-loader 添加參數(shù):
      { test: /\.css$/, use: ['style-loader', 'css-loader?modules'] } // 為 .css 后綴名的樣式表  啟用 CSS 模塊化
    2. 在需要的組件中,import導(dǎo)入樣式表谨娜,并接收模塊化的 CSS 樣式對(duì)象:
      import cssObj from '../css/CmtList.css'
    3. 在需要的HTML標(biāo)簽上航攒,使用className指定模塊化的樣式:
      <h1 className={cssObj.title}>評(píng)論列表組件</h1>
  • 使用localIdentName自定義生成的類名格式,可選的參數(shù)有:
    • [path] 表示樣式表 相對(duì)于項(xiàng)目根目錄 所在路徑
    • [name] 表示 樣式表文件名稱
    • [local] 表示樣式的類名定義名稱
    • [hash:length] 表示32位的hash值
    • 例子:{ test: /\.css$/, use: ['style-loader', 'css-loader?modules&localIdentName=[path][name]-[local]-[hash:5]'] }
  • 使用 :local():global()
    • :local()包裹的類名趴梢,是被模塊化的類名漠畜,只能通過className={cssObj.類名}來使用
      同時(shí),:local默認(rèn)可以不寫坞靶,這樣憔狞,默認(rèn)在樣式表中定義的類名,都是被模塊化的類名彰阴;
    • :global()包裹的類名瘾敢,是全局生效的,不會(huì)被 css-modules 控制尿这,定義的類名是什么簇抵,就是使用定義的類名className="類名"
  • 注意:只有.title這樣的類樣式選擇器,才會(huì)被模塊化控制射众,類似于body這樣的標(biāo)簽選擇器碟摆,不會(huì)被模塊化控制;

    在項(xiàng)目中啟用模塊化并同時(shí)使用bootstrap

  • 把 自己的樣式表叨橱,定義為 .scss 文件
  • 第三方的 樣式表典蜕,還是 以 .css 結(jié)尾
  • 我們只需要為自己的 .scss 文件,啟用模塊化即可罗洗;
  • 運(yùn)行cnpm i sass-loader node-sass -D 安裝能夠解析scss文件的loader
  • 添加loader規(guī)則:
    { test: /\.scss$/, use: ['style-loader', 'css-loader?modules&localIdentName=[path][name]-[local]-[hash:5]', 'sass-loader'] } // 打包處理 scss 文件的 loader
    ?

    5. React 中綁定事件的注意點(diǎn)

  • 事件的名稱都是React的提供的嘉裤,因此名稱的首字母必須大寫onClickonMouseOver
  • 為事件提供的處理函數(shù)栖博,必須是如下格式
    onClick= { function }
  • 用的最多的事件綁定形式為:
    <button onClick={ () => this.show('傳參') }>按鈕</button>// 事件的處理函數(shù)屑宠,需要定義為 一個(gè)箭頭函數(shù),然后賦值給 函數(shù)名稱show = (arg1) => {    console.log('show方法' + arg1)}
  • 在React中仇让,如果想要修改 state 中的數(shù)據(jù)典奉,推薦使用 this.setState({ })

    6. 綁定文本框與state中的值(單向數(shù)據(jù)流)

  • 在 Vue 中躺翻,默認(rèn)提供了v-model指令,可以很方便的實(shí)現(xiàn) 數(shù)據(jù)的雙向綁定卫玖;
  • 但是公你,在 React 中,默認(rèn)只是單向數(shù)據(jù)流假瞬,也就是 只能把 state 上的數(shù)據(jù)綁定到 頁面陕靠,無法把 頁面中數(shù)據(jù)的變化,自動(dòng)同步回 state 脱茉; 如果需要把 頁面上數(shù)據(jù)的變化剪芥,保存到 state,則需要程序員手動(dòng)監(jiān)聽onChange事件琴许,拿到最新的數(shù)據(jù)税肪,手動(dòng)調(diào)用this.setState({ }) 更改回去;
  • 案例:
    <input type="text" style={{ width: '100%' }} value={this.state.msg} onChange={() => this.textChanged()} ref="mytxt" /> // 響應(yīng) 文本框 內(nèi)容改變的處理函數(shù)  textChanged = () => {    // console.log(this);    // console.log(this.refs.mytxt.value);    this.setState({      msg: this.refs.mytxt.value    })  }
    ?

    7. 使用ref獲取DOM元素引用

    和 Vue 中差不多榜田,vue 為頁面上的元素提供了 ref 的屬性益兄,如果想要獲取 元素引用,則需要使用this.$refs.引用名稱
    在 React 中箭券,也有 ref, 如果要獲取元素的引用this.refs.引用名稱

    8. 組件的生命周期

  • 生命周期的概念:每個(gè)組件的實(shí)例净捅,從 創(chuàng)建、到運(yùn)行辩块、直到銷毀蛔六,在這個(gè)過程中,會(huì)出發(fā)一些列 事件庆捺,這些事件就叫做組件的生命周期函數(shù)古今;
  • React組件生命周期分為三部分:
    • 組件創(chuàng)建階段:特點(diǎn):一輩子只執(zhí)行一次

      componentWillMount:
      render:
      componentDidMount:

    • 組件運(yùn)行階段:按需屁魏,根據(jù) props 屬性 或 state 狀態(tài)的改變滔以,有選擇性的 執(zhí)行 0 到多次

      componentWillReceiveProps:
      shouldComponentUpdate:
      componentWillUpdate:
      render:
      componentDidUpdate:

    • 組件銷毀階段:一輩子只執(zhí)行一次

      defaultProps

  • Mounting:
    • constructor()
    • componentWillMount()
    • render()
    • componentDidMount()
  • Updating:
    • componentWillReceiveProps(nextProps)
    • shouldComponentUpdate(nextProps, nextState)
    • componentWillUpdate(nextProps, nextState)
    • render()
    • componentDidUpdate(prevProps, prevState)
  • Unmounting:
    • componentWillUnmount()

      9. 通過Counter計(jì)數(shù)器的小案例 - 了解生命周期函數(shù)

  • props 屬性提供默認(rèn)值 和 進(jìn)行類型校驗(yàn),需要先運(yùn)行cnpm i prop-types --save
  • 給組件的 props 提供默認(rèn)值
      // 為組件提供 默認(rèn)的 props 屬性值  static defaultProps = {    initcount: 0 // 默認(rèn)值為0    如果用戶沒有傳遞 氓拼,則 默認(rèn)就是0你画; 如果用戶傳遞了,則 以用戶傳遞的為準(zhǔn)  }
  • 給組件的 props 進(jìn)行類型校驗(yàn)
      // 3. 進(jìn)行 props 屬性的類型校驗(yàn),   static propTypes = {}  是固定寫法  static propTypes = {    initcount: PropTypes.number.isRequired // 規(guī)定 外界在傳遞 initcount 的時(shí)候桃漾,必須是 number 值類型坏匪,否則 ,會(huì)在終端報(bào)警告    // isRequired 表示 這個(gè) props 屬性值 是必須要傳遞的  }
    ?

    10. 使用React中的事件撬统,綁定count自增

    11. 發(fā)表評(píng)論案例

    相關(guān)文章

    類型校驗(yàn)
    Animation Add-Ons
  • ?

    最后編輯于
    ?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
    • 序言:七十年代末适滓,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子恋追,更是在濱河造成了極大的恐慌凭迹,老刑警劉巖罚屋,帶你破解...
      沈念sama閱讀 216,470評(píng)論 6 501
    • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異嗅绸,居然都是意外死亡脾猛,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
      沈念sama閱讀 92,393評(píng)論 3 392
    • 文/潘曉璐 我一進(jìn)店門鱼鸠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來猛拴,“玉大人,你說我怎么就攤上這事蚀狰∮淅ィ” “怎么了?”我有些...
      開封第一講書人閱讀 162,577評(píng)論 0 353
    • 文/不壞的土叔 我叫張陵造锅,是天一觀的道長撼唾。 經(jīng)常有香客問我,道長哥蔚,這世上最難降的妖魔是什么倒谷? 我笑而不...
      開封第一講書人閱讀 58,176評(píng)論 1 292
    • 正文 為了忘掉前任,我火速辦了婚禮糙箍,結(jié)果婚禮上渤愁,老公的妹妹穿的比我還像新娘。我一直安慰自己深夯,他們只是感情好抖格,可當(dāng)我...
      茶點(diǎn)故事閱讀 67,189評(píng)論 6 388
    • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著咕晋,像睡著了一般雹拄。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上掌呜,一...
      開封第一講書人閱讀 51,155評(píng)論 1 299
    • 那天滓玖,我揣著相機(jī)與錄音,去河邊找鬼质蕉。 笑死势篡,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的模暗。 我是一名探鬼主播禁悠,決...
      沈念sama閱讀 40,041評(píng)論 3 418
    • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼兑宇!你這毒婦竟也來了碍侦?” 一聲冷哼從身側(cè)響起,我...
      開封第一講書人閱讀 38,903評(píng)論 0 274
    • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎瓷产,沒想到半個(gè)月后比规,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
      沈念sama閱讀 45,319評(píng)論 1 310
    • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拦英,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
      茶點(diǎn)故事閱讀 37,539評(píng)論 2 332
    • 正文 我和宋清朗相戀三年蜒什,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片疤估。...
      茶點(diǎn)故事閱讀 39,703評(píng)論 1 348
    • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡灾常,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出铃拇,到底是詐尸還是另有隱情钞瀑,我是刑警寧澤,帶...
      沈念sama閱讀 35,417評(píng)論 5 343
    • 正文 年R本政府宣布慷荔,位于F島的核電站雕什,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏显晶。R本人自食惡果不足惜贷岸,卻給世界環(huán)境...
      茶點(diǎn)故事閱讀 41,013評(píng)論 3 325
    • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望磷雇。 院中可真熱鬧偿警,春花似錦、人聲如沸唯笙。這莊子的主人今日做“春日...
      開封第一講書人閱讀 31,664評(píng)論 0 22
    • 文/蒼蘭香墨 我抬頭看了看天上的太陽崩掘。三九已至七嫌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間苞慢,已是汗流浹背诵原。 一陣腳步聲響...
      開封第一講書人閱讀 32,818評(píng)論 1 269
    • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留枉疼,地道東北人皮假。 一個(gè)月前我還...
      沈念sama閱讀 47,711評(píng)論 2 368
    • 正文 我出身青樓鞋拟,卻偏偏與公主長得像骂维,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子贺纲,可洞房花燭夜當(dāng)晚...
      茶點(diǎn)故事閱讀 44,601評(píng)論 2 353