React CSS Modules
React CSS Modules 는 CSS Modules 매핑을 자동화합니다.각 CSS 클래스에는 고유한 글로벌 이름을 가진 로컬 식별자가 지정됩니다.CSS Modules는 모듈식 및 재사용 기능을 제공합니다.
CSS Modules
CSS Mosules 토치카야.만약 당신이 CSS 모듈에 대해 아직 익숙하지 않다면, 괜찮습니다. 웹 패키지 같은 모듈 패키지를 사용하여 CSS가 특정 문서에 작용하는 것을 불러오는 개념일 뿐입니다.CSS module loader는 모든 CSS 클래스가 CSS 문서를 불러올 때 (정확히 말하면 이 문서가 Interoperable CSS) 유일한 이름을 생성합니다.이 CSS Modules 실천 예인 웹팩데모를 보십시오.
React 구문 환경에서 CSS Modules는 다음과 같이 보입니다.
import React from 'react';
import styles from './table.css';
export default class Table extends React.Component {
render () {
return
A0
B0
;
어셈블리가 렌더링되면 다음과 같은 태그가 생성됩니다.
A0
B0
또한 해당 CSS 클래스와 일치하는 CSS 파일을 생성합니다. 토치카 아닙니까?!
webpack
css-loader
CSS Modules는 여러 가지 방법으로 구현할 수 있는 사양입니다.
react-css-modules
웹팩 css-loader가 제공하는 기능을 이용하여 기존 CSS Modules의 통합을 활성화시켰다.현존 문제
웹팩의 css-loader 자체는 몇 가지 열세가 있다.
className
를 구축할 때 style
대상을 사용해야 합니다.undefines
이지만 경고 프롬프트가 없습니다.React CSS Modules 구성 요소는 다음과 같은 특성을 적용한 CSS Modules를 자동으로 로드합니다.
import React from 'react';
import CSSModules from 'react-css-modules';
import styles from './table.css';
class Table extends React.Component {
render () {
return
A0
B0
;
}
}
export default CSSModules(Table, styles);
styleName
를 사용하면 다음과 같은 이점이 있습니다.react-css-modules
대상을 인용할 필요가 없습니다.当 styleName
引用一个为定义的 CSS Module 时,你会得到一个警告信息。(errorWhenNotFound
选项)
你可以为每一个 ReactElement
只使用单独的 CSS Module。(allowMultiple
选项)。
实现
react-css-modules
扩展了目标组件的 render
方法。它将根据 styleName
的值在关联的 style
对象中查找对应的 CSS Modules,并为 ReactElement className
属性值添加相匹配的独一无二的 CSS 类名。
碉堡了!
你可以参照下这个例子进一步加深印象,react-css-modules-examples。
用法
设置包括:
- 设置一个
module bundler
加载 Interoperable CSS。 - 使用
react-css-modules
修整你的组件。
如何设置一个 module bundler
呢?
webpack
开发模式
开发环境下,若你想启用 Sourcemaps,并要使用 webpack 的 Hot Module Replacement (HMR,热替换)。style-loader
已经支持 HMR。因此,Hot Module Replacement 开箱即用。
设置步骤:
- 安装
style-loader
。 - 安装
css-loader
。 - 设置
/\.css$/
加载器,如下:
{
test: /\.css$/,
loaders: [
'style?sourceMap',
'css?modules&importLoaders=1&localIdentName=[path]___[name]__[local]___[hash:base64:5]'
]
}
생산 모델생산 환경에서 CSS를 단독으로 추출하려면 이렇게 하는 장점과 단점을 알아야 한다.
이점:
— extract-text-webpack-plugin
단계를 설정하려면 다음과 같이 하십시오.
styles
style-loader
css-loader
CSS를 단독 스타일시트로 추출합니다.extract-text-webpack-plugin
캐리어: {
test: /\.css$/,
loader: ExtractTextPlugin.extract('style', 'css?modules&importLoaders=1&localIdentName=[name]__[local]___[hash:base64:5]')
}
/\.css$/
플러그인: new ExtractTextPlugin('app.css', {
allChunks: true
})
Browserify (이 구축 도구를 사용한다면)
css-modulesify를 참고하세요.
확장 어셈블리 스타일
extract-text-webpack-plugin
속성을 사용하여 기본 구성 요소 스타일을 다시 씁니다.예는 다음과 같습니다.
import React from 'react';
import CSSModules from 'react-css-modules';
import styles from './table.css';
class Table extends React.Component {
render () {
return
A0
B0
;
}
}
export default CSSModules(Table, styles);
이 예에서
styles
는 구성 요소를 인용CSSModules
CSS 모듈을 통해 미화하는 데 사용된다.Table
구성 요소가 렌더링되면 ./table.css
대상의 속성 구축 Table
값을 사용합니다.styles
속성을 사용하면 구성 요소의 기본 className
대상을 덮어쓸 수 있습니다.예를 들면 다음과 같습니다.import customStyles from './table-custom-styles.css';
;
Interoperable CSS ICSS。 , :
/* table-custom-styles.css */
.table {
composes: table from './table.css';
}
.row {
composes: row from './table.css';
}
/* .cell {
composes: cell from './table.css';
} */
.table {
width: 400px;
}
.cell {
float: left; width: 154px; background: #eee; padding: 10px; margin: 10px 0 10px 10px;
}
이 예에서 styles
선택한 확장 styles
(table-custom-styles.css
구성 요소의 기본 스타일) 이 있습니다.이것은 더욱 직관적인 실천 예이다: Using Styles Property example.table.css
속성이 포장된 구성 요소는 Table
속성을 계승하고 이 속성은 CSS 모듈과 CSS 클래스 간의 매핑 관계를 설명한다.class extends React.Component {
render () {
;
}
}
위 예에서 style
와 styles
는 등가이다.styleName='foo'
속성은 className={this.props.styles.foo}
부품 포장을 실현하기 위해 특별히 설계되었습니다!Loops and Child Componentsstyles
는 다른 구성 요소에서 생성된 React 요소의 스타일을 정의할 수 없습니다.예를 들어, import React from 'react';
import CSSModules from 'react-css-modules';
import List from './List';
import styles from './table.css';
class CustomList extends React.Component {
render () {
let itemTemplate;
itemTemplate = (name) => {
return {name} ;
};
return ;
}
}
export default CSSModules(CustomList, styles);
위의 인스턴스는 작동하지 않습니다.CSSModules는 구성 요소 포장Loops and Child Components
에 사용됩니다.그러나 이것은 styleName
목록 구성 요소입니다.이 문제를 해결하기 위해 포장된 구성 요소는 스타일 속성을 계승하여 일반적인 CSS 모듈 대상으로 사용할 수 있습니다.따라서 앞의 예는 다음과 같이 바꿀 수 있다. import React from 'react';
import CSSModules from 'react-css-modules';
import List from './List';
import styles from './table.css';
class CustomList extends React.Component {
render () {
let itemTemplate;
itemTemplate = (name) => {
return {name} ;
};
return ;
}
}
export default CSSModules(CustomList, styles);
하위 구성 요소를 렌더링 구성 요소에 전달하기 전에 CustomList
이 하위 구성 요소를 포장하면 이 하위 구성 요소에서 itemTemplage
속성을 사용할 수 있다.예를 들어 import React from 'react';
import CSSModules from 'react-css-modules';
import List from './List';
import styles from './table.css';
class CustomList extends React.Component {
render () {
let itemTemplate;
itemTemplate = (name) => {
return {name} ;
};
itemTemplate = CSSModules(itemTemplate, this.props.styles);
return ;
}
}
export default CSSModules(CustomList, styles);
포장/**
* @typedef CSSModules~Options
* @see {@link https://github.com/gajus/react-css-modules#options}
* @property {Boolean} allowMultiple
* @property {Boolean} errorWhenNotFound
*/
/**
* @param {Function} Component
* @param {Object} defaultStyles CSS Modules class map.
* @param {CSSModules~Options} options
* @return {Function}
*/
당신은 CSSMmodules
으로 당신의 부품을 포장해야 합니다. 예를 들어 import React from 'react';
import CSSModules from 'react-css-modules';
import styles from './table.css';
class Table extends React.Component {
render () {
return
A0
B0
;
}
}
export default CSSModules(Table, styles);
이렇게 간단합니다!말 그대로 styleName
와 ES7 decorators 문법이 호환된다.예를 들어 import React from 'react';
import CSSModules from 'react-css-modules';
import styles from './table.css';
@CSSModules(styles)
export default class extends React.Component {
render () {
return
A0
B0
;
}
}
그야말로 토치카다!웹팩으로 구축된 예시가 있습니다.react-css-modules-examples Optionsreact-css-modules
함수에서 세 번째 인자의 위치에 옵션을 제공했습니다.CSSModules(Component, styles, options);
또는 두 번째 인자로: @CSSModules(styles, options);
react-css-modules
기본값: CSSModules
.여러 스타일 모듈의 이름을 허용합니다.allowMultiple
, 다음은 오류를 일으킬 수 있습니다.
errorWhenNotFound
:true
。
styleName
CSS Module 。
SASS, SCSS, LESS CSS
Interoperable CSS CSS 。 , loaders
。 webpack , sass-loader
, !sass
style-loader
( ):
{
test: /\.scss$/,
loaders: [
'style',
'css?modules&importLoaders=1&localIdentName=[path]___[name]__[local]___[hash:base64:5]',
'resolve-url',
'sass'
]
}
Sourcemaps를 열고 CSS Sourcemaps를 열려면 false
와 false
에 파라미터css-loader
{
test: /\.scss$/,
loaders: [
'style?sourceMap',
'css?modules&importLoaders=1&localIdentName=[path]___[name]__[local]___[hash:base64:5]',
'resolve-url',
'sass?sourceMap'
]
}
를 추가해야 한다. 클래스 조합 CSS Mosules는 클래스 조합 모드를 추진한다. 즉, 구성 요소에 사용되는 모든 CSS 모듈은 하나의 요소에 필요한 모든 속성을 정의해야 한다.예를 들어 .box {
width: 100px;
height: 100px;
}
.empty {
composes: box;
background: #4CAF50;
}
.full {
composes: box;
background: #F44336;
}
클래스 조합은 표기와 의미화 양식의 더욱 좋은 분리를 추진했고 CSS 모델스가 없으면 이 점은 실현하기 어렵다.CSS 모듈의 클래스 이름은 로컬이기 때문에'empty'나'full'같은 일반적인 클래스를 사용할 수 있습니다.'box-'접두사를 붙이지 않아도 됩니다. 완벽합니다!!더 많은 조합 규칙을 배우고 싶다고요?Glen Maddern의 CSS Modules에 관한 글과 공식 문서 spec of the CSS Modules를 읽어보시기 바랍니다.클래스 그룹은 어떤 문제를 해결했습니까?생각해 보면 다음과 같은 예가 있다. .box {
width: 100px;
height: 100px;
}
.box-empty {
background: #4CAF50;
}
.box-full {
background: #F44336;
}
OOCSS , , , HTML。
CSS
, 。CSS Modules , CSS Mosules composes
。CSS 。
SCSS @extend
, Mixin Directives , :
@extend
:
%box {
width: 100px;
height: 100px;
}
.box-empty {
@extend %box;
background: #4CAF50;
}
.box-full {
@extend %box;
background: #F44336;
}
를 컴파일한 후에 다음과 같다. .box-empty,
.box-full {
width: 100px;
height: 100px;
}
.box-empty {
background: #4CAF50;
}
.box-full {
background: #F44336;
}
mixins: @mixin box {
width: 100px;
height: 100px;
}
.box-empty {
@include box;
background: #4CAF50;
}
.box-full {
@include box;
background: #F44336;
}
를 컴파일한 후에 다음과 같다. .box-empty {
width: 100px;
height: 100px;
background: #4CAF50;
}
.box-full {
width: 100px;
height: 100px;
background: #F44336;
}
전역 스타일 CSS Modules는 전역 CSS 사용을 제한하지 않는다.용법은 다음과 같다. :global .foo {
}
그러나 전체적인 스타일을 조심스럽게 사용하세요.CSS Modules를 사용하는 동안 전역 스타일(예: normalization)은 소수의 경우에만 사용됩니다.여러 CSS Modules에서는 여러 CSS Modules를 사용하여 개별 요소를 설명하지 않습니다.본 문서 앞의 클래스 조합 부분에 대한 설명을 보십시오.그러나 굳이 여러 개의 CSS 모듈을 사용해서 원소를 설명하려면 sass-loader
옵션을 켜십시오.(문서의 앞 옵션 섹션 참조).여러 개의 CSS 모듈이 하나의 요소를 설명하는 데 사용될 때 sourceMap
, allowMultiple
성명에 일치하는 모든 CSS 모듈에 유일무이한 클래스 이름을 추가합니다.예:
.button {
}
.active {
}
Interoperable CSS CSS class 。
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.