国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

如果我放棄 React,那一定只有一個(gè)原因

開發(fā) 前端
我研究了一下,看看能不能直接在 React 組件中直接使用 class,而不是 ??className??,這樣我的代碼演示不就對(duì)味兒了嗎?這一次,折騰了一會(huì)兒,我還真研究出來了!

React 有一個(gè)我忍了很久的痛點(diǎn)。如果有一天,我決定放棄 React 轉(zhuǎn)向其他的框架,那么一定是這個(gè)痛點(diǎn)我終于忍不了了。

這個(gè)痛點(diǎn)就是 className

<div className='relative pt-16'></div>

特別是最近我正在寫一本關(guān)于 CSS 的專欄時(shí),這個(gè)痛點(diǎn)已經(jīng)把我逼到了幾乎忍受不了的程度。

由于我的網(wǎng)站里,為了確保一致性、真實(shí)性、有效性,文章里的案例全部都是直接使用的內(nèi)嵌案例的真實(shí)代碼,但是網(wǎng)站是用 React 來寫的,因此能夠直接運(yùn)行的代碼也是 React 組件,展示出來的也就是 React 的代碼。

但是這本專欄是專門介紹 CSS 的,如果代碼中展示出來的是使用的 className,反正我不知道其他人是什么感受,我是越看越別扭,總感覺哪哪哪都不對(duì)勁。

所以我就想要研究一下,看看能不能直接在 React 組件中直接使用 class,而不是 className,這樣我的代碼演示不就對(duì)味兒了嗎?

這一次,折騰了一會(huì)兒,我還真研究出來了!
export default function Page() {
  return (
    <div class='relative pt-16'>
      <div class="fixed inset-0 -z-10">
        <div class="absolute inset-0 bg-[linear-gradient(to_right,#80808012_1px,transparent_1px),linear-gradient(to_bottom,#80808012_1px,transparent_1px)] bg-[size:40px_40px]"></div>
      </div>
      ...
    </div>
  )
}

我們先來了解一下 className 的歷史原因,以及使用 class 之后可能會(huì)存在的問題,最后再給大家介紹具體如何操作。

1.歷史原因

className 在 React 社區(qū)中爭(zhēng)議了很多年,但是在設(shè)計(jì)之初,據(jù)說是為了在 token 層面,與聲明類的關(guān)鍵字 class 區(qū)分開來,因此選擇了重命名為 className

class MyComponent extends Component {
  // ...
}

不過除此之外,dan 在 github 中有提過另外一個(gè)理由。如下所示,在 JavaScript 中,給 DOM 設(shè)置屬性有兩種方式,一種是 property,另外一種 attribute

node.value = 10; // setting a property
node.setAttribute('value', '10'); // setting an attribute

而 JSX 由于被約定為是 JS 語法的擴(kuò)展,因此,React 團(tuán)隊(duì)認(rèn)為使用 JS 默認(rèn)的 className 字段給 DOM 設(shè)置屬性比較合適。

node.className = ''  // 表現(xiàn)為 property,而非 attribute

2.爭(zhēng)議

盡管 dan 為此解釋了很多次,但許多 React 開發(fā)者并不為此買賬,在社區(qū)中強(qiáng)烈要求能夠在 JSX 中使用 class

并且在后續(xù)的更新中,提議將 className 修改為 class 的聲音越來越大。

React 團(tuán)隊(duì)為此不得不做出了妥協(xié)。

因此,在 React 17/18 的版本中,其實(shí)我們就可以直接在 JSX 中使用 class 了。但是他們又沒完全妥協(xié),選擇的方式是,你可以用,代碼也能正常運(yùn)行,但是 React 會(huì)給你報(bào)錯(cuò) ~ 就很惡心

dan 的解釋是,

如果 React 團(tuán)隊(duì)毫無預(yù)警的同時(shí)支持 class 與 className,會(huì)在 React 生態(tài)中造成巨大的分歧。并不是所有的三方庫都會(huì)同時(shí)兼容這兩個(gè)方案,如果你使用的某一個(gè)三方庫不兼容 class,那么就會(huì)導(dǎo)致樣式的傳遞中斷,出現(xiàn)問題。

