欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

React中編寫CSS實(shí)例詳解

 更新時(shí)間:2022年09月08日 10:58:49   作者:coderwxf  
這篇文章主要為大家介紹了React中編寫CSS實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

正文

目前,前端最流行的開發(fā)方式是組件化,而CSS的設(shè)計(jì)本身就不是為組件化而生的,所以在目前組件化的框架中都在需要一種合適的CSS解決方案

在組件化開發(fā)環(huán)境下的CSS,應(yīng)該滿足如下需求:

  • 可以編寫局部css: css具備自己的具備作用域,不會(huì)隨意污染其他組件內(nèi)的元素
  • 可以編寫動(dòng)態(tài)的css: 可以獲取當(dāng)前組件的一些狀態(tài),根據(jù)狀態(tài)的變化生成不同的css樣式
  • 支持所有的css特性:偽類、動(dòng)畫、媒體查詢等
  • 編寫起來(lái)簡(jiǎn)潔方便、最好符合一貫的css風(fēng)格特點(diǎn)
  • 等等 。。。。

Vue在CSS上雖然不能稱之為完美,但是已經(jīng)足夠簡(jiǎn)潔、自然、方便了,至少統(tǒng)一的樣式風(fēng)格不會(huì)出現(xiàn)多個(gè)開發(fā)人員、多個(gè)項(xiàng)目 采用不一樣的樣式風(fēng)格

相比而言,React官方并沒有給出在React中統(tǒng)一的樣式風(fēng)格

由此,從普通的css,到css modules,再到css in js,有幾十種不同的解決方案,上百個(gè)不同的庫(kù)

大家一致在尋找最好的或者說(shuō)最適合自己的CSS方案,但是到目前為止也沒有統(tǒng)一的方案

內(nèi)聯(lián)樣式

內(nèi)聯(lián)樣式是官方推薦的一種css樣式的寫法:

  • style 接受一個(gè)采用小駝峰命名屬性的 JavaScript 對(duì)象,而不支持 CSS 字符串形式寫法
  • 并且可以引用state中的狀態(tài)來(lái)設(shè)置相關(guān)的樣式

優(yōu)點(diǎn)

  • 內(nèi)聯(lián)樣式, 樣式之間不會(huì)有沖突
  • 可以動(dòng)態(tài)獲取當(dāng)前state中的狀態(tài)

缺點(diǎn)

  • 寫法上都需要使用駝峰標(biāo)識(shí)
  • 某些樣式?jīng)]有提示
  • 大量的樣式, 代碼混亂
  • 某些樣式無(wú)法編寫(比如偽類/偽元素)

所以官方依然是希望內(nèi)聯(lián)合適和普通的css來(lái)結(jié)合編寫

import React, { PureComponent } from 'react'
export class App extends PureComponent {
  constructor(props) {
    super(props)
    this.state = {
      color: 'red'
    }
  }
  render() {
    return (
      <div style={{ colot: this.state.color, backgroundColor: 'skyblue' }}>App</div>
    )
  }
}
export default App

普通的CSS

普通的css我們通常會(huì)編寫到一個(gè)單獨(dú)的文件,之后再進(jìn)行引入

這樣的編寫方式和普通的網(wǎng)頁(yè)開發(fā)中編寫方式是一致的

但是使用這種方式編寫我們的css有一個(gè)致命缺點(diǎn),即沒有自己的樣式作用域

默認(rèn)引入的樣式都是全局樣式

import React, { PureComponent } from 'react'
import './style.css'
export class App extends PureComponent {
  constructor(props) {
    super(props)
    this.state = {
      color: 'red'
    }
  }
  render() {
    return (
      <div>App</div>
    )
  }
}
export default App

css modules

css modules并不是React特有的解決方案,而是所有使用了類似于webpack配置的環(huán)境下都可以使用的

如果在其他項(xiàng)目中使用它,那么我們需要自己來(lái)進(jìn)行配置,比如配置webpack.config.js中的modules: true等

如果使用React腳手架,其內(nèi)部已經(jīng)內(nèi)置了css modules的配置

.css/.less/.scss 等樣式文件都需要修改成 .module.css/.module.less/.module.scss 等 之后就可以引用并且進(jìn)行使用了

