Translate

Поиск по этому блогу

Показаны сообщения с ярлыком JSX. Показать все сообщения
Показаны сообщения с ярлыком JSX. Показать все сообщения

среда, 9 мая 2018 г.

React.js (3) Добавляем интерактивность.



Все статьи по React.js



Добавляем кнопку к нашему приложению. Для этого в файле Articles.js добавили - выделено красным:

import React from 'react'

function Article(props) {
  const {article} = props
  const body = <section>{ article.text }</section> 
 return(
      <div>
        <h2>
          { article.title }
          <button onClick={handleClick}>close</button>
        </h2> 
        { body }
        <h3>
         "creation date : "{ (new Date(article.date)).toDateString()}
        </h3>
      </div>
    );
}
function handleClick() {
  console.log('---', 'clicked')
}

export default Article


Мы добавили кнопку и "проверочную" функция, которая при клике выведет в консоль:



Теперь самое время подумать, как мы будем открывать и закрывать текст статьи этой кнопкой.

В мире реакта мы используем декларативное программирование. То есть мы не описываем что нужно убрать этот текст или напротив - добавить текст в HTML. Мы описываем состояние компонента. И наши объекты могут находиться в различных состояниях. В нашем случае это состояния с открытым и закрытым текстом.

Мы опишем эти состояния, а кнопка будет нам помогать переходить из одного состояния в другое. Именно нажатие на кнопку будет изменять состояние компонента.

Для того, чтобы описывать состояния компонента, нам недостаточно использовать такой простой синтаксис описания компонента в виде функции. Такой синтаксис подходит только для очень простых компонентов, которые имеют небольшую часть логики Stateless компоненты.

Для того, чтобы добавить описание состоянию компонента нам придется использовать второй синтаксис с использование классов ES6:

Для этого нам понадобится базовый компонент реакта - изменяем первую строку "импорта":


import React, {Component} from 'react'

class Article extends Component {
  render() {
    Cюда весь код функции Article без объявления
  }
}


Единственное что - наши props. Для них следует добавить - this.props, потому как они уже не будут приходить как аргумент, а будут частью компонента - Component, расширением коего и является наша функция Article

Проверим. Ничего не должно измениться на нашем сайте.

Теперь нам нужно добавить состояние. Для этого внутри компонента мы создадим конструктор в котором зададим начальное состояние


import React, {Component} from 'react'

class Article extends Component {
  // constructor(props) {
  //   super(props)

  //   this.state = {
  //     isOpen: true
  //   }
  // }
state = {
  isOpen: true
}

  render() {
      const {article} = this.props
      console.log('---', this.props)
      const body = <section>{ article.text }</section> 
    return(
      <div>
        <h2>
          { article.title }
          <button onClick={handleClick}>close</button>
        </h2> 
        { body }
        <h3>
          "creation date : "{ (new Date(article.date)).toDateString()}
        </h3>
      </div>
    );
  }
}



function handleClick() {
  console.log('---', 'clicked')
}

export default Article

Красным цветом мы описали состояние компонента по старому. А ниже, зеленым, описали то же самое, но новым стилем. Поэтому все что красное - можно смело закомментировать. Это совершенно эквивалентные записи просто короткая запись с экспериментальным синтаксисом.

Теперь, нам нужно использовать это состояние. Мы будем его использовать там, где мы создали переменную body и скажем. что если наше состояние активное (isOpen: true), то мы будем показывать эту секцию, а нет - значит рендерить пустоту.

Наше состояние храниться в this.state. Это специальный атрибут, наподобие this.props. Ниже написанный код можно выразить так: Если наше состояние isOpen (true), то мы показываем секцию, а если нет, то не показываем.


const body = this.state.isOpen && <section>{ article.text }</section> 



для эксперимента мы изменим и изначальное состояние на false.
Теперь если проверить, то наша статья будет скрыта.



Стоит изменить значение isOpen: на true и статья будет открыта (показана на экране).

Теперь нам осталось сделать так, чтобы изменять состояние.

для смены состояний есть специальный метод ,code>this.set state. Но для того, чтобы работать с контекстом, нам нужно привязать этот контекст к обработчику. существует множество способов как это сделать.

<button onClick={handleClick.bind(this)}>close</button>


Но так делать не стоит.

Мы можем описать этот метод в конструкторе :


import React, {Component} from 'react'

class Article extends Component {
  constructor(props) {
    super(props)

       this.state = {
      isOpen: true
    }
    this.handleClick = handleClick.bind(this)
  }


  render() {
      const {article} = this.props
      console.log('---', this.props)
      const body = this.state.isOpen && <section>{ article.text }</section> 
    return(
      <div>
        <h2>
          { article.title }
          <button onClick={this.handleClick}>close</button>
        </h2> 
        { body }
        <h3>
          "creation date : "{ (new Date(article.date)).toDateString()}
        </h3>
      </div>
    );
  }
  handleClick = () =>{
    console.log('---', 'clicked')
  }
}

export default Article



Красным цветом - это старый развернутый синтаксис. Его можно смело заменить новым - выделен зеленым цветом. Все красное- из кода можно смело удалить!

Во вновь добавленную функцию (зеленым) мы добавили проверочный вывод в консоль. и this.setState() в которую мы передали объект у которого мы задаем новое состояние isOpen = true или isOpen = false, но мы можем отталкиваться от предыдущего состояния и изменять его - isOpen: !this.state.isOpen

setState() - операция асинхронная, поэтому там у нас будет старое состояние (!this.state.isOpen).