React 團(tuán)隊(duì)無法完全左右社區(qū),對(duì)于這種沖突無能為力,因此,長(zhǎng)期以來,class 仍然以預(yù)警的方式存在。

但是,忍了 7 年了,我已經(jīng)忍不了了,我決定不管要付出什么樣的代價(jià),必須要用 class,哪怕最后放棄使用 react。

那為了使用 class,我們要做什么額外的事兒呢?

3.弊端以及如何解決

在這之前,我們要明確,React 中,是支持直接使用 class 的。因此從功能的角度上而言,我們啥也不需要做,直接用就可以了。

但是當(dāng)你直接使用之后,你會(huì)遇到一堆麻煩事兒需要解決。

首先,如果你的項(xiàng)目中使用了 TypeScript,他會(huì)瘋狂報(bào)錯(cuò),為了解決這個(gè)問題,我們要去修改 TypeScript 的類型聲明。

在 @types/react 這個(gè)庫中,我們?cè)?nbsp;HTMLAttributes 這個(gè)類型下面新增 class 字段。

interface HTMLAttributes<T> extends AriaAttributes, DOMAttributes<T> {
  ...
  className?: string | undefined;
  class?: string | undefined;
  ...
}

處理好之后就搞定了。不過手動(dòng)修改有一個(gè)比較麻煩的地方,就是每次你重新 install 之后,這段代碼就會(huì)被覆蓋,又還原成之前的樣子。那么這個(gè)時(shí)候你有兩個(gè)選擇,

第一,由于修改起來比較簡(jiǎn)單,而且 install 頻率也非常低,因此你可以每次都手動(dòng)修改一下。

第二,你在 install 時(shí)執(zhí)行一個(gè)本地腳本,用 node 代碼自動(dòng)去插入這段邏輯。

接下來的一個(gè)問題就是 eslint 等語法檢測(cè)規(guī)則可能會(huì)報(bào)錯(cuò),我們可以修改 ESLint 配置文件以消除這個(gè)錯(cuò)誤。

"react/no-unknown-property": ["off"]

然后就是在開發(fā)環(huán)境中,console 面板里會(huì)報(bào)錯(cuò),如下所示:

為了解決這個(gè)問題,我們需要在項(xiàng)目入口處,重寫 console.error 的報(bào)錯(cuò)規(guī)則,具體代碼我也已經(jīng)研究出來了,分享給大家。

const originalError = console.error;

console.error = function(...args) {
  const ignorePatterns = [
    'Invalid DOM property `%s`. Did you mean `%s`?',
    'class',
    'className'
  ];

  let shouldIgnore = true;

  ignorePatterns.forEach((pattern, index) => {
    if (typeof args[index] !== 'string' || !args[index].includes(pattern)) {
      shouldIgnore = false;
    }
  });

  if (!shouldIgnore) {
    originalError.apply(console, args);
  }
};

這段代碼僅會(huì)消除 class 的報(bào)錯(cuò),而不影響其他。

到這里,基本上所有的報(bào)錯(cuò)都解決掉了。

當(dāng)我在群里和朋友圈分享這個(gè)的時(shí)候,有朋友問我是不是引入了什么三方工具或者插件,或者會(huì)不會(huì)影響編譯結(jié)果,現(xiàn)在大家知道了,我沒有用任何三方工具,只是修改了一些無關(guān)痛癢的報(bào)錯(cuò)提示。

并且,對(duì)于代碼執(zhí)行、編譯不會(huì)有任何影響。

最后一個(gè)問題,如果你正在開發(fā)底層組件庫,并且決定支持 className 的傳入時(shí),這里還會(huì)遇到一個(gè)新的問題。一個(gè)就是你需要同時(shí)支持 class 的傳入,并且,當(dāng)你使用結(jié)構(gòu)時(shí),必須對(duì) class 進(jìn)行重命名

const { class: cls } = props;

這個(gè)小的細(xì)節(jié)是 React 團(tuán)隊(duì)所擔(dān)心的,會(huì)引起社區(qū)分歧的核心原因。但是如果是個(gè)人項(xiàng)目,你可以完全把控你的代碼細(xì)節(jié),那么這個(gè)分歧對(duì)于個(gè)人來說并不會(huì)有太大的影響。