import React, { PureComponent } from 'react'
// 引入css modules - 實(shí)際會(huì)將對(duì)應(yīng)的css文件編譯為一個(gè)JS對(duì)象
// 當(dāng)我們將一個(gè)樣式文件的后綴名修改為 .module.css的時(shí)候,對(duì)應(yīng)樣式文件就變成了css樣式模塊
import AppStyle from './style.module.css'
export class App extends PureComponent {
  constructor(props) {
    super(props)
    this.state = {
      color: 'red'
    }
  }
  render() {
    return (
      <div>
				{/*
					css modules 會(huì)將css文件編譯為js對(duì)象,所以需要向?qū)傩阅菢邮褂?
					同理 如果使用了一個(gè)樣式模塊中不存在的樣式,對(duì)應(yīng)值就是undefined
					實(shí)際表現(xiàn)為對(duì)應(yīng)元素樣式不生效, 頁(yè)面并不會(huì)報(bào)錯(cuò)
				*/}
				<h2 className={AppStyle.title}>title</h2>
				{/*
					對(duì)應(yīng)的樣式會(huì)被編譯w為 style_content__O3F7P
					也就是 [樣式文件名]_[樣式名]__[hash值]
					從而避免出現(xiàn)樣式?jīng)_突
				*/}
				<p className={AppStyle.content}>content</p>
			</div>
    )
  }
}
export default App

但是CSS modules依舊存在自己的缺點(diǎn)

  • 引用的類名,不能直接使用連接符(.home-title),需要使用中括號(hào)語(yǔ)法,因?yàn)檫B字符在JavaScript中是不識(shí)別的
  • 所有的className都必須使用{style.className} 的形式來(lái)編寫
  • 不方便動(dòng)態(tài)來(lái)修改某些樣式,依然需要使用內(nèi)聯(lián)樣式的方式

css in js

“CSS-in-JS” 是指一種模式,其中 CSS 由 JavaScript 生成而不是在外部文件中定義

注意此功能并不是 React 的一部分,而是由第三方庫(kù)提供

React的思想中認(rèn)為邏輯本身和UI是無(wú)法分離的,所以才會(huì)有了JSX的語(yǔ)法

事實(shí)上CSS-in-JS的模式就是一種將樣式(CSS)也寫入到JavaScript中的方式,并且可以方便的使用JavaScript的狀態(tài)

所以React有被人稱之為 All in JS

CSS-in-JS通過(guò)JavaScript來(lái)為CSS賦予一些能力,包括類似于CSS預(yù)處理器一樣的樣式嵌套、函數(shù)定義、邏輯復(fù)用、動(dòng)態(tài)修 改狀態(tài)等等

所以,目前可以說(shuō)CSS-in-JS是React編寫CSS最為受歡迎的一種解決方案

目前最為常用的css-in-js庫(kù)是 styled-components

npm install styled-components

組件

import React, { PureComponent } from 'react'
// 使用css in js后,對(duì)應(yīng)的樣式直接編寫在js文件中即可
import AppWrapper from './style.js'
export class App extends PureComponent {
  render() {
    return (
      <AppWrapper>
				<h2 className="title">title</h2>
				<p className="content">content</p>
			</AppWrapper>
    )
  }
}
export default App

樣式

import styled from 'styled-components'
// styled.div本質(zhì)上是一個(gè)函數(shù)  需要通過(guò)標(biāo)簽?zāi)0遄址M(jìn)行調(diào)用 并返回一個(gè)新的有對(duì)應(yīng)樣式的組件
// ps: 默認(rèn)情況下對(duì)應(yīng)樣式是不會(huì)高亮的,需要高亮可以安裝vscode-styled-components插件
export default styled.div`
	/* 對(duì)應(yīng)樣式會(huì)被編譯為 .jaGVDq */
	/* 即一個(gè)唯一的hash值 */
	/* 所以使用styled-components編寫對(duì)應(yīng)的樣式會(huì)存在自己的樣式作用域 */
	/* 組件和組件之間的樣式是不會(huì)沖突的 */
	/* 
		但因?yàn)榫幾g后的樣式類似于 .jaGVDq .content
		所以在實(shí)際使用過(guò)程中,對(duì)于后代選擇器仍然可能出現(xiàn)樣式?jīng)_突的情況
  */
	background-color: #f5f5f5;
	/* .jaGVDq .title */
	.title {
		color: red;
		&:hover {
			background-color: gray;
		}
	}
	/* .jaGVDq .content */
	.content {
		color: skyblue
	}
`

樣式組件

import styled from 'styled-components'
export default styled.div`
	background-color: #f5f5f5;
	.content {
		color: skyblue
	}
`
// 如果某一塊的樣式比較多,可以將對(duì)應(yīng)的樣式進(jìn)行單獨(dú)抽離
// 形成一個(gè)獨(dú)立的樣式組件
export const TitleWrapper = styled.h2`
	color: red;
	&:hover {
		background-color: gray;
	}
`

引入外部變量

