如何通过css模块将样式应用于react组件
How to apply styles to the react component via css modules
我在将样式应用于React组件时遇到了问题。我通过Yeoman为我的项目生成了模板。它创建了很多配置文件,不仅仅是webpack.config.js,因此我有点困惑。正如react generator的Readme文件所说,它在不安装的情况下支持开箱即用的一些功能:*支持不同风格的语言(sass、scss、less、手写笔)*通过PostCSS进行样式转换根据这一点,我展示了cfg/default.js
的一部分
'use strict';
const path = require('path');
const srcPath = path.join(__dirname, '/../src');
const dfltPort = 8000;
function getDefaultModules() {
return {
preLoaders: [{
test: /'.(js|jsx)$/,
include: srcPath,
loader: 'eslint-loader'
}],
loaders: [
{
test: /'.css$/,
loader: 'style-loader!css-loader!postcss-loader'
},
{
test: /'.sass/,
loader: 'style-loader!css-loader!postcss-loader!sass-loader?outputStyle=expanded&indentedSyntax'
},
{
test: /'.scss/,
loader: 'style-loader!css-loader!postcss-loader!sass-loader?outputStyle=expanded'
},
{
test: /'.less/,
loader: 'style-loader!css-loader!postcss-loader!less-loader'
},
{
test: /'.styl/,
loader: 'style-loader!css-loader!postcss-loader!stylus-loader'
},
我认为这部分负责转换.scss
文件。
因此,在我的todosStyle.scss
文件中,我得到了以下代码:
.todos {
display: flex;
flex-flow: row wrap;
justify-content: center;
width: 100%;}
.input {
display: block;
text-align: center;}
.button {
width: 60px;
margin: 5px; }
.label {
display: block;
border: solid 1px; }
基于此样式,我想对我的组件Todos.jsx
:进行样式设置
import React from "react";
import Todo from "./Layout/Todo.jsx";
import TodoStore from "../../stores/TodoStore.jsx";
import * as TodoActions from "../../actions/TodoActions.jsx";
import styles from '../../styles/todosStyle.scss';
export default class Todos extends React.Component {
constructor() {
super();
this.getAllTodos = this.getAllTodos.bind(this);
this.state = {
todos: TodoStore.getAll(),
};
}
getAllTodos(){
this.setState({
todos: TodoStore.getAll(),
});
}
componentWillMount(){
TodoStore.on('change', this.getAllTodos);
}
componentWillUnmount(){
TodoStore.removeListener('change', this.getAllTodos);
}
createTodo(){
if (this.refs.addTodo.value != ''){
TodoActions.createTodo(this.refs.addTodo.value);
this.refs.addTodo.value = '';
}
}
deleteTodo(todo){
TodoActions.deleteTodo(todo);
}
completeTodo(todo){
TodoActions.completeTodo(todo);
}
render() {
const {todos} = this.state;
const TodoComponents = todos.map(todo =>{
return <Todo key={todo.id} {...todo} completeTodo={this.completeTodo.bind(this, todo)} deleteTodo={this.deleteTodo.bind(this, todo)}/>;
});
return (
<div>
<h1>Todos</h1>
<div class = {styles.input}>
<label class= {styles.label}>Add new Todo</label>
<input ref="addTodo"/>
<button class={styles.button} onClick = {this.createTodo.bind(this)}><i class="fa fa-plus-square-o"></i></button>
</div>
<ul class={styles.todos} class="row">{TodoComponents}</ul>
</div>
);
}
}
但是样式没有应用,尽管我已经导入了todosStyle.scss
有人能帮我吗?
请注意,在加载程序测试属性上添加$是很好的,例如test:/.scss$/,以只匹配我认为的文件结尾。
我以前从未见过"从'../../styles/todosStyle.scss导入样式"这意味着你正在从你的sass文件中导出样式,也许导入*作为样式。。。也许可行,但我还没有用这种方法。
试试这个。require('../../styles/todosStyle.scss');这将把css和javascript捆绑在一起。然后像通常在渲染函数上那样使用该类。
另请注意;如果你想为css创建一个单独的文件,你可以用插件来完成。
您正在使用css模块,但尚未在Webpack-config:中打开它们
loader: 'style-loader!css-loader!postcss-loader'
成为
loader: 'style-loader!css-loader?modules!postcss-loader'
根据css加载程序自述https://github.com/webpack/css-loader#css-模块。
- 将函数的上下文应用于javascript变量
- 将CSS应用于printWindow.print();在Javascript中
- 如何将CSS(特别是填充/边距)应用于select下拉菜单的选项或optgroup
- $scope.apply()何时应用于angular
- Javascript非常简单:'阅读更多''显示较少'应用于Wordpress的功能
- 警告:失败的propType:类型为“array”的无效prop应为React的“object”
- 尝试应用于<tr>在ng单击中
- 如何将javascript仅应用于1个表单中的2个表单提交按钮中的1个
- 将脚本应用于Angular 2上的输入
- Json和$scope的角度之间的差异$eval应用于JSON字符串时
- 如何将参数应用于String.prototype.format函数
- 动态地将过滤器应用于 JSON.parse()
- $location更改不适用于ngchange,而是应用于ngclick
- 如何将 :empty 选择器应用于 XML 文档
- 如何仅在文本字段中有值时才将自定义过滤器应用于 ng-repeat
- 如何使用 JavaScript 将样式应用于 CKEditor 中的选定文本
- MongoDB 无法将$addToSet应用于 Meteor JS 中的非数组
- 如何通过css模块将样式应用于react组件
- React Native + React - Native -router-flux:如何仅将hideNavBar应用于
- 在呈现路由后,将JavaScript应用于React中的布局