9
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

railsアプリにReactのモーダルをサクっと入れる

Posted at

#0.前提
サーバーサイドメインだけど、フロントエンドも触ってみたい人用。
railsをAPIモードで作成、、、とかはしません。
react-railsでさくっとやります。

#1.React-Railsの導入
webpackerとreact-railsを入れます。

gemfile
gem 'webpacker'
gem 'react-rails'

インストーラを走らせます。

$ bundle install
$ rails webpacker:install     
$ rails webpacker:install:react
$ rails generate react:install

application.html.erbにヘルパーを埋め込みます。

application.html.erb
<%= javascript_pack_tag 'application' %>

おわり。

#2.React-modalの導入

npmかyarnでReact-modalをインストールします。

$ npm install react-modal
$ yarn add react-modal

おわり。

#3.modalコンポーネントの作成

javascript/components配下にApp.jsを用意し、以下のように書きます。

App.js
import React from 'react';
import Modal from 'react-modal';

const customStyles = {
  content : {
    top                   : '50%',
    left                  : '50%',
    right                 : 'auto',
    bottom                : 'auto',
    marginRight           : '-50%',
    transform             : 'translate(-50%, -50%)'
  }
};

class App extends React.Component {
  constructor() {
    super();
    this.state = {
      modalIsOpen: false
    };

    this.openModal = this.openModal.bind(this);
    this.afterOpenModal = this.afterOpenModal.bind(this);
    this.closeModal = this.closeModal.bind(this);
  }

  openModal() {
    this.setState({modalIsOpen: true});
  }

  afterOpenModal() {
    // references are now sync'd and can be accessed.
    this.subtitle.style.color = '#f00';
  }

  closeModal() {
    this.setState({modalIsOpen: false});
  }

  render() {
    return (
      <div>
        <button onClick={this.openModal}>Open Modal</button>
        <Modal
          isOpen={this.state.modalIsOpen}
          onAfterOpen={this.afterOpenModal}
          onRequestClose={this.closeModal}
          style={customStyles}
          contentLabel="Example Modal"
        >

          <h2 ref={subtitle => this.subtitle = subtitle}>Hello</h2>
          <button onClick={this.closeModal}>close</button>
          <div>I am a modal</div>
          <form>
            <input />
            <button>tab navigation</button>
            <button>stays</button>
            <button>inside</button>
            <button>the modal</button>
          </form>
        </Modal>
      </div>
    );
  }
}

export default App;

おわり。

#4.modalを表示するviewを用意する

home.html.erb
<%= react_component("App") %>

表示したい場所に上記のヘルパーを埋め込んでおけばOKです。

#5.終わりに
かなりサクっと書きました。
実際に利用する際は、コンポーネントに値を渡すことが多いと思います。
そういった場合は、

<%= react_component('HelloMessage', name: 'John') %>

という風に書きます。リテラルだけでなく、インスタンス変数も渡せます。

9
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?