import React, { PureComponent } from 'react'
import AppWrapper from './style.js'
export class App extends PureComponent {
	constructor(props) {
		super(props)
		this.state = {
			color: 'skyblue'
		}
	}
  render() {
    return (
			// AppWrapper本質(zhì)上是一個(gè)組件
			// 所以對(duì)應(yīng)的樣式直接以props的形式進(jìn)行傳入即可
      <AppWrapper color={ this.state.color }>
				<h2 className="title">title</h2>
				<p className="content">content</p>
			</AppWrapper>
    )
  }
}
export default App
import styled from 'styled-components'
export default styled.div`
	.title {
		/*
			如果直接使用props.color 在js中 會(huì)沿著作用域鏈去查找對(duì)應(yīng)的props
			所以直接使用props 在css in js中是不合適的
			所以在styled-components中引入外部變量的時(shí)候,需要傳入一個(gè)回調(diào)函數(shù)
			該回調(diào)函數(shù)的參數(shù)為外部傳入的props,返回值是所需要設(shè)置的對(duì)應(yīng)樣式值
		*/
		color: ${ props => props.color };
		&:hover {
			background-color: gray;
		}
	}
	.content {
		color: gray
	}
`

默認(rèn)值

import styled from 'styled-components'
// 因?yàn)閟tyled-components 本質(zhì)上就是css in js
// 所以我們也可以通過(guò)如下方式來(lái)使用styled-components
export default styled.div`
	.title {
		// 解構(gòu)語(yǔ)法
		color: ${ ({ color }) => color };
		&:hover {
		  // 解構(gòu)的時(shí)候 設(shè)置對(duì)應(yīng)的默認(rèn)值
			background-color: ${ ({ bgColor = 'yellow' }) => bgColor };
		}
	}
	.content {
	 	// 空值合并操作符
		color: ${ ({ contentColor }) => contentColor ?? 'orange' }
	}
`

有的時(shí)候,我們希望在外部沒有傳入對(duì)應(yīng)props的時(shí)候,可以存在對(duì)應(yīng)的默認(rèn)值

但是使用上述寫法,每使用一次就需要單獨(dú)設(shè)置一次對(duì)應(yīng)的默認(rèn)值,這必然是十分麻煩的

所以styled-components提供了attrs方法,專門用于設(shè)置默認(rèn)值

import styled from 'styled-components'
// attrs方法會(huì)返回對(duì)應(yīng)的含有樣式的樣式組件
// 所以在這里可以鏈?zhǔn)秸{(diào)用
// 在attrs中可以傳入一個(gè)回調(diào)函數(shù),用于設(shè)置對(duì)應(yīng)的默認(rèn)值
// 回調(diào)函數(shù)在被調(diào)用的時(shí)候會(huì)將對(duì)應(yīng)的props傳遞過(guò)來(lái)
export default styled.div.attrs(props => ({
	contentColor: props.contentColor ?? 'purple'
}))`
	.title {
		color: ${ props => props.color };
		&:hover {
			background-color: gray;
		}
	}
	.content {
		color: ${ props => props.contentColor }
	}
`

引入全局樣式

/style/theme.js --- 全局的主題樣式文件

export const primaryColor = '#409eff'
export const warnColor = '#e6a23c'
export const successColor = '#67c23a'

樣式組件

import styled from 'styled-components'
import {
	primaryColor,
	successColor
} from '../style/theme'
export default styled.div`
	.title {
		color: ${ successColor };
		&amp;:hover {
			background-color: gray;
		}
	}
	.content {
		color: ${ primaryColor }
	}
`

provider

app.jsx

import ReactDOM from 'react-dom/client'
import App from './App'
import { StrictMode } from 'react'
import { ThemeProvider } from 'styled-components';
ReactDOM.createRoot(document.querySelector('#root')).render(
	<StrictMode>
		{/*
			ThemeProvider 是 styled-components中 導(dǎo)出的 context
			通過(guò)theme屬性來(lái)設(shè)置對(duì)應(yīng)的全局變量值
		*/}
		<ThemeProvider theme={{ color: 'skyblue' }}>
			<App />
		</ThemeProvider>
	</StrictMode>
)
import styled from 'styled-components'
export default styled.div`
	.title {
		/* ThemeContext中提供的全局樣式值會(huì)被傳入到 props.theme中 */
		color: ${ props => props.theme.color };
	}
	.content {
		color: red
	}
`

樣式繼承

const OriginButton = styled.button`
	border-radius: 5px;
`
export const PrimaryButton = styled(OriginButton)`
	color: #fff;
	background-color: #409eff;
`

動(dòng)態(tài)添加class

寫法一 --- 使用三元運(yùn)算符

import React, { PureComponent } from 'react'
export class App extends PureComponent {
	constructor(props) {
		super(props)
		this.state = {
			isActive: true,
			isCurrent: true
		}
	}
	render() {
		const { isActive, isCurrent } = this.state
		return (
			<div>
				<div className={ `${isActive ? 'active' : '' } ${ isCurrent ? 'current' : '' }` }>active</div>
			</div>
		)
	}
}
export default App

