2016-03-27 2 views
0

У меня возникла проблема с применением стилей к моим компонентам React. Я создал шаблон для своего проекта через Йомен. Он создал много конфигурационных файлов, а не только webpack.config.js, и из-за этого я немного запутался. Как файл Readme реактивного генератора говорит, что он поддерживает некоторые функции без его установки: * Различные поддерживаемые языки стиля (sass, scss, less, stylus) * Преобразования стиля через PostCSS В соответствии с этим я показываю часть cfg/default.jsКак применять стили к компоненту реакции через модули css

'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

Не мог бы кто-нибудь мне помочь?

ответ

0

Просто примечание, его полезно добавить $ в свойства тестового объекта загрузчика, например. test: /.scss$/, чтобы соответствовать только концу файла, на который я верю.

i havent видел это до «импортных стилей от» ../../styles/todosStyle.scss '; " Этот тип говорит, что вы экспортируете стили из своего sass-файла, возможно, импортируете *, поскольку стиль ... может работать, но я не использовал этот подход.

попробуйте это. требуют ('../../styles/todosStyle.scss'); это свяжет ваш css с javascript. , то просто используйте класс, как обычно, для функции рендеринга.

также примечание; если вы хотите создать отдельный файл для своего css, вы можете сделать это с помощью плагинов.

0

Вы используете CSS модули, но вы не включили их в вашем WebPack конфигурации:

loader: 'style-loader!css-loader!postcss-loader'

становится

loader: 'style-loader!css-loader?modules!postcss-loader'

В соответствии с CSS-погрузчик ридми https://github.com/webpack/css-loader#css-modules ,

Смежные вопросы