4.總結(jié)

這是一個(gè)個(gè)人偏好的操作,我并不推薦大家像我一樣使用。如果你也跟我一樣討厭 className,并且決定在項(xiàng)目中使用 class,可以參考一下我的做法,我基本上把潛在的隱患都考慮到了,放心使用是沒問題的。

責(zé)任編輯:姜華 來源: 這波能反殺
相關(guān)推薦

2011-04-07 09:32:49

遞歸

2018-01-02 10:46:24

微信騰訊表情

2020-08-30 14:31:40

Python編程語言開發(fā)

2013-08-09 10:44:55

創(chuàng)始人創(chuàng)業(yè)獨(dú)立創(chuàng)業(yè)

2022-02-18 10:52:52

Elastic亞馬遜AWS

2018-05-23 11:43:59

數(shù)據(jù)庫

2020-08-18 11:21:28

數(shù)據(jù)挖掘機(jī)器學(xué)習(xí)算法

2021-04-07 20:01:23

Go變量常量

2017-10-16 12:52:51

2024-06-14 08:11:33

Spring技巧開發(fā)

2017-09-11 20:40:49

2022-07-20 07:29:52

Java

2013-07-30 14:06:30

Google中國(guó)殺手

2022-03-07 05:53:41

線程CPU代碼

2024-06-27 09:17:33

2015-07-17 09:59:18

2015-06-17 11:18:01

WiFi

2015-03-30 10:48:17

大數(shù)據(jù)大數(shù)據(jù)處理Hadoop

2019-01-21 08:20:17

通信4G5G

2021-02-26 09:04:22

數(shù)組ArrayListHashMap
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