寫法二 --- 使用join方法

import React, { PureComponent } from 'react'
export class App extends PureComponent {
	constructor(props) {
		super(props)
		this.state = {
			isActive: true,
			isCurrent: true
		}
	}
	render() {
		const { isActive, isCurrent } = this.state
		const activeClass = []
		if (isActive) {
			activeClass.push('active')
		}
		if (isCurrent) {
			activeClass.push('current')
		}
		return (
			<div>
				<div className={ activeClass.join(' ') }>active</div>
			</div>
		)
	}
}
export default App

寫法三 --- 使用第三方庫(kù) classnames

npm install classnames
classNames('foo', 'bar'); // => 'foo bar'
classNames('foo', { bar: true }); // => 'foo bar'
classNames({ 'foo-bar': true }); // => 'foo-bar'
classNames({ 'foo-bar': false }); // => ''
classNames({ foo: true }, { bar: true }); // => 'foo bar'
classNames({ foo: true, bar: true }); // => 'foo bar'
// classnames 支持多種編寫方式 混合使用
classNames('foo', { bar: true, duck: false }, 'baz', { quux: true }); // => 'foo bar baz quux'
// 只要是falsy值的結(jié)果 全部都會(huì)被忽略
classNames(null, false, 'bar', undefined, 0, 1, { baz: null }, ''); // => 'bar 1'
// classnames 支持 數(shù)組寫法 和 計(jì)算屬性名
className={ classnames([{ [activeClass]: isActive }, { current: isCurrent }])

以上就是React中編寫CSS實(shí)例詳解的詳細(xì)內(nèi)容,更多關(guān)于React編寫CSS的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • React 路由react-router-dom示例詳解

    React 路由react-router-dom示例詳解

    一個(gè)路由就是一個(gè)映射關(guān)系(key:value),key為路徑, value可能是function或component,本文給大家介紹React 路由react-router-dom詳解,感興趣的朋友跟隨小編一起看看吧
    2024-01-01
  • npx create-react-app xxx創(chuàng)建項(xiàng)目報(bào)錯(cuò)的解決辦法

    npx create-react-app xxx創(chuàng)建項(xiàng)目報(bào)錯(cuò)的解決辦法

    這篇文章主要介紹了npx create-react-app xxx創(chuàng)建項(xiàng)目報(bào)錯(cuò)的解決辦法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • React?Flux與Redux設(shè)計(jì)及使用原理

    React?Flux與Redux設(shè)計(jì)及使用原理

    這篇文章主要介紹了React?Flux與Redux設(shè)計(jì)及使用,Redux最主要是用作應(yīng)用狀態(tài)的管理。簡(jiǎn)言之,Redux用一個(gè)單獨(dú)的常量狀態(tài)樹(state對(duì)象)保存這一整個(gè)應(yīng)用的狀態(tài),這個(gè)對(duì)象不能直接被改變
    2023-03-03
  • React?useEffect不支持async?function示例分析

    React?useEffect不支持async?function示例分析

    這篇文章主要為大家介紹了React?useEffect不支持async?function示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • 減少react組件不必要的重新渲染實(shí)現(xiàn)方法

    減少react組件不必要的重新渲染實(shí)現(xiàn)方法

    這篇文章主要為大家介紹了減少react組件不必要的重新渲染實(shí)現(xiàn)方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • 解讀react的onClick自動(dòng)觸發(fā)等相關(guān)問(wèn)題

    解讀react的onClick自動(dòng)觸發(fā)等相關(guān)問(wèn)題

    這篇文章主要介紹了解讀react的onClick自動(dòng)觸發(fā)等相關(guān)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • 在Create React App中使用CSS Modules的方法示例

    在Create React App中使用CSS Modules的方法示例

    本文介紹了如何在 Create React App 腳手架中使用 CSS Modules 的兩種方式。有一定的參考價(jià)值,有需要的朋友可以參考一下,希望對(duì)你有所幫助。
    2019-01-01
  • vite+react+tailwindcss的簡(jiǎn)單使用方式

    vite+react+tailwindcss的簡(jiǎn)單使用方式

    這篇文章主要介紹了vite+react+tailwindcss的簡(jiǎn)單使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • 詳解react-router4 異步加載路由兩種方法

    詳解react-router4 異步加載路由兩種方法

    本篇文章主要介紹了詳解react-router4 異步加載路由兩種方法 ,具有一定的參考價(jià)值,有興趣的可以了解一下
    2017-09-09
  • redux工作原理講解及使用方法

    redux工作原理講解及使用方法

    這篇文章主要介紹了redux工作原理講解及使用方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2021-11-11

最新評(píng)論