首頁 > 軟體

React樣式衝突解決問題的方法

2023-03-11 06:00:50

前言:

1、React最終編譯打包後都在一個html頁面中,如果在兩個元件中取一樣類名分別參照在自身,那麼後者會覆蓋前者
2、預設情況下,只要匯入了元件,不管元件有沒有顯示在頁面中,元件的樣式就會生效。

解決方案:

  • 手動處理 (起不同的類名,但是專案一大就會導致類名很亂,不利於團隊共同作業)
  • CSS IN JS以js的方式來處理css(推薦)
  • css不是一門程式語言,css沒有所有的區域性作用域全域性作用域這樣的區分。。。css只有全域性作用域

CSS IN JS

一、概念

CSS IN JS:是使用 JavaScript 編寫 CSS 的統稱,用來解決 CSS 樣式衝突、覆蓋等問題

CSS IN JS 的具體實現有 50 多種,比如:React常用(CSS Modules、styled-components)、 Vue常用(<style scoped>css modules)等

推薦使用:CSS Modules React腳手架已整合,可直接使用

二、CSS Modules

  • CSS Modules 通過對 CSS 類名重新命名,保證每個類名的唯一性,從而避免樣式衝突的問題
  • 換句話說:所有類名都具有“區域性作用域”,只在當前元件內部生效
  • 在 React 腳手架中:檔名、類名、hash(隨機)三部分,只需要指定類名即可 BEM
  • xxxx.module.css

1、自動生成的類名,我們只需要提供 classname 即可
[filename]_[classname]_[hash]
2、
類名:.error {} .red{}
實際生成的類名為:.NavHeader_error__ax7yz .NavHead_red_abcdc (相同命名的類名,經過module處理以後,會生成不同的實際類名,特殊標識)

三、在專案中使用css Modules

建立名為 [name].module.css 的樣式檔案(React腳手架中的約定,與普通 CSS 作區分)

元件中匯入該樣式檔案(注意語法)

通過 styles 物件存取物件中的樣式名來設定樣式

css module的注意點:

  • 類名最好使用駝峰命名,因為最終類名會生成styles的一個屬性.tabBar {} => styles.tabBar
  • 如果沒有使用駝峰命名,對於不合法的命名,需要使用[]語法.tab-bar {} => styles['tab-bar']
  • 如果是全域性的類名,應該使用:global(.類名)的方式,不然會把全域性類名給修改掉

:global(.icon-map) { }這樣css modules就不會修改掉類名了

四、css module配合sass

  • css moudule也可以配合sass來使用,建立名為[name].module.scss
  • 使用css modules解決Login元件樣式衝突問題
  • 如果sass檔案中使用到了連結,需要使用絕對路徑~

五、module.scss 使用步驟:

六、總結

React樣式衝突總結:

sass和CSS Moudles 的搭配使用,解決了React中樣式衝突的問題。

我們仍然可以在不同元件中使用相同類名,但我們需要知道,名字相同的類名在Moudle的作用下,實際類名並不相同,以此確保了,樣式只在當前元件內生效。

React採取的是元件化程式設計,元件和元件對應的樣式會放在同一個元件資料夾下。

但我們仍然需要知道:在最後編譯打包之後,所有元件的解構和樣式,都會打包在同一個html頁面中。

到此這篇關於React樣式衝突解決問題的方法 的文章就介紹到這了,更多相關React樣式衝突內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com