React問(wèn)題記錄

1. npx creact-react-app 出來(lái)沒(méi)有webpack文件

用npm run eject命令赃蛛。
react-scripts 是 create-react-app 的一個(gè)核心包,一些腳本和工具的默認(rèn)配置都集成在里面,而命令執(zhí)行后會(huì)將封裝在 create-react-app 中的配置全部反編譯到當(dāng)前項(xiàng)目劫哼,這樣就能完全取得 webpack 文件的控制權(quán)。但該操作時(shí)不可逆的粪般,所以如果想回去察纯,只有重新npm creat-xxxx。
執(zhí)行npm run eject命令可能會(huì)出現(xiàn)一個(gè)報(bào)錯(cuò):如下


error.png

解決方法:
git init
git add .
git commit -m 'init'

2.路由跳轉(zhuǎn)傳參方式
在跳轉(zhuǎn)路由的鏈接中通過(guò)‘褐桌?’傳遞參數(shù)
<Switch>
    <Route exact path="/" component={Home} />
    <Route exact path="/about" component={About} />
</Switch>
//link方式跳轉(zhuǎn)
<Link to="/about?msg='url參數(shù)'">去關(guān)于我的頁(yè)面 url傳遞參數(shù)</Link>
//js方式跳轉(zhuǎn)
 this.props.history.push({ pathname:"/about?msg='url參數(shù)'"});
//about中獲取參數(shù)
console.log(this.props.location)
//{pathname: "/about", search: "?msg='url參數(shù)'", hash: "", state: undefined}

優(yōu)缺點(diǎn):參數(shù)比較靈活衰抑,參數(shù)直接在url中暴露,刷新路由頁(yè)面時(shí)傳遞參數(shù)依然可以正常訪問(wèn)荧嵌。缺點(diǎn)是還需要js通過(guò)search中解析類(lèi)似getParameter(msg)方式獲取真實(shí)值

通過(guò):id方式
<Route exact path="/about/:msg" component={About} />
//link方式
<Link to="/about/url參數(shù)">去關(guān)于我的頁(yè)面 路由配置傳遞參數(shù)</Link>
//js方式跳轉(zhuǎn)
 this.props.history.push({ pathname:"/about/'url參數(shù)'"});
//about中獲取參數(shù)
console.log(this.props.match.params.msg)
//url參數(shù)

優(yōu)缺點(diǎn):參數(shù)比較靈活呛踊,參數(shù)直接在url中暴露,刷新路由頁(yè)面時(shí)傳遞參數(shù)依然可以正常訪問(wèn)砾淌。但每增加一個(gè)參數(shù)需要在Route中注冊(cè)一個(gè),而且順序需要一致谭网。

其他query(自定義屬性)和state
// query 傳遞參數(shù)
this.props.history.push({
    pathname: '/about',
    query: {
        msg: 'msg by query'
    }
});
// state 傳遞參數(shù)
this.props.history.push({
    pathname: '/about',
    state: {
        msg: 'msg by state'
    }
});

// query 接受參數(shù)
console.log(this.props.location.query.msg)//msg by query
// state 接受參數(shù)
console.log(this.props.location.state.msg)//msg by state

優(yōu)缺點(diǎn):參數(shù)靈活汪厨,不用給Route額外的配置,參數(shù)是加密的蜻底,不暴露在url上骄崩。

3. React-router V4 中的BrowserRouter和HashRouter
HashRouter

它使用URL的哈希部分(即window.location.hash)來(lái)保持頁(yè)面的UI與URL同步。
重要說(shuō)明:哈希歷史記錄不支持location.key或location.state薄辅。

BrowserRouter

使用HTML5歷史API( pushState要拂,replaceState和popstate事件),讓頁(yè)面的UI同步與URL

可以查看官網(wǎng)api了解更多站楚。
區(qū)別:1.URL的不同
HashRouter使用URL(即window.location.hash)的哈希部分來(lái)保持UI與URL同步的脱惰。哈希歷史記錄不支持location.key和location.state 詳情查看history 用來(lái)支持舊版瀏覽器,官方不建議使用窿春。簡(jiǎn)單來(lái)說(shuō)拉一,就是不需要服務(wù)器端渲染,靠瀏覽器的# 來(lái)區(qū)分path旧乞。
BrowserRouter使用HTML5 history API蔚润,保證UI界面和URL保存同步。要求服務(wù)器端對(duì)不同URL返回不同的HTML尺栖。

例如嫡纠,有兩個(gè)頁(yè)面Home和About,如果用HashRouter延赌,兩個(gè)URL就是這樣除盏,因?yàn)?后面的部分不會(huì)發(fā)給服務(wù)器,所以服務(wù)器只需要應(yīng)對(duì) / 路徑的請(qǐng)求就好

https://xxxxxx.com/#/home
https://xxxx.com/#/about

如果用BrowserRouter挫以,兩個(gè)URL就是這樣者蠕,服務(wù)器不得不對(duì) /home 和 /about 做不同請(qǐng)求

https://xxxxxx.com/home
https://xxxx.com/about

2.路由跳轉(zhuǎn)傳遞參數(shù)和刷新頁(yè)面數(shù)據(jù)丟失
當(dāng)點(diǎn)擊觸發(fā)js跳轉(zhuǎn)到about,然后回退到上一頁(yè)掐松,再點(diǎn)擊下一頁(yè)到about頁(yè)面踱侣。參數(shù)通過(guò)state傳遞

