React<umi+小筆記>

image.png

image.png

?? Umi官方文檔地址

本篇文章主要介紹的一個 React小白龟虎,從 0 使用umi搭建React項目的過程璃谨,記錄了相關(guān)umi的使用以及react的相關(guān)知識點~

目錄:

??持續(xù)更新中...??

1.在 config 文件內(nèi)配置 title 無效問題;
2.favicon頁面頭部小圖標(biāo)配置無效;
3.className 樣式選中高亮,或者多個 className 存在;
4.路由跳轉(zhuǎn)和參數(shù)接受;
5.useState 和 useEffect;
6.如何用 dva 定義一個 Model鲤妥,并修改佳吞;
7.權(quán)限路由(根據(jù)用戶登錄狀態(tài),跳轉(zhuǎn)登錄頁)棉安;
8.組件通信底扳;
9.函數(shù)式組件調(diào)用(forwardRef, useImperativeHandlede);
10.在React中顯示html模塊內(nèi)容
11.修改List列表中的某一個數(shù)值
12.request請求配置
13.受控組件空值警告解決
14.useState()異步問題處理
15.打包后修改輸出文件目錄 outputPath
16.如何使用sass
17.createElement 和 cloneElement的區(qū)別
18.路由按需加載贡耽,Loading
19.部署后頁面不顯示問題


?? 1.在 config 文件內(nèi)配置 title 無效問題

image.png

解決:如果你采用的是config方式衷模,那就把默認的 .umirc.ts 文件刪掉即可


?? 2.favicon頁面頭部小圖標(biāo)配置無效
image.png

解決:采用links引入,favicon適合引入對應(yīng)鏈接的圖標(biāo)


?? 3.className 樣式選中高亮菇爪,或者多個 className 存在

image.png

解決:參考地址

className={`nav ${index === '1' ? 'active' : ''}`}

?? 4.路由跳轉(zhuǎn)和參數(shù)接受
image.png
image.png

?? 5.useState 和 useEffect

Hook概覽算芯,建議仔細閱讀文檔

image.png

image.png
這里會牽扯到 useEffect 后面有無 [] 的解釋
    : 相當(dāng)于 componentDidMount和componentDidUpdate,有點類似計算屬性凳宙;
[]  : 相當(dāng)于 componentDidMount 執(zhí)行一次熙揍,用來請求數(shù)據(jù);
[值]: 相當(dāng)于把方法與這個值綁定氏涩,值發(fā)生改變時届囚,就會調(diào)用該方法;


export default function IndexPage(props) {
  const [bannerList, setBannerList] = useState([])
  const [count, setCount] = useState(0)
  useEffect(() => {
     getBannerList().then(res=>{
       //儲存輪播圖數(shù)據(jù)
       setBannerList(res.data)
      })
  }, [])

  useEffect(()=>{
    //這里每次點擊add按鍵就會返回
    console.log(count);
  })
  return (
    <>
      <div className='top'>
        <Banner list={bannerList} />
        <h1 className='title'>寄內(nèi)地</h1>
        <button onClick={() => setCount(count + 1)}>add</button>
      </div>
    </>
  );
}

?? 6.如何用 dva 定義一個 Model是尖,并修改

image.png

總而言之意系,這家伙有點類似于 vuex ,相當(dāng)于用來處理全局?jǐn)?shù)據(jù)的一個東西,希望下面的幾個文章可以幫到你

例子:
這是我簡單寫的一個切換用戶名的Model案例
需要留意的地方我已經(jīng)用 紅色 標(biāo)記出來了饺汹,尤其是 { } ,如果沒有的話蛔添,默認會接受一個 props ,在路由頁面?zhèn)鲄⒅杏刑岬?/code>

image.png

image.png

?? 7.權(quán)限路由(根據(jù)用戶登錄狀態(tài)兜辞,跳轉(zhuǎn)登錄頁)

約定式路由,如果按照官方推薦的目錄結(jié)構(gòu)迎瞧,是可以不用配置路由表的,它會自動生成

這里有兩種寫法逸吵,一種是放在route路由表里凶硅,另一種是直接在指定頁面寫,看個人需求扫皱。
寫法1:wrappers
寫法2:權(quán)限路由 ??

image.png

?? 8.組件通信

?? React 中組件間通信的幾種方式
子用父:將數(shù)據(jù)綁定到子組件上足绅,子組件通過props接收捷绑;

//父組件
<Fu value={值} />
...
//子組件調(diào)用
this.props.value

父用子:通過useRef()定義,并在子組件上綁定ref,.current獲取DOM氢妈;

//父組件
const ziRef = useRef(null)
<Zi ref={ziRef} />
ziRef.current.state.{值}

子改父:通過在子組件上綁定一個關(guān)聯(lián)父組件的方法數(shù)據(jù)

