- Установка React.js
- Поддержка TypeScript
- Настройка страницы
- Интеграция Material UI
- Добавление React-компонента
Чтобы начать портировать приложение на React.js:
-
Добавьте следующие gem'ы в Gemfile.
# Transpile app-like JavaScript. Read more: https://github.com/rails/webpacker gem 'webpacker' # A flexible tool to use React with Rails. Read more: https://github.com/reactjs/react-rails gem "react-rails"
-
Устанавите добавленные gem'ы.
$ bundle install
Примечание. Чтобы обновить установленные ранее gem'ы, выполните команду
bundle update
. Чтобы увидеть куда gem был установлен, выполните команду:bundle info [gemname]
. -
Выполните команды:
$ rails webpacker:install # OR (on rails version < 5.0) rake webpacker:install $ rails webpacker:install:react # OR (on rails version < 5.0) rake webpacker:install:react $ rails generate react:install
Эти команды:
- Создадут директорию
app/javascript/components/
для React-компонентов. - Установят
ReactRailsUJS
вapp/javascript/packs/application.js
. - Создадут директорию
app/javascript/packs/server_rendering.js
для рендеринга на стороне сервера.
- Создадут директорию
Чтобы добавить поддержку типов, выполните команды:
$ bundle exec rails webpacker:install:typescript
$ yarn add @types/react @types/react-dom
Чтобы добавить React.js в проект, необходимо переопредлить представление spree. Если представление поправить вручную, то мы потеряем возможность обновлять Spree. Поэтому мы воспользуемся библиотекой Deface. Deface — это библиотека Rails, позволяющая переопределять Erb-шаблоны без их непосредственного редактирования. Таким образом, мы получим возможность обновлять Spree, не теряя наши изменения.
Чтобы доопределить нативный шаблон Spree:
-
Добавьте директорию:
app/overrides
.$ mkdir app/overrides
-
Создайте файл
app/overrides/add_react_to_application.rb
. -
Добавьте в созданный файл следующий контент:
Deface::Override.new(:virtual_path => 'spree/shared/_head', :name => "add_react_to_application", insert_after: "erb[loud]:contains('javascript_include_tag')", :text => "<%= javascript_pack_tag 'application' %>")
Material UI — библиотека React-компонентов с имплементированным Google’s Material Design.
Чтобы интегрировать Material UI, выполните команды:
$ yarn add @material-ui/core
$ yarn add @material-ui/icons // To add material icons too
-
Выполните команду:
$ rails g react:component MainNavBar name:string
Примечание. В директории
app/javascript/components
создастся компонентMainNavBar.js
. -
Замените его содержимое на следующее:
import React from "react"; import PropTypes from "prop-types"; import { withStyles } from '@material-ui/core/styles'; import Grid from '@material-ui/core/Grid'; import Button from '@material-ui/core/Button'; const styles = theme => ({ button: { margin: theme.spacing.unit, color: 'white' } }); class MainNavBar extends React.Component { render () { const { classes } = this.props; return ( <React.Fragment> <Grid item xs={12}> <Button href={this.props.href} size="medium" className={classes.button}> {this.props.children} </Button> </Grid> </React.Fragment> ); } } MainNavBar.propTypes = { classes: PropTypes.object.isRequired }; export default withStyles(styles)(MainNavBar);