Пришло время сделать наше приложение более привлекательным. Для этого давайте научимся работать со стилями в React.js
Все статьи по React.js
Для того, чтобы стилизовать React.js приложение существует огромное количество подходов, библиотек, разнообразных стилизованных компонентов. Мы возьмем самый популярный фреймворк - Bootstrap. Даже когда вы принимаете решение использовать Bootstrap, вы можете легко найти в Гугл множество библиотек, которые интегрировали в себя Bootstrap и дают вам возможность использовать уже готовые стилизованные компоненты. Вы можете выбрать для себя любую из них. Этих библиотек огромное количество.
Мы пойдем классическим путем и будем использовать чистый (классический) css от Bootstrap.
Для этого идем в консоль и устанавливаем с помощью npm сам bootstrap
npm - установит нам библиотеку и теперь мы сможем подключать стили. Для того, чтобы не тянуть стили руками в какой-либо html файл, мы можем подключать в наш проект css стили, как модули.
Это нам позволит сделать webpack, у которого для этого есть специальные возможности (модули), которые позволят подключать стили css в наш проект.
Для этого достаточно в файле App.js написать
В нашем случае это
Подключать файл bootstrap.min.css не имеет смысла, поскольку перед продакшн вы будете все равно минимизировать файлы с помощью webpack.
App.js
Теперь мы можем использовать bootstrap в нашем проекте.
Для того, чтобы дать класс какому-либо элементу нам достаточно написать
Например, пометить весь код в контейнер - в файле App.js первому тегу
Убедиться, что все работает, вы можете открыв браузер и "исследовав элемент"
Класс добавился. И стили bootstrap прменились к нашим элементам.
Теперь давайте оформим каждый элемент.
Завернем наш header в
Результат:
Теперь, перейдет к оформлению статей.
В файле Article.js мы добавим стили сразу на всю статью в
Заголовок поместим в header -
Article.js
Посмотрим:
Немного изменим тело самой статьи и кнопку.
В файле Article.js
Результат:
Для того. чтобы дать инлайновый стиль какому-либо элементу, достаточно прописать property style и в двойных фигурных скобках прописать свойство и значение.
Никакой магии в этом нет. Просто одни фигурные скобки говорят о том, что мы используем javascript переменную (выражение, или что-то еще), а вторые скобки говорят, что внутри обычная литеральная нотация.
Например так:
В принципе, мы могли бы вынести это таким вот образом -
а уже в самом теге оставить только
Можно писать и так и так.
То, что получилось:
Для того, чтобы позиционировать нашу статью по центру добавим:
Теперь нам остается убрать маркер списка.
Для этого мы напишем в файле ArticleList.js специальный стиль для тега
Нам придется создать отдельный css- файл для нашего ArticleList.js и в таких случаях, чтобы не создавать путаницу в общей папке компонентов, лучше создать для такого компонента отдельную папку!
В файл index.js мы вставим весь код из нашего ArticleList.js, только поправим пути:
index.js
и здесь же создадим файл style.css -здесь будут стили данного компонента.
Файл ArticleList.js удаляем.
При этом webpack поймет, что в App.js ->ArticleList - это папка, и коль в ней есть файл index.js, то он возьмет именно этот файл. Поэтому файл index.js не нужно отдельно указывать в этом пути (т.е делать так - >
App.js
Теперь добавим стили компоненту в файле style.css
Лучше всего себя показала методология БЭМ (сайт в России с vpn - отдельное спасибо РосКомНадзору) Блок Элемент Модификатор от Яндекса. Вы можете с ней ознакомиться. Мы пока что запишем:
style.css
Теперь, для того, чтобы воспользоваться этими стилями. нам необходимо сделать импорт. Мы сделаем это на уровне нашего компонента в файле index.js
Теперь каждый раз, когда кто-то захочет подключать наш компонент, он будет его подключать вместе с соответствующими стилями.
Нам остается только добавить класс
Сохраняем, и... Не пугайесь. Ваш компилятор может сломаться и получите такое предупреждение, вместо приложения.
 
 
Это происходит, потому что webpack ожидал файл ArticleList.js, а теперь он живет в папке.
Чтобы это исправить, достаточно перезапустить сервер -> Ctrl + C
Для того. чтобы он собрал уже все с index.js Таким образом, мы с вами подключили Bootstrap к нашему React-приложению, научились добавлять стили инлайн двумя способами и научились подключать стили непосредственно к React - компонентам. сделав их по настоящему независимыми "строительными блоками" React - приложения.
Все статьи по React.js
components/App.js
components/Article.js
components/ArticleList/index.js
components/ArticleList/style.css
                                                                                                                                                              
Все статьи по React.js
Для того, чтобы стилизовать React.js приложение существует огромное количество подходов, библиотек, разнообразных стилизованных компонентов. Мы возьмем самый популярный фреймворк - Bootstrap. Даже когда вы принимаете решение использовать Bootstrap, вы можете легко найти в Гугл множество библиотек, которые интегрировали в себя Bootstrap и дают вам возможность использовать уже готовые стилизованные компоненты. Вы можете выбрать для себя любую из них. Этих библиотек огромное количество.
Мы пойдем классическим путем и будем использовать чистый (классический) css от Bootstrap.
Подключение Bootstrap.
Для этого идем в консоль и устанавливаем с помощью npm сам bootstrap
npm install bootstrap
npm - установит нам библиотеку и теперь мы сможем подключать стили. Для того, чтобы не тянуть стили руками в какой-либо html файл, мы можем подключать в наш проект css стили, как модули.
Это нам позволит сделать webpack, у которого для этого есть специальные возможности (модули), которые позволят подключать стили css в наш проект.
Для этого достаточно в файле App.js написать
import  и какой именно css модуль мы хотим подключить.
В нашем случае это
'bootstrap'. Обратите внимание, что подключаем без всяких слешей, потому что webpack и так поймет, что этот модуль стоит искать в папке -> node_modules. Указываем путь к файлу bootstrap.css.
Подключать файл bootstrap.min.css не имеет смысла, поскольку перед продакшн вы будете все равно минимизировать файлы с помощью webpack.
App.js
  import React from 'react'
  import ArticleList from './ArticleList'
  import articles from '../fixtures.js'
  import 'bootstrap/dist/css/bootstrap.css'
  function App() {
    return (
      <div>
          <h1>App Name</h1>
          <ArticleList articles={articles}/>
      </div>
    );
  }
  export default App
Теперь мы можем использовать bootstrap в нашем проекте.
Для того, чтобы дать класс какому-либо элементу нам достаточно написать
className = "имя класса"
Например, пометить весь код в контейнер - в файле App.js первому тегу
div добавили -
<div className="container" >
Убедиться, что все работает, вы можете открыв браузер и "исследовав элемент"
Класс добавился. И стили bootstrap прменились к нашим элементам.
Теперь давайте оформим каждый элемент.
Завернем наш header в
div  классом jumbotron, а самому заголовку дадим класс display-3
  import React from 'react'
  import ArticleList from './ArticleList'
  import articles from '../fixtures.js'
  import 'bootstrap/dist/css/bootstrap.css'
  function App() {
    return (
      <div className="container">
        <div className="jumbotron">
          <h1 className="display-3">App Name</h1>
        </div>  
          <ArticleList articles={articles}/>
      </div>
    );
  }
  export default App
Результат:
Теперь, перейдет к оформлению статей.
В файле Article.js мы добавим стили сразу на всю статью в
className="card". 
Заголовок поместим в header -
 div className="card-header", а сам текст статьи и дату в отдельный  div className="card-header". Тело статьи в  div className="card-body",
Article.js
import React, {Component} from 'react'
  class Article extends Component {
        state = {
          isOpen: true
      }
    render() {
        const {article} = this.props
        const body = this.state.isOpen && <section>{ article.text }</section> 
      return(
        <div className="card">
          <div className="card-header">
            <h2>
                { article.title }
                <button onClick={this.handleClick}>
                    {this.state.isOpen ? 'close' : 'open'}
                </button>
            </h2>
          </div>
          <div className="card-body"> 
               { body }
                <h3>
                   "creation date : "{ (new Date(article.date)).toDateString()}
                </h3>
          </div>
        </div>
      );
    }
    handleClick = () =>{
      console.log('---', 'clicked')
      this.setState({
        isOpen: !this.state.isOpen
      })
    }
  }
  export default Article
Посмотрим:
Немного изменим тело самой статьи и кнопку.
В файле Article.js
  import React, {Component} from 'react'
class Article extends Component {
      state = {
        isOpen: true
    }
  render() {
      const {article} = this.props
      const body = this.state.isOpen && <section className="card-text">{ article.text }</section> 
    return(
      <div className="card">
        <div className="card-header">
          <h2>
              { article.title }
              <button onClick={this.handleClick} className="btn btn-primary btn-lg float-right">
                  {this.state.isOpen ? 'close' : 'open'}
              </button>
          </h2>
        </div>
        <div className="card-body"> 
              <h6 className="card-subtitle text-muted">
                 "creation date : "{ (new Date(article.date)).toDateString()}
              </h6>
              { body }
        </div>
      </div>
    );
  }
  handleClick = () =>{
    console.log('---', 'clicked')
    this.setState({
      isOpen: !this.state.isOpen
    })
  }
}
export default Article
Результат:
Делаем статью на пол экрана и работаем с инлайновыми стилями.
Для того. чтобы дать инлайновый стиль какому-либо элементу, достаточно прописать property style и в двойных фигурных скобках прописать свойство и значение.
Никакой магии в этом нет. Просто одни фигурные скобки говорят о том, что мы используем javascript переменную (выражение, или что-то еще), а вторые скобки говорят, что внутри обычная литеральная нотация.
Например так:
<div className="card" style={{width:'50%'}}>
В принципе, мы могли бы вынести это таким вот образом -
const style = {width: '50%'}
а уже в самом теге оставить только
<div className="card" style={style}>
Можно писать и так и так.
import React, {Component} from 'react'
  class Article extends Component {
        state = {
          isOpen: true
      }
    render() {
        const {article} = this.props
        const style = {width:'50%'}
        const body = this.state.isOpen && <section className="card-text">{ article.text }</section> 
      return(
        <div className="card" style={style}>
          <div className="card-header">
            <h2>
                { article.title }
                <button onClick={this.handleClick} className="btn btn-primary btn-lg float-right">
                    {this.state.isOpen ? 'close' : 'open'}
                </button>
            </h2>
          </div>
          <div className="card-body"> 
                <h6 className="card-subtitle text-muted">
                   "creation date : "{ (new Date(article.date)).toDateString()}
                </h6>
                { body }
          </div>
        </div>
      );
    }
    handleClick = () =>{
      console.log('---', 'clicked')
      this.setState({
        isOpen: !this.state.isOpen
      })
    }
  }
  export default Article
То, что получилось:
Для того, чтобы позиционировать нашу статью по центру добавим:
mx-auto элементу .card 
<div className="card mx-auto" style={style}>
Теперь нам остается убрать маркер списка.
Для этого мы напишем в файле ArticleList.js специальный стиль для тега
li, а за одно научимся создавать собственные css-модули.
Нам придется создать отдельный css- файл для нашего ArticleList.js и в таких случаях, чтобы не создавать путаницу в общей папке компонентов, лучше создать для такого компонента отдельную папку!
Подключением файла стилей React - компоненту.
В папке components мы создадим отдельную папку -> ArticleList внутри которой мы будем держать реактовский код index.js, так и стили ArticleList.jsВ файл index.js мы вставим весь код из нашего ArticleList.js, только поправим пути:
index.js
  import React from 'react'
  import Article from '../Article'
  import './style.css'
  export default function ArticleList({articles}) {
        const articleElements = articles.map(article =>
            <li key = {article.id} className="article-list__li">
              <Article article = {article}/>
            </li>
          )
        return(
            <ul>
              {articleElements}
            </ul>
          );
  }
и здесь же создадим файл style.css -здесь будут стили данного компонента.
Файл ArticleList.js удаляем.
При этом webpack поймет, что в App.js ->ArticleList - это папка, и коль в ней есть файл index.js, то он возьмет именно этот файл. Поэтому файл index.js не нужно отдельно указывать в этом пути (т.е делать так - >
import ArticleList from './ArticleList/index.js')
App.js
  import React from 'react'
  import ArticleList from './ArticleList'
  import articles from '../fixtures.js'
  import 'bootstrap/dist/css/bootstrap.css'
  function App() {
    return (
      <div className="container">
        <div className="jumbotron">
          <h1 className="display-3">App Name</h1>
        </div>  
          <ArticleList articles={articles}/>
      </div>
    );
  }
  export default App
Теперь добавим стили компоненту в файле style.css
Лучше всего себя показала методология БЭМ (сайт в России с vpn - отдельное спасибо РосКомНадзору) Блок Элемент Модификатор от Яндекса. Вы можете с ней ознакомиться. Мы пока что запишем:
style.css
   .article-list__li {
     list-style: none;
    }
Теперь, для того, чтобы воспользоваться этими стилями. нам необходимо сделать импорт. Мы сделаем это на уровне нашего компонента в файле index.js
import './style.css'
Теперь каждый раз, когда кто-то захочет подключать наш компонент, он будет его подключать вместе с соответствующими стилями.
Нам остается только добавить класс
className="article-list__li" к тегу li
Сохраняем, и... Не пугайесь. Ваш компилятор может сломаться и получите такое предупреждение, вместо приложения.
Это происходит, потому что webpack ожидал файл ArticleList.js, а теперь он живет в папке.
Чтобы это исправить, достаточно перезапустить сервер -> Ctrl + C
    npm start
Для того. чтобы он собрал уже все с index.js Таким образом, мы с вами подключили Bootstrap к нашему React-приложению, научились добавлять стили инлайн двумя способами и научились подключать стили непосредственно к React - компонентам. сделав их по настоящему независимыми "строительными блоками" React - приложения.
Все статьи по React.js
Файлы, которые мы изменяли в этот раз:
components/App.js
  import React from 'react'
  import ArticleList from './ArticleList'
  import articles from '../fixtures.js'
  import 'bootstrap/dist/css/bootstrap.css'
  function App() {
    return (
      <div className="container">
        <div className="jumbotron">
          <h1 className="display-3">App Name</h1>
        </div>  
          <ArticleList articles={articles}/>
      </div>
    );
  }
  export default App
  
components/Article.js
  import React, {Component} from 'react'
  class Article extends Component {
        state = {
          isOpen: true
      }
    render() {
        const {article} = this.props
        const style = {width:'50%'}
        const body = this.state.isOpen && <section className="card-text">{ article.text }</section> 
      return(
        <div className="card mx-auto" style={style}>
          <div className="card-header">
            <h2>
                { article.title }
                <button onClick={this.handleClick} className="btn btn-primary btn-lg float-right">
                    {this.state.isOpen ? 'close' : 'open'}
                </button>
            </h2>
          </div>
          <div className="card-body"> 
                <h6 className="card-subtitle text-muted">
                   "creation date : "{ (new Date(article.date)).toDateString()}
                </h6>
                { body }
          </div>
        </div>
      );
    }
    handleClick = () =>{
      console.log('---', 'clicked')
      this.setState({
        isOpen: !this.state.isOpen
      })
    }
  }
  export default Article
  
components/ArticleList/index.js
  import React from 'react'
  import Article from '../Article'
  import './style.css'
  export default function ArticleList({articles}) {
        const articleElements = articles.map(article =>
            <li key = {article.id} className="article-list__li">
              <Article article = {article}/>
            </li>
          )
        return(
            <ul>
              {articleElements}
            </ul>
          );
  }
  
components/ArticleList/style.css
  .article-list__li {
    list-style: none;
  }
  
 






