97一区二区国产好的精华液| 狼人精品一区二区三区在线| 亚洲精品国产无天堂网2021| 伊人久久青草| 综合天堂av久久久久久久| 欧美精品中文字幕一区| 精品欧美一区二区三区在线观看| 欧美亚男人的天堂| 国产中文字幕在线看| 亚洲一二三区在线观看| 国产三级香港三韩国三级| 国产网红主播福利一区二区| 中文字幕精品在线播放 | 日韩欧美综合一区| 国产精品一级伦理| 欧美私人免费视频| 95在线视频| 欧美日韩国产欧美日美国产精品| 国产福利在线| 欧美午夜精品电影| 男人天堂久久久| 日韩女优av电影在线观看| 电影k8一区二区三区久久| 亚洲国产欧美在线成人app| 樱花草涩涩www在线播放| 亚洲美女黄色片| 久久综合给合| 国产精品福利在线观看| 一区二区在线| 亚洲成色最大综合在线| 波多野结衣视频一区| 一道本在线免费视频| 欧美日韩另类视频| 米奇精品一区二区三区| 亚洲欧美在线播放| 国产精品色在线网站| 91香蕉亚洲精品| 捆绑紧缚一区二区三区视频 | 蜜桃视频一区二区三区 | 国产三级在线免费| 精品欧美久久久| 成人黄色免费短视频| 久久久久久国产精品三级玉女聊斋| 免费精品国产| 精品国产乱码久久久久久丨区2区| 视频一区视频二区中文| 91视频 -- 69xx| 亚洲国产aⅴ天堂久久| 黄页网站大全在线免费观看| 欧美精品在线免费观看| 久久久久电影| 日韩欧美猛交xxxxx无码| 亚洲夂夂婷婷色拍ww47| 3344国产永久在线观看视频| 久久久在线视频| 亚洲专区一区| 精品中文字幕av| 91高清在线观看| 国产精品美女午夜爽爽| 成人做爽爽免费视频| 国产原创一区二区| 中文字幕免费在线| 永久免费精品影视网站| 国产精品久久久久久| 亚洲一区 在线播放| 悠悠色在线精品| 成人免费看黄| 99超碰麻豆| 国产欧美日韩中文久久| 尤物视频在线看| 国产成人精品999| 麻豆成人综合网| 中文字幕视频免费在线观看| 一本一道久久a久久精品逆3p| 亚洲天天综合| 一女被多男玩喷潮视频| 欧美私模裸体表演在线观看| 三级欧美日韩| 亚洲乱码一区二区三区| 亚洲成人777| 91成人福利社区| 欧美日韩在线精品| 亚洲一区二区三区四区在线免费观看| 超级碰碰久久| 国产69精品久久久久9999apgf| 国产视频不卡一区| 91视频欧美| 国产一区二区中文字幕免费看| 国产精品久久久久久久浪潮网站| 欧美aa在线观看| 蜜桃导航-精品导航| 五月婷婷另类国产| 亚洲精品一二三**| av 日韩 人妻 黑人 综合 无码| 色欧美88888久久久久久影院| 红杏视频成人| 国产成人黄色片| 亚洲天堂av女优| 老鸭窝毛片一区二区三区| 亚洲国产资源| 国产aⅴ夜夜欢一区二区三区| 蜜臀av性久久久久蜜臀av麻豆| 四虎在线免费观看| 国产精品福利片| 中文字幕久久午夜不卡| 超碰这里只有精品| 亚洲欧洲国产日韩精品| 欧美女孩性生活视频| 亚洲精品久久| 中文字幕电影在线观看| 97在线精品国自产拍中文| 9人人澡人人爽人人精品| 涩涩涩在线视频| 亚洲欧美日韩精品久久久 | 美国av一区二区| 网友自拍视频在线| 亚洲一区二区中文| 亚洲自拍偷拍综合| 国内成人精品| 精产国产伦理一二三区| 欧洲中文字幕国产精品| 亚洲婷婷国产精品电影人久久| 大型av综合网站| 涩涩漫画在线观看| 久久免费在线观看| 国产精品视频麻豆| 97久久综合精品久久久综合| 久久综合久久色| 欧美黄色片免费观看| 国产色综合一区| 中文一区二区三区四区| 成人eeuss影院在线观看| 91av在线播放视频| 亚洲自拍偷拍九九九| 成人在线丰满少妇av| 中文字幕在线播放第一页| 国产精品无码专区在线观看| 午夜久久电影网| 激情视频一区| 欧美韩日亚洲| 成人性生活视频免费看| 欧美疯狂xxxx大交乱88av| 亚洲视频一区二区在线| 久久久久国产| 在线不卡日本v二区707| www.好吊操| 97视频在线免费观看| 精品福利在线看| 亚洲美女一区| 麻豆网站免费在线观看| 欧美成人精品欧美一级乱| 51午夜精品视频| 欧美午夜视频一区二区| 午夜在线一区| 日本久久二区| **毛片在线网站| 美脚丝袜一区二区三区在线观看| 亚洲精品日韩欧美| 国产精品久久三| 亚洲精品欧洲| 国产成人精品一区二区三区视频| 亚洲性图一区二区| 成人午夜电影在线播放| 亚洲人成伊人成综合网久久久| 国产精品成人一区二区艾草| 欧美国产先锋| 日韩大尺度黄色| www污污在线| 日日噜噜噜夜夜爽爽| 97热在线精品视频在线观看| 欧美午夜免费电影| 99亚偷拍自图区亚洲| 成人在线免费观看91| 97天天综合网| 美女免费免费看网站| 视频一区国产精品| 91成人精品网站| 精品久久久网站| 中文字幕一区三区| 日韩中文字幕av电影| 红杏aⅴ成人免费视频| 成人影院www在线观看| 无码内射中文字幕岛国片| 国产精华一区二区三区| 色偷偷av亚洲男人的天堂| 欧美小视频在线| 91捆绑美女网站| 极品裸体白嫩激情啪啪国产精品| 99久久这里有精品| 亚洲搞黄视频| 先锋影音资源综合在线播放av| 欧美人与性禽动交精品| 国内成人精品视频| 精品国一区二区三区| 一区二区三区四区视频精品免费 | 黑人中文字幕一区二区三区| 色噜噜亚洲精品中文字幕| 日本韩国视频一区二区| 国产人久久人人人人爽| 久久久一二三|