//about組件
class About extends Component {
    constructor(props) {
        super(props);
    }
    render() {
        console.log(this.props.location);
        return (
            <div className="demo">
                我是一個(gè)路由跳轉(zhuǎn)后的子頁(yè)面
                <br />
                <div>
                    參數(shù):{JSON.stringify(this.props.location)}
                </div>
                <Link to="/">回首頁(yè)</Link>
            </div>
        );
    }
}
//通過(guò)js跳轉(zhuǎn)
this.props.history.push({
    pathname: '/about',
    state: {
        msg: 'msg by state'
    }
});
//HashRouter結(jié)果
//第一次進(jìn)入頁(yè)面打印結(jié)果
{"pathname":"/about","state":{"msg":"msg by state"},"search":"","hash":""}
//刷新頁(yè)面或者后退再前進(jìn)
{"pathname":"/about","search":"","hash":""}

//BowserRouter結(jié)果
//第一次進(jìn)入頁(yè)面打印結(jié)果
{"pathname":"/about","state":{"msg":"msg by state"},"search":"","hash":"","key":"1m6gz4"}
//刷新頁(yè)面或者后退再前進(jìn)
{"pathname":"/about","state":{"msg":"msg by state"},"search":"","hash":"","key":"1m6gz4"}

當(dāng)我們通過(guò)state傳遞參數(shù)的時(shí)候,因?yàn)閔ashRouter沒(méi)有使用html5中history的api大磺,無(wú)法從歷史記錄中獲取到key和state值泻仙,所以當(dāng)刷新路由后state值會(huì)丟失導(dǎo)致頁(yè)面顯示異常。

總結(jié):實(shí)現(xiàn)路由頁(yè)面頁(yè)面刷新數(shù)據(jù)不丟失的方案
BorwserRouter有三種方式(url傳值量没,路由參數(shù)傳值玉转,以及state)
HashRouter有兩種方式(url傳值,路由參數(shù)傳值)
本地緩存或者狀態(tài)管理方案

4. 生命周期
import React, { Component } from 'react';

import './App.css';

class App extends Component {
  constructor (props){
    super(props)
    this.state = {
      data: 'old state'
    }
    console.log('c初始化數(shù)據(jù)constructor')
  }
  //組件將要加載執(zhí)行
  componentWillMount () {
    console.log('componentWillMount')
  }
  //組件掛載(加載)完成
  componentDidMount () {
    console.log('componentDidMount')
  }
  //將要接受父組件傳來(lái)的props
  componentWillReceiveProps () {
    console.log('componentWillReceiveProps')
  }
  //子組件是否更新
  shouldComponentUpdate () {
    console.log('shouldComponentUpdate')
    return true
  }
  //組件將要更新
  componentWillUpdate () {
    console.log('componentWillUpdate')
  }
  //組件更新完成
  componentDidUpdate () {
    console.log('componentDidUpdate')
  }
//組件即將銷(xiāo)毀
  componentWillUnmount () {
    console.log('componentWillUnmount')
  }
  //處理點(diǎn)擊事件
  handelClick(){
    console.log('更新數(shù)據(jù)')
    this.setState({
      data:'new state'
    })
  }
  render() {
    console.log('render')
    return (
      <div>
        <div>app</div>
        <button onClick={()=>{this.handelClick()}}>更新組件</button>
      </div>
      

    );
  }
}

export default App;
打印.png
5.@withRouter

withRouter可以包裝任何自定義組件殴蹄,將react-router 的 history,location,match 三個(gè)對(duì)象傳入究抓。
使用@需要install 兩個(gè)依賴(lài),并在package.json的babel中配置


下載依賴(lài)與配置.png
6.react定義組件的三種方式和區(qū)別
  1. 函數(shù)式定義的無(wú)狀態(tài)組件
  2. es5原生方式React.createClass定義的組件
  3. es6形式的extends React.Component定義的組件
    參考https://www.cnblogs.com/wonyun/p/5930333.html
    補(bǔ)充:無(wú)狀態(tài)函數(shù)式組件寫(xiě)法
 const HelloWorld = (props) => (
   <h1>{props.text}</h1>
 )

7. react狀態(tài)管理Mobx vs Redux

參考:https://blog.csdn.net/vhwfr2u02q/article/details/79395072

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末猾担,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子刺下,更是在濱河造成了極大的恐慌绑嘹,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件橘茉,死亡現(xiàn)場(chǎng)離奇詭異工腋,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)畅卓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)擅腰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人翁潘,你說(shuō)我怎么就攤上這事趁冈。” “怎么了拜马?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵渗勘,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我俩莽,道長(zhǎng)旺坠,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任扮超,我火速辦了婚禮取刃,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘瞒津。我一直安慰自己蝉衣,他們只是感情好括尸,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布巷蚪。 她就那樣靜靜地躺著,像睡著了一般濒翻。 火紅的嫁衣襯著肌膚如雪屁柏。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,708評(píng)論 1 305
  • 那天有送,我揣著相機(jī)與錄音淌喻,去河邊找鬼。 笑死雀摘,一個(gè)胖子當(dāng)著我的面吹牛裸删,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播阵赠,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼涯塔,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼肌稻!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起匕荸,我...
    開(kāi)封第一講書(shū)人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤爹谭,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后榛搔,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體诺凡,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年践惑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了腹泌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡童本,死狀恐怖真屯,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情穷娱,我是刑警寧澤绑蔫,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站泵额,受9級(jí)特大地震影響配深,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜嫁盲,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一篓叶、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧羞秤,春花似錦缸托、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至哺哼,卻和暖如春佩抹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背取董。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工棍苹, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人茵汰。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓枢里,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子栏豺,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355

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