//父組件
<Fu onChange={(值)=>{改值方法}} />
...
//子組件調(diào)用
this.props.onChange(值)

父改子:通過useRef()定義粹污,并在子組件上綁定ref,.current調(diào)用子組件定義修改值的方法;

//父組件
const ziRef = useRef(null)
<Zi ref={ziRef} />
ziRef.current.onChange(值)
...
//子組件
onChange = (值)=>{
改值方法
}
?? 9.函數(shù)式組件調(diào)用(forwardRef, useImperativeHandlede)

報錯信息:
**Warning:**devScripts.js:6523 Warning: Function components cannot be given refs. Attempts to access this ref will fail. Did you mean to use React.forwardRef()?

如果你在封裝的組件上使用ref首量,那你就會發(fā)現(xiàn)這個錯誤厕怜,這就屬于函數(shù)式調(diào)用,需要 useRef forwardRef的使用,同時還能配合 useImperativeHandlede 來暴露子組件的數(shù)值或者方法給父組件使用蕾总。
?? React函數(shù)式組件值之useRef()和useImperativeHandle()
?? React Hooks系列之useImperativeHandle

?? 10.在React中顯示html模塊內(nèi)容
<div dangerouslySetInnerHTML={{ __html: '版權(quán) &#169;' }} />

?? React中的HTML轉(zhuǎn)義寫法

??11.修改List列表中的某一個數(shù)值
const [list,handleList] = useState([])
...
{
list.map((val, index) =><span onClick={() => {
                            let arr = [...list]
                            arr[index] = '修改'
                            handleList(arr)
                        }}>點擊修改list{index}的數(shù)值</span>
)}
??12.request請求配置

umi-request配置說明
本地端口號修改
如何獲取后端的相應(yīng)數(shù)據(jù) data
src/utils/request.js

/** Request 網(wǎng)絡(luò)請求工具 更詳細的 api 文檔: https://github.com/umijs/umi-request */
import { extend } from 'umi-request';
import { Toast } from 'antd-mobile';
const codeMessage = {
    200: '服務(wù)器成功返回請求的數(shù)據(jù)粥航。',
    201: '新建或修改數(shù)據(jù)成功。',
    202: '一個請求已經(jīng)進入后臺排隊(異步任務(wù))生百。',
};
/** 異常處理程序 */

const errorHandler = (error) => {
  const { response } = error;
  console.log(response);


  if (response && response.status) {
    const errorText = codeMessage[response.status] || response.statusText;
    const { status, url } = response;
    Toast.info({
      message: `請求錯誤 ${status}: ${url}`,
      description: errorText,
    });
  } else if (!response) {
    Toast.info({
      description: '您的網(wǎng)絡(luò)發(fā)生異常递雀,無法連接服務(wù)器',
      message: '網(wǎng)絡(luò)異常',
    });
  }

  return response;
};
/** 配置request請求時的默認參數(shù) */

const request = extend({
    // prefix: 'http://192.168.0.115',  //配置域名
    timeout: 3000, //請求超時時間
    headers: {},
    // errorHandler,
    // 默認錯誤處理
    credentials: 'include', // 默認請求是否帶上cookie
});

// 請求攔截
request.interceptors.request.use((url, options) => {
     options.headers['Authorization'] = 'Bearer'
    return {
        url,
        options: { ...options, interceptors: true },
    };
});
// 響應(yīng)攔截
request.interceptors.response.use(async (response) => {
  const data = await response.clone().json();
  if (data.code !== 200) {
    Toast.info(data.message)
  }
  return response;
});
export default request;

使用

import request from '@/utils/request';
export  function loginIn(data) {
    return request('/api/login/account', {
        method: 'POST',
        data,
    });
}
?? 13.受控組件空值警告解決

官方文檔解釋

解決方法

//defaultValue 替換 `input` 上的 value
<input name='mobile' placeholder='電話' defaultValue={msg.mobile} onChange={handleInput} type="text" />
//or
<input name='mobile' placeholder='電話' value={msg.mobile || ''} onChange={handleInput} type="text" />
image.png
?? 14.useState()異步問題處理

使用 State Hook

下面的預(yù)期在某些時候并不是你想要的

const [num,handleNum] = useState(0)
...
useEffect(() => {
 handleNum(1)
 console.log(num) //0
 handleNum(2)
 console.log(num) //0
}, []);

例如:在移動端滑動加載更多 list,根據(jù)搜索條件去更新 list蚀浆,每次條件的變化就需要重新讓 list = [],然后再去獲取新的 list缀程,此時就會遇到這種 list 不能及時更新清空的問題

