精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

能把隊友氣死的八種代碼(React版)

開發 前端
作為大型項目,很容易需要依賴別的模板掛載到window對象的內容,讀取的時候需要考慮到是否有可能拿不到window對象上的內容,從而導致js報錯?

前幾天在前端技術群里聊起Code Review的事,大伙兒似乎都憋了一肚子氣:

圖片圖片

圖片

我覺得這份難言之隱應該要讓更多人看到,就跟Henry約了個稿:

圖片圖片

于是Henry趕在周末,一邊帶娃,一邊給我抹眼淚整理(脫敏)出了這篇小小的屎山合集,供大家品鑒。

以下是正文。

1. 直接操作DOM

const a = document.querySelector('.a');

const scrollListener = throttle(() => {
  const currentY = window.scrollY;

  if (currentY > 100) {
    a.classList.add('show');
  } else {
    a.classList.remove('show');
  }
}, 300);

window.addEventListener('scroll', scrollListener);
return () => {
  window.removeEventListener('scroll', scrollListener);
};

上面的代碼在監聽scroll方法的回調函數中,直接上手修改DOM的類名。眾所周知,React屬于響應式編程,大部份情況都不需要直接操作DOM,具體原因參考官方文檔(https://react.dev/learn/manipulating-the-dom-with-refs)。

優化方法也很簡單,充分發揮響應式編程的優點,用變量代替即可:

const [refreshStatus, setRefreshStatus] = useState('');

const scrollListener = throttle(() => {
  if (tab.getBoundingClientRect().top < topH) {
    setRefreshStatus('show');
  } else {
    setRefreshStatus('');
  }
}, 300);

return <div className={['page_refresh', refreshStatus].join(' ')}/>;

2. useEffect不指定依賴

依賴參數缺失。

useEffect(() => {
    console.log('no deps=====')
    // code...
});

這樣的話,每次頁面有重渲染,該useEffect都會執行,帶來嚴重的性能問題。

例如我們項目中,這個useEffect內部執行的是第一點中的內容,即每次都會綁定一個scroll事件的回調,而且頁面中有實時輪詢接口每隔5s刷新一次列表,用戶在該頁面稍加停留,就會有卡頓問題出現。

解決方案很簡單,根據useEffect的回調函數內容可知,如果需要在第一次渲染之后掛載一個scroll的回調函數,那么就給useEffect第二個參數傳入空數組即可,參考官方文檔(https://react.dev/reference/react/useEffect#useeffect)。

useEffect(() => {
    // code...
}, []);

3. 硬編碼

硬編碼,即一些數據信息或配置信息直接寫死在邏輯代碼中,例如

圖片

這兩行代碼本意是從url上拿到指定的參數的值,如果沒有,會用一個固定的配置做兜底。

乍一看代碼邏輯很清晰,但再想深一層,兜底值具體的含義是什么?為什么要用這兩個值來兜底?寫這行代碼的同學可能很快可以解答,但是一段時間之后,寫代碼的人和提需求的人都找不到了呢?

這個示例代碼還比較簡單,拿對應的值去后臺可以找到對應的含義,如果是寫死的是枚舉值,而且還沒有類型定義,那代碼就很難維護了。

圖片圖片

解決此類問題,要么將這些內容配置化,即寫到一個config文件中,使用清晰的語義化命名變量;要么,至少在硬編碼的地方寫上注釋,交代清楚這里需要硬編碼的前因后果。

沐灑:

關于硬編碼問題,我在之前的一篇關于“配置管理”的文章里有詳細闡述和應對方案,感興趣的朋友可以看看《小白也能做出滿分前端工程:01 配置管理》

4. 放任文件長度,只著眼于當下的需求

很多同學做需求、寫代碼都比較少從全局考慮,只關注到當前需求如何完成。從“戰術”上來說沒有問題,快速完成產品的需求、快速迭代產品也是大家希望看到的。

可一旦只關注“戰術實現”而忽略“戰略設計”,除非做的產品是月拋型的,否則一定會遇到舊邏輯難以修改的情況。

如果再加上一個文件被多達10余人修改過的情況,那么每改一行代碼都會是一場災難,例如最近接手的一個頁面:

圖片圖片

單文件高達1600多行!哪怕去除300多行的注釋,和300多行的模板,剩下的邏輯代碼也有1000行左右,這種代碼可讀性就極其糟糕,必須進行拆分。

而很常見的是,由于每一任經手人都疏于考慮全局,導致大量代碼毫無模塊化可言,甚至出現多個useEffect的依賴是完全相同的:

圖片圖片

這里明顯還有另一個問題:濫用hooks。

從行號可以看出來確實是相同的依賴寫了多個useEffect,很明顯是多個同學各寫各的的需求引入的這些hooks。

這代碼跑肯定是能跑的,但是很可能會出現多個hooks中修改同一個變量,導致其他地方在使用的時候需要搞一些很tricky的操作來修Bug。

5.變量無初始值

在typescript的加持下,對變量的類型定義可以說是日益嚴格了。可是在一些變量的類型定義比較復雜的情況下,可能一個變量的字段很多、層級很復雜,此時有些同學就可能想偷個懶了,例如:

const [variable, setVariable] = useState<ComplicatedType>();

// some code...
const queryData = function() {
    // some logic
    setVariable({ show: true });
};

useEffect(() => {
    queryData();
}, []);

return variable.show ? <Component /> : null;

這里的問題很明顯,如果queryData耗時比較長,在第一次渲染的時候,最后一行的variable.show就會報錯了,因為variable的初始值是undefined。所以聲明變量時,一定要根據變量的類型設置好有效默認值。

6. 三元選擇符嵌套使用

網上很多人會推薦說用三元選擇符代替簡單的if-else,但幾乎沒有見過有人提到嵌套使用三元選擇符的事情,如果看到如下代碼,不知道各位讀者會作何感想?

{condition1 === 1
    ? "數據加載中"
    : condition2
    ? "沒有更多了"
    : condition3
    ? "當前沒有可用房間"
    : "數據加載中"}

真的很難理解,明明只是一個簡單的提示語句的判斷,卻需要拿出分析性能的精力去理解,多少有點得不償失了。

這還只是一種比較簡單的三元選擇符的嵌套,因為當各個條件分支都為true時,就直接返回了,沒有做更多的判斷,如果再多做一層,都會直接把人的cpu的干爆炸了。 

替代方案: 

  1. 直接用if-else,可讀性更高,以后如果要加邏輯也很方便。
  2. Early Return,也叫衛語句,這種寫法能有效簡化邏輯,增加可讀性。
if (condition1 === 1) return "數據加載中";
if (condition2) return "沒有更多了";
if (condition3) return "當前沒有可用房間";
return "數據加載中";

雖然不嵌套的三元選擇符很簡單,但是在例如jsx的模版中,仍然不建議大量使用三元選擇符,因為可能會出現如下代碼:

return (
    condition1 ? (
        <div className={condition2 ? cls1 : cls2}>
            {condition3 ? "111" : "222"}
            {condition4 ? (
                <Component prop1={condition5 ? a : b} />
            ) : null
        </div>
    ) : (
        <Component2>
            {condition6 ? children1 : children2}
        </Component2>
    )
)

類似的代碼在我們的項目中頻繁出現,模版中大量的三元選擇符導致文件內容拉得很長,很容易看著看著就不記得自己在哪個邏輯分支上了。

像這種簡單的三元選擇符,做成一個簡單的memo變量,哪怕是在組件內直接寫變量定義(例如:const clsName = condition2 ? cls1 : cls2),最終到模板的可讀性也會比上述代碼高。

7. 邏輯不拆分

React hooks可以很方便地幫助開發者聚合邏輯抽離成自定義hooks,千萬不要把一個頁面所有的useState、useEffect等全都放在一個文件中:

圖片圖片

其實從功能上可以對頁面進行拆分,拆分之后這些變量的定義也就可以拆出去了。

其中有一個很簡單的原則就是,如果一個邏輯同時涉及到了useState和useEffect,那么就可以一并抽離出去成為一個自定義hooks。

例如接口請求大家一般都是直接在業務邏輯中做:

const Comp = () => {
    const [data, setData] = useState({});
    const [loading, setLoading] = useState(false);
    
    useEffect(() => {
        setLoading(true);
        queryData()
            .then((response) => {
                setData(response);
            })
            .catch((error) => {
                console.error(error);
            })
            .finally(() => {
                setLoading(false);
            });
    });
    
    if (loading) return "loading...";
    
    return <div>{data.text}</div>;
}

根據上面的原則,和數據拉取相關的內容涉及到了useState和useEffect,這整塊邏輯就可以拆出去,那么最終就只剩下:

const Comp = () => {
    const { data, loading } = useQueryData();
    
    if (loading) return "loading...";
    
    return <div>{data.text}</div>;
};

這樣下來,Comp組件就變得身份清爽了。

大家可以參考阿里的ahooks庫,里面收集了很多前端常用的hooks,可以極大提升開發效率和減少重復代碼。

8. 隨意讀取window對象的值

作為大型項目,很容易需要依賴別的模板掛載到window對象的內容,讀取的時候需要考慮到是否有可能拿不到window對象上的內容,從而導致js報錯?例如:

window.tmeXXX.a.func();

如果這個tmeXXX所在的js加載失敗了,或者是某個版本中沒有a這個屬性或者func這個函數,那么頁面就會白屏。

本文轉載自微信公眾號「沐灑」,作者「ASCII26」,可以通過以下二維碼關注。

責任編輯:武曉燕 來源: ASCII26
相關推薦

2023-12-05 15:58:06

React開發

2021-11-04 08:53:00

if-else代碼Java

2025-03-26 00:12:00

C#重構代碼

2021-05-07 07:31:33

數據分析互聯網運營大數據

2022-05-10 10:28:21

JavaScript代碼

2011-06-09 13:48:48

程序員

2023-11-20 13:52:00

Redis數據庫

2025-08-04 02:21:00

2022-10-27 11:36:59

map函數對象

2023-08-09 14:01:55

2010-09-09 08:39:30

2016-07-05 14:09:02

AndroidJAVA內存

2021-08-02 10:46:02

云計算用途

2010-08-24 09:49:44

2025-10-24 07:35:19

2022-05-11 07:50:15

React UI組件庫前端

2022-06-13 09:00:33

React 項目前端

2025-10-11 01:25:00

Spring編程黃金模式

2020-05-28 13:33:30

React Hook前端開發

2020-06-12 08:34:37

React開發工具
點贊
收藏

51CTO技術棧公眾號

色豆豆成人网| 狠狠躁日日躁夜夜躁av| 99久久夜色精品国产亚洲狼| 日韩欧美资源站| 欧美成人高潮一二区在线看| 成a人片在线观看www视频| 国产精品香蕉一区二区三区| 81精品国产乱码久久久久久| 国产福利视频网站| 婷婷亚洲成人| 日韩免费在线观看| 亚洲黄色av网址| 国产区美女在线| 国产精品―色哟哟| 精品乱码一区二区三区| 国产成人三级一区二区在线观看一| 99热免费精品在线观看| 久久精品国产久精国产一老狼| 久久人妻少妇嫩草av无码专区| 91精品麻豆| 在线影视一区二区三区| 日韩网站在线免费观看| av片在线观看永久免费| 国产亚洲精品资源在线26u| 国产精品乱码| 国产婷婷一区二区三区久久| 丝袜脚交一区二区| 97在线观看免费| 男的操女的网站| 人人狠狠综合久久亚洲婷| 日韩大片在线观看视频| 激情综合激情五月| 久久精品免视看国产成人| 欧美私模裸体表演在线观看| av免费中文字幕| 96av在线| 香蕉影视欧美成人| 久久综合亚洲精品| a级影片在线观看| 亚洲欧洲99久久| 亚洲欧洲国产日韩精品| 成人在线观看免费| 中日韩免费视频中文字幕| 青青草原成人| 第一页在线观看| 久久久久久夜精品精品免费| 精品视频高清无人区区二区三区| 亚洲黄色小说网| 国产suv精品一区二区6| 亚洲综合中文字幕68页| 国产叼嘿视频在线观看| 懂色一区二区三区免费观看| av资源一区二区| 亚洲乱色熟女一区二区三区| 国产成人免费在线观看不卡| 亚洲综合在线小说| 日本免费一区视频| 久久综合五月天婷婷伊人| 欧美另类高清视频在线| 懂色av中文在线| 国产精品久久久久精k8 | 乱色精品无码一区二区国产盗| 国产成人免费视| 激情视频一区二区| 九九在线视频| 国产精品美女久久久久aⅴ| 亚洲视频导航| 中文字幕有码在线观看| 亚洲精品乱码久久久久久黑人| 中文字幕の友人北条麻妃| 先锋成人av| 午夜精品123| 不卡av免费在线| 视频91a欧美| 精品欧美黑人一区二区三区| 熟妇高潮精品一区二区三区| 欧美日韩一二| 欧美成人午夜激情视频| 日韩久久久久久久久| 久热精品在线| 成人网页在线免费观看| 国产成人无码www免费视频播放| 91丝袜高跟美女视频| 亚洲福利av| 91制片在线观看| 欧美在线播放高清精品| 91精品国产高清91久久久久久| 欧美一区自拍| 久久午夜a级毛片| 日韩av在线播| 久久99精品久久久| 国产精品区二区三区日本| 岛国最新视频免费在线观看| 夜夜亚洲天天久久| 99草草国产熟女视频在线| 久久爱www.| 亚洲天堂av网| 国产亚洲第一页| 日韩高清在线观看| 国产传媒一区二区三区| aiai在线| 精品magnet| 色哟哟免费视频| 狠狠色丁香婷婷综合影院| 色综合久久天天综线观看| 久久人人爽人人爽人人片av免费| 国产毛片一区二区| 欧洲精品久久| √8天堂资源地址中文在线| 欧美日韩精品一区视频| 你懂的在线观看网站| 午夜欧美理论片| 国产精品永久在线| 黄色美女网站在线观看| 亚洲成av人片一区二区三区 | 国产95亚洲| 国产亚洲精品久久久久久牛牛| 麻豆一区二区三区精品视频| 久久99国产乱子伦精品免费| 欧美日韩国产免费一区二区三区| 日皮视频在线观看| 欧美高清视频一二三区 | 91超碰成人| 国产精品视频999| 欧美777四色影视在线| 亚洲第一激情av| 亚洲成a人无码| 亚洲欧美亚洲| 91日本在线观看| 日韩在线资源| 欧美日韩亚洲综合| 成人小视频免费看| 国产一区二区三区免费看| 精品国产凹凸成av人网站| 国产农村妇女精品一区| 男人的天堂亚洲| 精品国产一区二区三区麻豆免费观看完整版 | 在线播放精品视频| 久久久久国产一区二区三区四区 | 国产偷亚洲偷欧美偷精品| av资源吧首页| 丰满少妇久久久久久久| 欧洲精品视频在线| 欧美电影免费看| 亚洲欧美激情视频| 中文字幕在线日本| 国产人妖乱国产精品人妖| 欧美 日韩 国产 激情| 国产一区二区三区网| 国产精品国产三级国产专播精品人| 国产三级在线看| 欧美亚洲国产一区二区三区va | 91精品小视频| 亚洲欧美日韩视频二区| 欧美精品欧美精品| 精品成人av| 最近中文字幕2019免费| 国产又黄又爽视频| 一区二区三区不卡在线观看| 国产精品果冻传媒| 国产一级一区二区| 少妇免费毛片久久久久久久久| 成人交换视频| 久久中文精品视频| 欧美一级视频免费| 欧美日韩国产一区在线| 欧美激情 一区| 韩日av一区二区| 国产乱淫av片杨贵妃| 竹菊久久久久久久| 国产欧美精品xxxx另类| 日本动漫同人动漫在线观看| 91久久精品国产91性色| gogo在线观看| 精品国产成人在线影院| 国产无套丰满白嫩对白| 中文字幕欧美日本乱码一线二线| 污视频网址在线观看| 黄色欧美成人| 欧美三级电影在线播放| 99精品在线免费观看| 欧美精品videossex性护士| 日本国产在线| 538在线一区二区精品国产| 精品无码av在线| 欧美激情中文字幕一区二区| 妖精视频在线观看| 日韩影院免费视频| avav在线播放| 五级黄高潮片90分钟视频| 精品五月天堂| 国产精品午夜视频| 97人人在线视频| 日韩中文字幕在线观看| 天天综合网在线| 3d成人动漫网站| 东京热一区二区三区四区| 亚洲色图一区二区| 亚洲熟妇无码av| 国产在线观看一区二区| 哪个网站能看毛片| 国模一区二区三区| 一区二区在线中文字幕电影视频| 秋霞影视一区二区三区| 亚洲一区二区三区在线免费观看| 人人鲁人人莫人人爱精品| 久久久久久中文字幕| 日本美女在线中文版| 国产视频自拍一区| 农村少妇久久久久久久| 欧美日本乱大交xxxxx| 天堂中文字幕在线观看| 洋洋av久久久久久久一区| 天美传媒免费在线观看| 久久久久久97三级| www.超碰97| 国产91高潮流白浆在线麻豆 | 久久青青视频| 午夜免费日韩视频| 日韩精品亚洲人成在线观看| 久久久精品一区| 无遮挡的视频在线观看| 在线视频日韩精品| 国产精品免费播放| 亚洲精品一区二区在线| 日日夜夜精品免费| 精品99999| 亚洲精品无amm毛片| 欧美一级爆毛片| 国产av精国产传媒| 5月丁香婷婷综合| 91精品视频免费在线观看| 欧美性受xxxx黑人xyx性爽| 成人午夜淫片100集| 亚洲成人久久影院| 久草视频在线观| 黑人巨大精品欧美一区免费视频 | 精品国产一区二区三| 国产精品无码永久免费不卡| 麻豆国产91在线播放| 久久久久国产一区| 蜜乳av一区二区| 孩娇小videos精品| 蜜臀av一区二区在线观看| 美女网站免费观看视频| 欧美中文在线| 亚洲久久久久久久久久久| 天天色棕合合合合合合合| 亚洲激情自拍图| 亚洲三级黄色片| 亚洲欧美国产va在线影院| 国内三级在线观看| 色偷偷综合社区| av电影免费在线观看| 欧美激情喷水视频| 色偷偷偷在线视频播放| 欧美自拍大量在线观看| 成人黄色毛片| 99国产视频| 一道本一区二区三区| 亚洲黄色一区二区三区| 9191国语精品高清在线| 久久综合久久网| 视频一区视频二区中文| 亚洲一级免费观看| 国产精品一二三在| 久久久久久久人妻无码中文字幕爆| 99精品偷自拍| 色www亚洲国产阿娇yao| 亚洲三级免费观看| 你懂的国产在线| 欧美日韩久久不卡| 色丁香婷婷综合久久| 亚洲图片欧洲图片av| av网站免费在线观看| 91高潮精品免费porn| 九色成人搞黄网站| 成人自拍偷拍| 日韩久久视频| 欧美精品卡一卡二| 美女mm1313爽爽久久久蜜臀| 国产亚洲精品成人a| 国产三级欧美三级日产三级99| 懂色av粉嫩av蜜臀av一区二区三区| 一区二区激情小说| 波多野结衣视频在线看| 欧美变态口味重另类| 国产精品一级伦理| 欧美疯狂性受xxxxx另类| www.com.cn成人| 91成人在线看| 成人免费看片39| 色综合久久久久无码专区| 久久99热这里只有精品| 欧类av怡春院| 亚洲欧美一区二区不卡| 三级网站在线播放| 欧美成人精品二区三区99精品| 久久精品蜜桃| 久久久久女教师免费一区| 91国内外精品自在线播放| 国精产品一区二区| 欧美1区2区| 中文字幕av不卡在线| 26uuu另类欧美亚洲曰本| 久草视频免费在线播放| 欧美性三三影院| 天堂v视频永久在线播放| 欧美巨乳在线观看| 欧美综合社区国产| 欧美精品亚洲| 亚洲日本激情| 男人的天堂免费| 亚洲丝袜自拍清纯另类| 中文字幕观看视频| 亚洲欧美国内爽妇网| 成人影院在线视频| www日韩av| 亚洲一区色图| 99re6在线观看| 国产精品理伦片| 波多野结衣二区三区| 亚洲女同精品视频| 中文一区一区三区高中清不卡免费| 成人蜜桃视频| 欧美另类视频| 男生和女生一起差差差视频| 自拍偷拍欧美激情| 国产精品无码在线播放| 按摩亚洲人久久| 日本中文字幕视频一区| 亚洲人成网站在线播放2019| 青青草成人在线观看| 人妻aⅴ无码一区二区三区| 色综合久久久久综合99| 青青草娱乐在线| 国产成人久久久| 狠狠做六月爱婷婷综合aⅴ | 中文字幕av免费在线观看| 欧美日韩激情一区二区| 麻豆av免费在线观看| 成人精品一区二区三区电影黑人| 日韩免费久久| 成年人网站av| 一区二区三区小说| 亚洲国产精品欧美久久| 77777少妇光屁股久久一区| 欧美亚洲大陆| 欧美日韩大尺度| 国产精品私人影院| 一级片aaaa| 久久99久国产精品黄毛片入口| 一区二区三区国产好| 成人免费视频91| 91亚洲精品久久久蜜桃网站| www五月天com| 日韩亚洲一区二区| 亚洲91网站| jizzjizzxxxx| 亚洲国产高清在线观看视频| 国产又粗又长视频| 欧美黄色成人网| 伊人久久大香线蕉av不卡| 在线免费观看视频黄| 樱桃视频在线观看一区| 视频一区 中文字幕| 国产精品h片在线播放| 欧美黄色大片在线观看| 无码人妻aⅴ一区二区三区玉蒲团| 婷婷综合在线观看| 国产爆初菊在线观看免费视频网站| 国产在线一区二区三区| 狠狠综合久久av一区二区老牛| 国产国语性生话播放| 欧美日韩一级视频| 欧美24videosex性欧美| 日本成人黄色免费看| 国产一区福利在线| 天天干在线播放| 久久综合五月天| 欧美巨大xxxx| 日韩av片免费观看| 欧美日韩中文字幕在线视频| 成人影院在线看| 免费一区二区三区| 狠狠色丁香九九婷婷综合五月| 免费在线不卡视频| 久久夜精品va视频免费观看| 欧美激情影院| 午夜免费视频网站| 91九色最新地址| 国产在线xxx| 中文精品一区二区三区| 99久久免费国产| 国产av精国产传媒| 国产精品久久久| 亚洲深夜福利| 久久成人国产精品入口| 中文字幕精品av| 亚洲小说图片|