Таким образом мы с вами добавили кнопку, которая легко изменяет состояние нашего компонента и показывает или скрывает статью нашего приложения.

Осталось только поменять текст на кнопке -вместо надписи кнопки - "close", мы добавим функцию, которая будет изменять текст в зависимости от состояния:

{this.state.isOpen ? 'close' : 'open'}

Файл 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>
        <h2>
          { article.title }
          <button onClick={this.handleClick}>
            {this.state.isOpen ? 'close' : 'open'}
          </button>
        </h2> 
        { body }
        <h3>
          "creation date : "{ (new Date(article.date)).toDateString()}
        </h3>
      </div>
    );
  }
  handleClick = () =>{
    console.log('---', 'clicked')
    this.setState({
      isOpen: !this.state.isOpen
    })
  }
}

export default Article



Первая часть React                                                                                                                                                              

понедельник, 7 мая 2018 г.

React.js Настройка окружения.

Самый простой способ настроить среду для запуска приложения на react.js это установить готовый пакет Create React App от разработчиков Facebook



Почему приложение Create React App?


Просто потому. что вместе с ним мы получим готовый, настроенный сервер, Babel интерпретатор, Webpack для сборки и другие плюшки, в виде свободы в написании кода без префиксов для кросбраузерности и настроенную среду для тестирования и сборки приложения. В вашей среде будет все, что вам нужно для создания современного приложения React:
  • React, JSX и ES6.
  • Языковые дополнительные функции за пределами ES6, такие как spread operator объектов.
  • Dev-сервер, который накладывает на обычные ошибки.
  • Импортируйте файлы CSS и изображений непосредственно из JavaScript.
  • Autoprefixed CSS, поэтому вам не нужны -webkit или другие префиксы.
  • Сценарий сборки для объединения JS, CSS и изображений для производства с sourcemaps.


Для начала нам потребуется установленный Node.js с менеджером пакетов npm или yarn.

Чтобы проверить, установлен ли на ваш компьютер Node.js, а npm - пакеты к нему устанавливаются по умолчанию, то введите в КС - командной строке, или bash - node -v.Должны получит версию ноды. Например: v8.5.0




  1. Идем на сайт gitHub - create-react-app
    или его русскоязычный аналог - create-react-app-rus

  2. Устанавливаем приложение глобально. В КС - командной строке (или Bash) вводим:

    npm install -g create-react-app

  3. Ждем окончания установки и переходим в директорию (команда cd), где будет создаваться папка нашего приложения. В КС набираем:

    create-react-app my-app

    В данном случае - my-app - название папки вашего приложения.

  4. Открываем папку нашего проекта my-app в редакторе и удаляем из папки public все файлы кроме index.html




  5. В файле index.html удаляем все и добавляем самый простой код страницы:

  6. 
    <!DOCTYPE html>
    <html lang="en">
      <head>
        <title>React App</title>
      </head>
      <body>
        
        <div id="root"></div>
    
      </body>
    </html>
    
    


  7. В папке src оставляем только файл index.js с кодом, где будет например такой код (файл полностью):

  8. 
    import React from 'react'
    import {render} from 'react-dom'
    
    function Article() {
      const body = <section>Footer</section> 
     return(
          <div className="hello" style={{color:"red"}}>
            <h2>title</h2>
            <section>body</section> 
            { body }
            <h3 style={{color:"red"}}>
             "creation date : "{ (new Date()).toDateString()}
            </h3>
          </div>
        );
    }
    
    function App() {
     return (
        <div>
            <h1>App Name</h1>
            <Article/>
        </div>
      );
    }
    
    render(<App/> ,document.getElementById('root'))
    
    
    


  9. Сохраняем и переходим непосредственно в наше приложение - >
    cd my-app

    A для запуска сервера на локальном хосте 3000 в КС набираем:
    npm start

    Появится сообщение, что сайт запущен на локальном хосте по адресу -http://localhost:3000




  10. Перейдите по этому адресу и вы должны увидеть вот такую страницу




  11. Остановить сервер - Ctrl + C


Создание нового и открытие старого приложения.


Теперь, когда у вас на машине установлен пакет create-react-app глобально, вы можете с легкостью его развернуть в любой папке для создания нового react-приложения. Это очень удобно. Я делаю так:

  1. выбираю директорию в проводнике и нажимаю правую кнопку мыши.




  2. В выпадающем меню выбираю - Git Bush Here

  3. Далее все, как в примере выше, с пункта 3, или просто делаю
    npm start
    для запуска уже созданного приложения на локальном хосте.


Надеясь, что вам было понятно и я не слишком утомил вас подробными объяснениями. Дело в том, что информации по React.js действительно много, но порой она больше касается теории, или опускает какие-то моменты, которые авторам кажутся очень простыми и само-собой разумеющиеся, но это осложняет жизнь начинающим пользователям. Да, и приятно, когда нужные, простые заметки всегда под рукой.

Подписывайтесь на мой блог и не забывайте поделиться, чтобы не потерять, если вам понравилось.

Следующая часть - React (2) - разбить на компоненты                                                                                                                                                              


Хотите освоить самые современные методы написания React приложений? Надоели простые проекты? Нужны курсы, книги, руководства, индивидуальные занятия по React и не только? Хотите стать разработчиком полного цикла, освоить стек MERN, или вы только начинаете свой путь в программировании, и не знаете с чего начать, то пишите через форму связи, подписывайтесь на мой канал в Телеге, вступайте в группу на Facebook.Пишите мне - kolesnikovy70 почта gmail.com