const [search,handleSearch] = useState('')
const [list,setList] = useState([])
獲取list數(shù)據(jù)
const fetchList = ()=> {
  getList().then(res=>{
     setList(...list,...res.data)
   })
}
//根據(jù)篩選條件加載數(shù)據(jù)
useEffect(() => {
   setList([]) //設(shè)想每次變化時就清空 list
   fetchList() //但是在處理數(shù)據(jù)并沒有及時清空 list
}, [search]);

解決:

...
//每次條件變化就會清空 list
useEffect(() => {
   setList([])
}, [search]);
//list發(fā)生變化就去調(diào)用接口數(shù)據(jù)
useEffect(() => {
 //判斷當(dāng)list為[]時,調(diào)用接口
 if(!list.length){
   fetchList()
  }
}, [list]);
?? 15.打包后修改輸出文件目錄 outputPath

outputPath 配置
outputPath:dist/shunfeng,打包后會生成 dist文件下shunfeng文件下的其他文件

image.png

image.png

?? 16.如何使用sass

umi中使用sass只需安裝 @umijs/plugin-sass

yarn add @umijs/plugin-sass --D

安裝完后無需配置市俊,umi會自己識別杨凑。默認使用dart sass , 如果需要使用node-sass,才需要想官網(wǎng)那樣 配置

?? 17.createElement 和 cloneElement的區(qū)別

區(qū)別:傳入的第一個參數(shù)不同

React.createElement()
它接受三個參數(shù),第一個參數(shù)可以是一個標(biāo)簽名摆昧。如 div撩满、span,或者 React 組件绅你。第二個參數(shù)為傳入的屬性伺帘。第三個以及之后的參數(shù),皆作為組件的子組件忌锯。

React.createElement(type, [props], [...children]);

React.cloneElement()
React.cloneElement()React.createElement()相似伪嫁,不同的是它傳入的第一個參數(shù)是一個 React 元素,而不是標(biāo)簽名或組件偶垮。新添加的屬性會并入原有的屬性张咳,傳入到返回的新元素中,而舊的子元素將被替換似舵。將保留原始元素的鍵和引用脚猾。

React.cloneElement(element, [props], [...children]);
?? 18.路由按需加載,Loading

配置 dynamicimport

export default {
  dynamicImport: {
    loading: '@/Loading', //Loading組件
  },
};
?? 19.部署后頁面不顯示問題
// 生產(chǎn) 測試配置
base: process.env.NODE_ENV === 'production' ? '/foo/' : '/',
publicPath: process.env.NODE_ENV === 'production' ? '/foo/' : '/',
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末啄枕,一起剝皮案震驚了整個濱河市婚陪,隨后出現(xiàn)的幾起案子族沃,更是在濱河造成了極大的恐慌频祝,老刑警劉巖泌参,帶你破解...
    沈念sama閱讀 211,376評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異常空,居然都是意外死亡沽一,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評論 2 385
  • 文/潘曉璐 我一進店門漓糙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來铣缠,“玉大人,你說我怎么就攤上這事昆禽』韧埽” “怎么了?”我有些...
    開封第一講書人閱讀 156,966評論 0 347
  • 文/不壞的土叔 我叫張陵醉鳖,是天一觀的道長捡硅。 經(jīng)常有香客問我,道長盗棵,這世上最難降的妖魔是什么壮韭? 我笑而不...
    開封第一講書人閱讀 56,432評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮纹因,結(jié)果婚禮上喷屋,老公的妹妹穿的比我還像新娘。我一直安慰自己瞭恰,他們只是感情好屯曹,可當(dāng)我...
    茶點故事閱讀 65,519評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著惊畏,像睡著了一般是牢。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上陕截,一...
    開封第一講書人閱讀 49,792評論 1 290
  • 那天驳棱,我揣著相機與錄音,去河邊找鬼农曲。 笑死社搅,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的乳规。 我是一名探鬼主播形葬,決...
    沈念sama閱讀 38,933評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼暮的!你這毒婦竟也來了笙以?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,701評論 0 266
  • 序言:老撾萬榮一對情侶失蹤冻辩,失蹤者是張志新(化名)和其女友劉穎猖腕,沒想到半個月后拆祈,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,143評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡倘感,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,488評論 2 327
  • 正文 我和宋清朗相戀三年放坏,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片老玛。...
    茶點故事閱讀 38,626評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡淤年,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蜡豹,到底是詐尸還是另有隱情麸粮,我是刑警寧澤,帶...
    沈念sama閱讀 34,292評論 4 329
  • 正文 年R本政府宣布镜廉,位于F島的核電站豹休,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏桨吊。R本人自食惡果不足惜威根,卻給世界環(huán)境...
    茶點故事閱讀 39,896評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望视乐。 院中可真熱鬧洛搀,春花似錦、人聲如沸佑淀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽伸刃。三九已至谎砾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工厢漩, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留熬荆,地道東北人钥组。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子妆毕,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,494評論 2 348

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