• React Native、Redux、Railsを使って、掲示板アプリを作ってみよう
    React Native、Redux、Railsを使って、掲示板アプリを作ってみよう
    No Comments on React Native、Redux、Railsを使って、掲示板アプリを作ってみよう

    はじめに 前回、React NativeをAndroid Studioと組み合わせてインストールし、HelloWorldを出せるところまで たどり着きました。 今回は一足飛びで、React NativeとReduxをフロントエンドに使い、バックエンドにRailsを用いた 掲示板アプリを作ってみましょう。 前提として、Railsはそれなりにわかっている。Reactもよく分かっている。Reduxも知っている。 ぐらいのレベルを前提にしています。 出来上がったアプリは、デザイン的にどんくさいですが、これは私がまだReactNativeの スタイルの方法を学んでいないためです。まぁそれはおいおいブラッシュアップすることとしましょう。 ソースはすべてGitHubで公開しています。利用方法など含めて、記事の最後に記載しておきます。 機能一覧 掲示板一覧が表示される 掲示板を選択したら、対象のコメント一覧が表示される コメントを投稿できる 機能はこの3つだけ。掲示板も追加できたほうがいいのでしょうが・・ あまり欲張ってあれこれ実装すると、なにを説明しているかわからなくなるので、今回は カットしておきましょう。 出来上がりのイメージからパーツ構成を考える 出来上がりの画面イメージは以下のようなものです。いかにもどんくさい画面ですが、 これは私がReact Nativeのスタイルの作法がわかっていないためですので、勘弁ください。 とりあえず、この画面イメージから、どんなパーツ(Reactのコンポーネント)が必要となるか 考えてみましょう。ざっと以下のようなイメージになると思います。 アプリが持つべき、ステートとイベントを考える 画面パーツは考え終わったので、次にアプリが持つステートとイベントを考えましょう。 ステート 現在アクティブな掲示板 アクティブな掲示板に投稿されたコメント群 投稿ユーザー 投稿コメント CSRF Token 大体この5つとなります。 投稿ユーザーと投稿コメントは、ステートにしなくても良いのかもしれませんが、Redux風に記述しようとすると ステートとした方が処理しやすいので、ステートとします。 CSRF Tokenとは、バックエンドのRailsサーバーに対してPOST処理をするときに必要となる認証用のキーみたいなものです。 とりあえず、必要なんだなぁ・・・ぐらいに考えておいてください。 イベント 掲示板を選択する 投稿ユーザーを選択する 投稿コメントを入力する 掲示板にコメントを投稿する 投稿ユーザーの選択とは、本来の掲示板の機能では必要ではありませんが、 ログイン処理などを設けない、今回説明するこのアプリでは、投稿のたびに「私は誰ですよ」と ユーザーも選択して、コメントを投稿することにします。 バックエンドであるRailsサーバーに必要な機能 バックエンド(サーバーサイド)のRailsアプリに必要な機能をリストアップしてみましょう。 掲示板一覧を取得 投稿ユーザー一覧を取得 対象掲示板のコメント一覧を取得 コメントを投稿 Railsでバックエンド処理を実装する Railsは分かっている前提ですので・・、ざーーっと説明します。 目標となるファイル構成は以下のような感じです。 まずはRailsプロジェクトと、React Nativeプロジェクトの親フォルダを作りましょう。 [bash] $ cd $ mkdir workspace $ cd workspace $ mkdir reactnative_rails_board [/bash] Railsプロジェクト作成 [bash] $ cd reactnative_rails_board $ rails new rnative_rails [/bash] Gemファイルを調整して、bundle install [bash] $ cd rnative_rails $ nano Gemfile [/bash] 末尾に1行追記 [bash] gem ‘therubyracer’, platforms: :ruby [/bash] 動作確認 bundle install して、Railsサーバー起動 [bash] $ bundle install $ rails s [/bash] ここまでのところを動作確認します。 ブラウザーで http://localhost:3000 にアクセスしてください。以下のような画面が出れば成功です。 モデル作成、サンプルデータ作成 Railsのモデルを作成し、サンプルデータをSeedファイル(CSV)として読み込める状態にしましょう。 モデルの作成 [bash] $ rails g model board title:string description:text $ rails g model user name:string sex:integer age:integer $ rails g model comment board_id:integer user_id:integer comment:text [/bash] モデルの調整 rnative_rails/app/models/comment.rb [bash] class Comment < ApplicationRecord belongs_to :user end [/bash] マイグレート [bash] $ rake db:migrate [/bash] 出来上がったイメージはこんな感じ。 Seedデータの作成 何もないところからデータ投稿までつくり上げるのには時間がかかるので、シード(seed)データを 作っておいて、まずはそのデータを読んで、一覧表示することぐらいから始めましょう。 db/csv/boards.csv [bash] 1,ReactJSを学ぼう,あいうえお 2,ReactJS と Rails連携,かきくけこ 3,ReactJS 発展編,さしすせそ 4,jQuery入門,たちつてと 5,jQuery得意な人集まれ,なにぬねの 6,AngularJS入門,はひふへほ 7,vue.jsってなんぞ,まみむめも [/bash] db/csv/users.csv [bash] 1,花子,2,23 2,太郎,1,30 3,幸次郎,1,15 4,浩輝,1,40 5,大樹,1,35 6,すず,2,28 7,雅代,2,38 [/bash] db/csv/comments.csv [bash] “1”,”1″,”2″,”ReactはFacebookが開発しているUI(MV*フレームワークでいうViewのようなもの)に特化したJavaScriptライブラリです。 ” “2”,”1″,”3″,”大きな特徴としてVirtual DOM(仮想DOM)と呼ばれるレンダリング機構がそなわっており、Webページの表示を従来の .” “3”,”1″,”3″,”公式サイトに、「A JavaScript library for building user interfaces」とあるように、React.jsはUIを構築するためのライブラリです。” “4”,”1″,”3″,”フレームワークでなくあくまでUIを構築するだけのライブラリで、MVCでいうところのVのみの機能を提供します。” “5”,”1″,”7″,”最近フロントエンドでfacebook/reactをずっと使っている。世界的には一部のエンジニアの間で流行っているのだが、国内だとqiitaのタグ等を見てもどうも少ない。” “6”,”2″,”7″,”はじめにreact-railsという、ReactをAsset Pipelineに乗せて使えるようにしてくれるruby gemsがある。 この記事では、これを使用してReactの公式tutorialを進めていく。” “7”,”2″,”4″,”既存のRailsプロジェクトの中でReact.jsを利用する機会があったので、その時にやったことについてまとめてみます。 私自身は普段RailsのサーバサイドとCoffeeScriptが中心で、最近のJavaScript開発環境についてあまりキャッチアップでき” “8”,”2″,”5″,”RailsでSingle-Page Applicationをつくるときの自分のやり方をまとめてみます。 Gem 「JavaScriptで書かれたReactのコンポーネントからHTMLを生成する」というのをRubyでやるために、RubyのV8エンジン実装で ..” “9”,”2″,”2″,”react-railsというReact.jsをRailsに簡単に統合できるgemを使い、React.jsについて説明します。 次のような画面をReact.jsで実装し、Reactとサーバ(Rails)間でメッセージ一覧の取得や作成をできるようにします。 ソースコードはこちらです。” “10”,”3″,”2″,”最近のモダンなウェブフレームワークと言えば、React+Reduxですよね。でも、なんか難しそうとか、ReactってPHPみたいにViewにロジック混ざりそうとか感じて尻込みしていませんか?それはただの誤解かもしれません。React+Reduxはそんなに難易度の高い .” “11”,”3″,”1″,”玉石混合状態にあったFluxのフレームワークも、ここ最近ではReduxが首一つ抜け出したような感じとなっています。自分はFacebook/Flux派ではありましたが、先月発売された『WEB+DB PRESS vol.92』に掲載されていた” “12”,”3″,”6″,” React.jsとReduxを組み合わせた構成で、Webサイトを作ってみるチュートリアル(React+Redux入門)です。第一回目は、GitHub上のコードが読めるようになることを目標に解説しています。” “13”,”3″,”3″,”目的 ReduxとES6への入門。 React.jsを(ようやく)触る機会が出て、情報量の多いFluxxorとCoffeeScriptで入門してた。 ” “14”,”7″,”3″,”私たちはなぜReactではなくVue.jsを選んだのか Qwintryチームは最近、既存のすべてのプロジェクトのフロントエンドをVue.jsに移行しはじめました。” “15”,”6″,”4″,”AngularJS(アンギュラージェイエス)、または Angular は、Googleと個人や企業のコミュニティによって開発されている、完全にJavaScriptで書かれたオープンソースのフロントエンドWebアプリケーションフレームワークである。MIT Licenseでライセンスされた” “16”,”4″,”4″,”今後のWebデザイナーは、デザイン・htmlコーディング+その他の強みを求められる世の中になっていきます。今回はその強みとなりうる「jQuery」についてご説明いたします。” “17”,”4″,”2″,”今回はjQueryの基本的な書き方として、これから「jQueryを覚えて、ブイブイ言わせてやるぜ!」と新しいスキルを身につけたいデザイナーさんには丁度いい内容かと思います。” “18”,”5″,”2″,”今年2016年6月9日、ついに正式版がリリースされた jQuery 3。メジャーバージョンアップしたjQuery 3では、従来のバージョンから、いったい何が変わったのかを2回に分けて解説します。” “19”,”5″,”1″,” jQueryはWeb業界の発展に大いに役立ってきました。しかし、ネイティブのJavaScriptが高度化し、かつマーケットシェアの縮小した古いブラウザをサポートする必要の薄れた現代において、jQueryを本当に使う必要があるでしょうか?必要性と” “20”,”4″,”1″,”Webデザイナーやマークアップエンジニアのための超コンパクトなjQuery講座ができました。JavaScriptの予備知識は不要。Web制作に必要な要点だけを解説します。 (1/6)” “21”,”7″,”6″,”双方向データバインディングに特化したVue.jsは、シンプルで学習コストも低いといわれます。第1回目はVue.jsがフレームワークとして、どんな強みをもっているのか” “22”,”7″,”7″,”Angular、Reactと並んで海外で人気が高まっている「Vue.js」。ReactとAngularの開発経験がある著者がVue.jsをサンプルコードつきのチュートリアルを通じて特徴をまとめて解説します。2017年、新しく学び始めるきっかけにどうぞ。” [/bash] Seedデータをデータベースに反映するスクリプト db/seeds.rbを編集 [bash] require ‘csv’ CSV.foreach(‘db/csv/boards.csv’) do |row| Board.create!(id: row[0], title: row[1], description: row[2]) end CSV.foreach(‘db/csv/users.csv’) do |row| User.create!(id: row[0], name: row[1], sex: row[2], age: row[3]) end CSV.foreach(‘db/csv/comments.csv’) do |row| Comment.create!(id: row[0], board_id: row[1], user_id: row[2], comment: row[3]) end [/bash] Seedデータの投入 [bash] $ rake db:seed [/bash] バックエンドAPI用 AJAXコントローラー作成 [bash] $ rails g...

    Read more
  • React Native で Hello Worldをするまで・・・
    React Native で Hello Worldをするまで・・・
    No Comments on React Native で Hello Worldをするまで・・・

    はじめに React Nativeを試したくなって、インストールから、あれこれしてみました。 結構苦労したので、Hello Worldを出すぐらいのところまでを、メモとして記載しておきます。 インストールは 本家のページの「Getting Started」を見ながらで大体出来るのだが・・・ Android Studio自体も初めて触ったので、ちょっと迷って、困ったのでそのへんも・・・ インストール 以下のGetting Startedに沿って始めてください。 Getting Started https://facebook.github.io/react-native/docs/getting-started.html 手順に沿ってインストール ページ中腹の「Starting the Android Virtual Device」のところまで、頑張って勧めてください。 Android Studioのインストール、追加でAndroid 6のモジュールをインストールするなどなど、かなり時間がかかります。(およそ30分) (Android Studioは /opt 配下にインストールしました。) 迷ったところは、 [bash] npm install -g react-native-cli [/bash] sudo をつける必要があったところぐらいです。 [bash] sudo npm install -g react-native-cli [/bash] ページ中腹の「Starting the Android Virtual Device」のところが、実際やったのと違って困ったので、 対処方法を記載しておきます。 ページでは [bash] $ android avd [/bash] としろと記載されていますが・・・ うまく行きません。 以下のコマンドを叩いて Android Studioを起動しましょう。 Android Studio の起動 [bash] $ /opt/android-studio/bin/studio.sh [/bash] 以下のような画面が表示されます。 新規プロジェクトを作成 Start a new Android Studio project をクリックして、適当な名前でプロジェクトを1つ作成してください。 このプロジェクトは、全く使いませんが、AVD Managerを起動する際に必要なので、とりあえず作ります。 Android仮想マシン作成 メニューより AVD Managerを起動します。 Tool >> Android >> AVD Manager あとは画像の手順で仮想マシンを1つ作ってください。 仮想マシンを起動します。 JDKのインストールと設定 Javaのコンパイル環境が入ってない場合、動作しないみたいです。 既にJava環境がある場合はとばして頂いて結構です。 Googleで「jdk」をキーワードに検索してください。 「Java SE Development Kit 8 – Downloads – Oracle」 というのがトップに出てくると思うので、リンクをクリックして、 自分の環境にあった、JDKをダウンロードしてください。 JDKインストール [bash] $ sudo mkdir /usr/java $ sudo mv jdk-8u121-linux-x64.tar.gz /usr/java $ sudo tar xvzf jdk-8u121-linux-x64.tar.gz [/bash] プロファイルを編集して、パスを通す [bash] nano ~/.bash_profile [/bash] [bash] CLASSPATH=/usr/java/jdk1.8.0_121/jre/lib/rt.jar PATH=$PATH:/usr/java/jdk1.8.0_121/bin/ export CLASSPATH PATH [/bash] [bash] $ source ~/.bash_profile [/bash] React Native HelloWorldプロジェクト作成 いよいよ、React Nativeプロジェクトの作成と、Hello Worldです。 [bash] $ react-native init HelloWorld $ cd HelloWorld/ $ react-native start > /dev/null 2>&1 & $ react-native run-android [/bash] デフォルトのトップページが仮想マシンに表示されたらOKです。 index.android.js を調整 HelloWorld/index.android.js 以下の部分にHello Worldを表示する3行を追加します。 [bash] export default class HelloWorld extends Component { render() { return ( Welcome to React Native! Hello World!! To get started, edit index.android.js Double tap R on your keyboard to reload,{‘\n’} Shake or press menu button for dev menu ); } } [/bash] 画面リフレッシュ 仮想マシンの画面をアクティブにして、キーボードで、「R」を2回押します。 別プロジェクトを作りたくなったら Hello Worldはとりあえず出来たので、別のプロジェクトを作りたくなった場合の説明をします。 プロジェクトの作り方は、HelloWorldの時と同じですが・・・ いざアプリを起動しようとすると、エラーが発生します。 エラーの内容は、「xxx フォルダのindex.android.jsはないよ・・・」みたいなものです。 これ、HelloWorldプロジェクトの方を見に行っててエラーになっているみたいです。 react-native start で起動したプロセスが残っているために、前に起動したプロジェクトを見に行っちゃうようですね。 古いプロセスを殺す 以下のコマンドで、プロセスを探して、killします。 [bash] $ ps aux |grep react-native [/bash] [bash] hiro 15864 2.0 1.3 1314168 140484 pts/0 Sl 01:22 0:07 node /usr/local/bin/react-native start hiro 17068 0.0 0.0 15256 936 pts/0 S+ 01:28 0:00 grep –color=auto react-native [/bash] [bash] $ kill 15864 [/bash] もう一度、 react-native start [bash] $ react-native start > /dev/null 2>&1 & $ react-native run-android [/bash] マシン再起動後の動作確認方法 一旦マシンを落としたあと、また、開発したくなったらどうするかという手順です。 手順というほどではありませんが、とりあえず、以下のコマンドでAndroid Studioを起動して、 [bash] $ /opt/android-studio/bin/studio.sh [/bash] メニューより AVD Managerを起動します。 Tool >> Android >> AVD…

    Read more
  • Rails 5.0 と React、Redux、Ajaxを組み合わせて掲示板アプリを作ってみよう
    Rails 5.0 と React、Redux、Ajaxを組み合わせて掲示板アプリを作ってみよう
    No Comments on Rails 5.0 と React、Redux、Ajaxを組み合わせて掲示板アプリを作ってみよう

    はじめに Reduxを勉強して、ようやく大筋を理解し、Railsとの連携方法も分かったので、 Rails+React+Redux+Ajaxの組み合わせでちょっとした掲示板を作ってみました。 Rails+React+Redux+Ajaxの組み合わせで必要なノウハウはだいたい組み込まれていると思います。 ここで紹介するソースはGitHubのここで公開していますので自由に利用してください。 対象とする読者は Railsはそこそこ知っている。Reactも勉強した。Reduxも勉強した、もしくは勉強中である という方が対象です。 Rails + React + Reduxの環境を整える これに関しては書き出すと長くなるので、この記事を参照して準備してください。 Todoサンプルを動かす必要はないので、とりあえず RailsとReactとReduxのインストールと連携の部分の作業を行ってください。 Railsのインストールやnode.js npm のインストールなどは他に山ほど丁寧に書かれたサイトがあるので、それらを参照してください。 掲示板アプリ作成開始 さて、いよいよ掲示板アプリの作成開始です。 完成形の動作イメージはこんな感じです。 左に掲示板一覧がリストアップされていて、右に投稿を行う場所と投稿一覧が表示されている感じです。 Railsプロジェクト作成 [bash] $ cd ~/ $ mkdir workspace $ cd workspace $ rails new rails_redux_board $ cd rails_redux_board [/bash] これ以降の RailsとReact、Reduxの組み合わせの環境を構築する手順はこちらの記事(Rails5.0 に React、Reduxを導入して、Redux本家のTodoサンプルを動かす)を参照にして頑張ってみてください。 とりあえず、Redux本家のTodoが動かせたらOKです。手間を省きたければTodoアプリのコピペはしなくて結構です。 components.js編集 app/assets/javascripts/components.js board.jsはアプリのエントリーポイントとなるJSファイルです。ここに定義したクラス名(const宣言)を windowの下にセット(変数として公開)してやる。 (意味はいまいち理解できていないのですが、必須みたいです) 全て消して以下の4行を追記。Todoアプリを移植していない場合は、Todosの行は不要 [bash] window.React = require(‘react’); window.ReactDOM = require(‘react-dom’); window.Todos = require(‘./todos.js’); window.Board = require(‘./board.js’); [/bash] React+Reduxの掲示板のエントリーポイントとなるJSファイルを作成 app/assets/javascripts/board.js [bash] import React, { Component } from ‘react’ import { render } from ‘react-dom’ import { Provider } from ‘react-redux’ import { createStore } from ‘redux’ import rootReducer from ‘./reducers/root’ import App from ‘./components/App’ const Board = ({}) => { return ( ) } export default Board [/bash] すべてのReducerをまとめる親Reducer作成 app/assets/javascripts/reducers/root.js [bash] import {combineReducers} from “redux” const rootReducer = combineReducers({}) export default rootReducer [/bash] アプリケーションのトップ階層となるApp.jsを作成 app/assets/javascripts/components/App.js [bash] import React from “react” const App = ({}) => { return ( This is Board Application with Rails,React,Redux ) } export default App [/bash] Railsでコントローラーとビューを作成 [bash] $ rails g controller board index [/bash] ビュー編集 ビューを編集して、掲示板のReactコンポーネントを作成します。 app/views/board/index.html.erb [bash] Board#index Find me in app/views/board/index.html.erb [/bash] ここまでで動作確認 これで最低限のところは出来たので、Railsサーバーを起動して、動作確認。 http://localhost:3000/board/index こんな感じのイメージが表示されれば成功。 モデル作成、サンプルデータ作成 Railsのモデルを作成し、サンプルデータをSeedファイル(CSV)として読み込める状態にしましょう。 モデルの作成 [bash] $ rails g model board title:string description:text $ rails g model user name:string sex:integer age:integer $ rails g model comment board_id:integer user_id:integer comment:text [/bash] マイグレート [bash] $ rake db:migrate [/bash] 出来上がったイメージはこんな感じ。 Seedデータの作成 何もないところからデータ投稿までつくり上げるのには時間がかかるので、シード(seed)データを 作っておいて、まずはそのデータを読んで、一覧表示することぐらいから始めましょう。 db/csv/boards.csv [bash] 1,ReactJSを学ぼう,あいうえお 2,ReactJS と Rails連携,かきくけこ 3,ReactJS 発展編,さしすせそ 4,jQuery入門,たちつてと 5,jQuery得意な人集まれ,なにぬねの 6,AngularJS入門,はひふへほ 7,vue.jsってなんぞ,まみむめも [/bash] db/csv/users.csv [bash] 1,花子,2,23 2,太郎,1,30 3,幸次郎,1,15 4,浩輝,1,40 5,大樹,1,35 6,すず,2,28 7,雅代,2,38 [/bash] db/csv/comments.csv [bash] “1”,”1″,”2″,”ReactはFacebookが開発しているUI(MV*フレームワークでいうViewのようなもの)に特化したJavaScriptライブラリです。 ” “2”,”1″,”3″,”大きな特徴としてVirtual DOM(仮想DOM)と呼ばれるレンダリング機構がそなわっており、Webページの表示を従来の .” “3”,”1″,”3″,”公式サイトに、「A JavaScript library for building user interfaces」とあるように、React.jsはUIを構築するためのライブラリです。” “4”,”1″,”3″,”フレームワークでなくあくまでUIを構築するだけのライブラリで、MVCでいうところのVのみの機能を提供します。” “5”,”1″,”7″,”最近フロントエンドでfacebook/reactをずっと使っている。世界的には一部のエンジニアの間で流行っているのだが、国内だとqiitaのタグ等を見てもどうも少ない。” “6”,”2″,”7″,”はじめにreact-railsという、ReactをAsset Pipelineに乗せて使えるようにしてくれるruby gemsがある。 この記事では、これを使用してReactの公式tutorialを進めていく。” “7”,”2″,”4″,”既存のRailsプロジェクトの中でReact.jsを利用する機会があったので、その時にやったことについてまとめてみます。 私自身は普段RailsのサーバサイドとCoffeeScriptが中心で、最近のJavaScript開発環境についてあまりキャッチアップでき” “8”,”2″,”5″,”RailsでSingle-Page Applicationをつくるときの自分のやり方をまとめてみます。 Gem 「JavaScriptで書かれたReactのコンポーネントからHTMLを生成する」というのをRubyでやるために、RubyのV8エンジン実装で ..” “9”,”2″,”2″,”react-railsというReact.jsをRailsに簡単に統合できるgemを使い、React.jsについて説明します。 次のような画面をReact.jsで実装し、Reactとサーバ(Rails)間でメッセージ一覧の取得や作成をできるようにします。 ソースコードはこちらです。” “10”,”3″,”2″,”最近のモダンなウェブフレームワークと言えば、React+Reduxですよね。でも、なんか難しそうとか、ReactってPHPみたいにViewにロジック混ざりそうとか感じて尻込みしていませんか?それはただの誤解かもしれません。React+Reduxはそんなに難易度の高い .” “11”,”3″,”1″,”玉石混合状態にあったFluxのフレームワークも、ここ最近ではReduxが首一つ抜け出したような感じとなっています。自分はFacebook/Flux派ではありましたが、先月発売された『WEB+DB PRESS vol.92』に掲載されていた” “12”,”3″,”6″,” React.jsとReduxを組み合わせた構成で、Webサイトを作ってみるチュートリアル(React+Redux入門)です。第一回目は、GitHub上のコードが読めるようになることを目標に解説しています。” “13”,”3″,”3″,”目的 ReduxとES6への入門。 React.jsを(ようやく)触る機会が出て、情報量の多いFluxxorとCoffeeScriptで入門してた。 ” “14”,”7″,”3″,”私たちはなぜReactではなくVue.jsを選んだのか Qwintryチームは最近、既存のすべてのプロジェクトのフロントエンドをVue.jsに移行しはじめました。” “15”,”6″,”4″,”AngularJS(アンギュラージェイエス)、または Angular は、Googleと個人や企業のコミュニティによって開発されている、完全にJavaScriptで書かれたオープンソースのフロントエンドWebアプリケーションフレームワークである。MIT Licenseでライセンスされた” “16”,”4″,”4″,”今後のWebデザイナーは、デザイン・htmlコーディング+その他の強みを求められる世の中になっていきます。今回はその強みとなりうる「jQuery」についてご説明いたします。” “17”,”4″,”2″,”今回はjQueryの基本的な書き方として、これから「jQueryを覚えて、ブイブイ言わせてやるぜ!」と新しいスキルを身につけたいデザイナーさんには丁度いい内容かと思います。” “18”,”5″,”2″,”今年2016年6月9日、ついに正式版がリリースされた jQuery 3。メジャーバージョンアップしたjQuery 3では、従来のバージョンから、いったい何が変わったのかを2回に分けて解説します。” “19”,”5″,”1″,” jQueryはWeb業界の発展に大いに役立ってきました。しかし、ネイティブのJavaScriptが高度化し、かつマーケットシェアの縮小した古いブラウザをサポートする必要の薄れた現代において、jQueryを本当に使う必要があるでしょうか?必要性と” “20”,”4″,”1″,”Webデザイナーやマークアップエンジニアのための超コンパクトなjQuery講座ができました。JavaScriptの予備知識は不要。Web制作に必要な要点だけを解説します。 (1/6)”…

    Read more
  • Rails5.0 に React、Reduxを導入して、Redux本家のTodoサンプルを動かす
    Rails5.0 に React、Reduxを導入して、Redux本家のTodoサンプルを動かす
    No Comments on Rails5.0 に React、Reduxを導入して、Redux本家のTodoサンプルを動かす

    はじめに RailsとReact、Reduxを組み合わせてアプリを構築するための準備手順をRedux本家のTodoサンプルを使って示してみます。 React、Reduxはnpm(node_modules)でインストールしたものを使うこととします。 最終的に動いた形のイメージはこんな感じ。 最終的なソースツリーはこんな感じ Railsアプリの新規作成、React導入 [bash] $ rails new rails_redux $ cd rails_redux/ $ nano Gemfile [/bash] 足りないGemを3つ追加して、bundle install 末尾に追記 [bash] + gem ‘therubyracer’, platforms: :ruby + gem ‘react-rails’ + gem ‘browserify-rails’ [/bash] bundle install [bash] $ bundle install [/bash] application.rbを編集 作った ES6(JavaScriptのバージョン)のソースをES5に自動変換するための設定を追記 config.browserify_rails の行を追加 config/application.rb [bash] require_relative ‘boot’ require ‘rails/all’ # Require the gems listed in Gemfile, including any gems # you’ve limited to :test, :development, or :production. Bundler.require(*Rails.groups) module RailsRedux class Application < Rails::Application # Settings in config/environments/* take precedence over those specified here. # Application configuration should go into files in config/initializers # -- all .rb files in that directory are automatically loaded. + config.browserify_rails.commandline_options = '-t babelify' end end [/bash] Rails に Reactインストール [bash] $ rails g react:install [/bash] application.jsの編集 app/assets/javascripts/application.js ・Reactは npmでインストールしたものを使うのでカット。 ・require_tree . もカット 変更前 [bash] //= require jquery //= require jquery_ujs //= require turbolinks //= require react //= require react_ujs //= require components //= require_tree . [/bash] 変更後 [bash] //= require jquery //= require jquery_ujs //= require turbolinks //= require react_ujs //= require components [/bash] React、Redux、etc…の準備(node_modules) React、Reduxその他諸々を npm を使ってインストールします。 [bash] $ npm init -y $ npm install –save-dev browserify browserify-incremental babelify babel-preset-es2015 babel-preset-react $ npm install –save react react-dom react-redux redux redux-thunk [/bash] .babelrc ファイルをRailsのルートフォルダに作成 [bash] { “presets”: [“es2015”, “react”] } [/bash] Reduxの標準的なフォルダを作成 [bash] $ cd app/assets/javascripts/ $ mkdir actions containers reducers [/bash] components.js編集 app/assets/javascripts/components.js todos.jsはアプリのエントリーポイントとなるJSファイルです。ここに定義したクラス名(const宣言)を windowの下にセット(変数として公開)してやる。 (意味はいまいち理解できていないのですが、必須みたいです) 変更前 [bash] //= require_tree ./components [/bash] 変更後 [bash] window.React = require(‘react’); window.ReactDOM = require(‘react-dom’); window.Todos = require(‘./todos.js’); [/bash] Redux本家のTodoサンプルを移植 ここからは redux本家のTodoアプリのソースをコピーアンドペーストです。 エントリーポイントのJS調整 エントリーポイントとなる(Entry Point) index.jsは todos.jsという名前で以下のように作成します。 app/assets/javascripts/todos.js [bash] import React, { Component } from ‘react’ import { render } from ‘react-dom’ import { Provider } from ‘react-redux’ import { createStore } from ‘redux’ import todo from ‘./reducers’ import App from ‘./components/App’ let store = createStore(todo) const Todos = ({}) => { return ( ) }…

    Read more
  • Redux Todoサンプルを npmとwebpackで最小の環境を作って動かす
    Redux Todoサンプルを npmとwebpackで最小の環境を作って動かす
    No Comments on Redux Todoサンプルを npmとwebpackで最小の環境を作って動かす

    はじめに Reactの勉強をはじめて、大雑把に理解したら、Reduxの勉強をしたくなりますよね。 しかしまぁ・・・Reduxムズイ!! となるわけで、とにかくRedux本家にあるTodoのサンプルのソースを眺めるも・・ わかったようなわからないような状態になる。 兎にも角にも、実際に動かしてみなきゃ始まらない。そのための環境を作るのも 最初はちんぷんかんぷんだったりするのですよね・・・ なので、Redux本家にあるTodoサンプルをnpm と Webpackを使って最小環境を作って 動作させるところまでたどり着くのが今回の目標です。 Todoサンプルの内容には踏み込みません、あくまで動くところまで。 最終動作イメージはこんな感じ。 作り上げるフォルダとファイルの構成はこんな感じ。 npmでパッケージをインストールする [bash] $ cd ~/workspace $ mkdir redux_todo $ cd redux_todo $ npm init -y $ npm install –save react react-dom redux react-redux $ npm install –save-dev babel-core babel-loader babel-preset-es2015 babel-preset-react webpack webpack-dev-server [/bash] packege.jsonを調整 変更前 [bash] “scripts”: { “test”: “echo \”Error: no test specified\” && exit 1″ }, [/bash] 変更後(2行追記) [bash] “scripts”: { “test”: “echo \”Error: no test specified\” && exit 1″, “start”: “webpack-dev-server –content-base dist/ –hot –inline –progress –colors”, “build”: “webpack –progress –colors” }, [/bash] webpack.config.jsを作成 [bash] $ nano webpack.config.js [/bash] [bash] var path = require(‘path’); var webpack = require(‘webpack’); module.exports = { entry: { main: ‘./index.js’, }, output: { path: path.join(__dirname, ‘dist’), filename: “[name].bundle.js” }, module: { loaders: [ { test: /\.js[x]?$/, loader: ‘babel-loader’, exclude: /node_modules/, query: { presets: [‘es2015’, ‘react’] } } ] }, resolve: { extensions: [‘.js’, ‘.jsx’] }, devServer: { inline: true, hot: true } } [/bash] distフォルダ準備 [bash] $ mkdir dist [/bash] Todoアプリのトップレベルのファイルを作成(index.js) トップレベル(Entry Point)のファイルであるindex.jsを作成します。 [bash] $ nano index.js [/bash] [bash] import React from “react” import {render} from “react-dom” import {createStore} from “redux” import {Provider} from “react-redux” import todoApp from “./reducers” import App from “./components/App” document.write(“ “); let store = createStore(todoApp) render ( , document.getElementById(“root”) ) [/bash] ひたすら redux本家のTodoに記載されたファイルをコピーして作る redux本家のこのページを見ながら 最終目標であるこのイメージに合うようにファイルを作って中身をコピーしてきます。 全ファイルをマージしてコンパイル これしなくても大丈夫です。コンパイル結果を知りたいときは、やってみてください。 [bash] $ ./node_modules/.bin/webpack [/bash] 起動確認 [bash] $ npm start [/bash] ブラウザーで http://localhost:8080/webpack-dev-server/main.bundle にアクセスして、下のような画面が出てきたらOK。 ※追記 上記URLではうまく表示できなくなる場合があります。package.jsonで指定したcontent-baseが 効かないケースがあるみたい(原因不明) その場合は、以下のURLにアクセス。 http://localhost:8080/webpack-dev-server/dist/main.bundle redux学習方法 とにかく目を皿のようにして、ひたすらサンプルソースを追いかける。 追いかける 追いかける 追いかける(笑) このページの解説(reactとreduxを使ったExampleのソースコードリーディング:todos編) なかなか良く出来ているので参照したらいいです。 補足 ソースコードをいじったら、自動で更新されるようになります。便利。。。 webpack.config.js で指定した dist パスへコンパイル後のファイルが出来ませんが メモリ上で展開されて動くらしいです。 どんなファイルが作られているか確認したい場合は、以下のコマンドで、dist/main.bundle.jsが出来ます。 [bash] $ ./node_modules/.bin/webpack [/bash] 実運用を想定してindex.htmlを作成 実運用ではエントリーポイントとなるHTMLが必要なので、distフォルダにindex.htmlを作成します。 [bash] Redux Todo [/bash] これで、 http://localhost:8080 で実運用の動作イメージの出来上がり。 感想とうか雑感というか Redux かなり難しいですよね。 Reactはほぼ分かったので、Reduxも楽勝だろうと思いきや・・・・ Redux本家のこのTodoサンプルを理解して、写経して、空で暗記してイチから作り上げれるようになるまで 3日ほど要しました。 Reduxおそるべし。 ってか、こんなの理解して、みんな開発してるのかな・・・ ReduxとReactの組み合わせ、かなり難しいような気がするなぁ・・・

    Read more
  • RailsとReactJSを用いてちょっとした掲示板を作ってみましょう vol.2
    RailsとReactJSを用いてちょっとした掲示板を作ってみましょう vol.2
    No Comments on RailsとReactJSを用いてちょっとした掲示板を作ってみましょう vol.2

    はじめに RailsとReactJSを用いてちょっとした掲示板を作ってみましょうというのが今回のコンセプト。 前回のVol.1は掲示板一覧を表示することだけで終わってしまいましたが、今回は本格的な 掲示板機能を実装してみます。多分長くなると思いますので、よろしくお付き合いください。 前回に引き続き、これから何回かにわたり連載する内容はGitHubの下記のURLで公開しています。 https://github.com/h-mito/rails_with_react ステートの管理やら、イベントの引き渡し方がいまいちわからないという方は、 Railsとは関係ない ToDoListの記事 を参照してみてください。 完成イメージ こんな感じのものができればいいなという理想型です。 これをパーツ(ReactJSのクラス)に分解してみるとこんな感じになると思います。 いざ開始 Reactコンポーネントファイルの作成 app/assets/javascripts/components/board_and_commen.js.jsx ファイルを作成します。 rails g でやってもいいのですが、どうせ全部消しちゃうので手で作りましょう。 では、ファイルには以下のような感じで最上層部のクラスとなる BoardAndCommentクラスを定義しましょう。 [bash] class BoardAndComment extends React.Component{ constructor(props){ super(props); } render(){ return ( 空っぽ。 ); } } [/bash] Viewファイルの作成と、コントローラー・routes調整 app/views/boards/bandc.html.erb にViewファイルを作ります。 中身は [bash] [/bash] コントローラーにメソッドを追加します。 app/controllers/boards_controller.rb [bash] class BoardsController < ApplicationController def index @boards = Board.all end def bandc @boards = Board.all end end [/bash] routes.rbに1行ルートを追記します。 config/routes.rb [bash] get 'boards/bandc' [/bash] 動作確認 [bash] $ rails s [/bash] ブラウザーで http://localhost:3000/boards/bandc こんな感じのものが表示されれば成功です。 2階層目となる3つのクラスを定義して、トップレベル(1階層目)のrenderメソッドで 2階層目をレンダーする ここでは2階層目となる3つのクラスを定義します。 3つのクラスは先ほどと同じように単純に固定文字を出力するだけです。 [bash] class BoardAndComment extends React.Component{ constructor(props){ super(props); } render(){ return ( ); } } class BoardList2 extends React.Component{ constructor(props){ super(props); } render(){ return ( 掲示板一覧を表示する場所です。 ); } } class CommentAdd extends React.Component{ constructor(props){ super(props); } render(){ return ( 掲示板に投稿を追加する機能を表示する場所です。 ); } } class CommentList extends React.Component{ constructor(props){ super(props); } render(){ return ( 掲示板内の投稿一覧を表示する場所です。 ); } } [/bash] CSSの調整 app/assets/stylesheets/boards.scss に以下を追記。 [bash] div.left-side{ float: left; width: 400px; } div.right-side{ float: left; width: 600px; } [/bash] 動作確認 [bash] $ rails s [/bash] ブラウザーで http://localhost:3000/boards/bandc こんな感じのものが表示されれば成功です。 ステートで管理するものを考える では掲示板に投稿する機能全体でステートとして管理しなきゃならないものは何でしょうか? 変化しそうなものに掲示板一覧・投稿文字を入力するエリアに入力された文字、投稿ユーザー、投稿一覧 の4つほどが考えられます。 今回の最終目標は選択した掲示板に投稿が追加できる というものなので、 掲示板一覧は 最初に読み込んだ値から不変ですので、ステートとして管理する必要はなし。 投稿文字に関しては、毎度毎度違う文字が入力されるので管理する必要あり。 投稿ユーザーは普通の掲示板であればログインした人のIDを用いるので、変化しませんが・・ ログイン処理を設けない、今回の掲示板では投稿の際にユーザーIDをSelectボックスで選択することにします。 つまり変化するので管理する必要ありです。 投稿対象の掲示板も変化するので管理する必要ありです。 投稿一覧も管理する必要があります。 ちょっと難しいかもですね。これ、慣れですので、だんだんわかってくると思います。 つまりこれだけの機能はあるけど、ReactJSで管理するステートは 投稿する文字 と 投稿するユーザー と投稿対象の掲示板 と投稿一覧の4つだけということになります。 で、どこで管理するかというとトップレベルのクラスであるBoardAndCommentクラスです。 board_title と board_descriptionについては、それほど重要なステートではないので、 今のところは無視しておいてください。 BoardAndCommentクラスにこのステート管理部分を追記してみましょう。 コンストラクター(constructor)で値を初期化して、投稿文字が変化した時にステートを 変化させるメソッド(handleCommentChange)を定義して、 レンダーメソッドで、CommentAddクラスをレンダーする際に CommentAddクラス内で起こるイベントを自分のクラスで処理できるように記述を追加します。 投稿ユーザーが変化した時にステートを 変化させるメソッド(handleUserChange)を定義して、 レンダーメソッドで、CommentAddクラスをレンダーする際に CommentAddクラス内で起こるイベントを自分のクラスで処理できるように記述を追加します。 残りの2つもおいおい説明します。 [bash] class BoardAndComment extends React.Component{ constructor(props){ super(props); this.state = {comment: ”, user_id: 1, board_id: -1, comments: [], board_title: ”, board_description: ”}; } handleCommentChange(cm){ this.setState({comment: cm}); } handleUserChange(id){ alert(id); } handleBoardSelect(id){ alert(id); } render(){ return ( this.handleBoardSelect(id)} /> this.handleUserChange(uid)} onCommentChange={(cm) => this.handleCommentChange(cm)} /> ); } } [/bash] 掲示板一覧を実装する これは前回やった内容とほぼ同じですので、ソースだけ提示して、 変化しているごく僅かな部分だけ説明します。 Viewの調整 [bash] [/bash] まずはトップレベルのBoardAndCommentクラスの変化箇所。 renderメソッド内で BoardList2をレンダーしている部分で datasアトリビュートに this.props.datas を渡しています。 [bash] class BoardAndComment extends React.Component{ constructor(props){ super(props); this.state = {comment: ”}; } handleCommentChange(cm){ this.setState({comment: cm}); } render(){ return ( this.handleCommentChange(cm)} /> ); } } [/bash] 次に2階層目のBoardList2クラス。renderメソッドで BoardList2クラスをレンダーする際に BoardList2クラス内で起こるであろう掲示板選択のイベント(onBoardSelect)を自分の クラスのメソッド内で処理させている。 もうひとつは、その処理も自分ではハンドリングしようがないので、もう1階層上のクラスに 任せている(handleBoardSelect) [bash] class BoardList2 extends React.Component{ constructor(props){ super(props); } handleBoardSelect(id){ this.props.onBoardSelect(id); } render(){ var lists =…

    Read more
  • RailsとReactJSを用いてちょっとした掲示板を作ってみましょう vol.1
    RailsとReactJSを用いてちょっとした掲示板を作ってみましょう vol.1
    No Comments on RailsとReactJSを用いてちょっとした掲示板を作ってみましょう vol.1

    はじめに RailsとReactJSを用いてちょっとした掲示板を作ってみましょうというのが今回のコンセプト 前回に引き続き、これから何回かにわたり連載する内容はGitHubの下記のURLで公開しています。 https://github.com/h-mito/rails_with_react モデルの作成、データベースにテーブル作成 掲示板(board)、投稿ユーザー(user)、投稿(comment)の3つのテーブルを作ります。 カラムは以下のような感じです。 rails g model でモデルとマイグレーションファイルを作成します。 [bash] $ rails g model board title:string description:text $ rails g model user name:string sex:integer age:integer $ rails g model comment board_id:integer user_id:integer comment:text [/bash] データベース作成 [bash] $ rake db:migrate [/bash] 出来上がったイメージはこんな感じ。 Seedデータの作成 何もないところからデータ投稿までつくり上げるのには時間がかかるので、シード(seed)データを 作っておいて、まずはそのデータを読んで、一覧表示することぐらいから始めましょう。 掲示板テーブルのCSVデータ [bash] $ nano db/csv/boards.csv [/bash] [bash] 1,ReactJSを学ぼう,あいうえお 2,ReactJS と Rails連携,かきくけこ 3,ReactJS 発展編,さしすせそ 4,jQuery入門,たちつてと 5,jQuery得意な人集まれ,なにぬねの 6,AngularJS入門,はひふへほ 7,vue.jsってなんぞ,まみむめも [/bash] 投稿ユーザーテーブルのCSVデータ [bash] $ nano db/csv/users.csv [/bash] [bash] 1,花子,2,23 2,太郎,1,30 3,幸次郎,1,15 4,浩輝,1,40 5,大樹,1,35 6,すず,2,28 7,雅代,2,38 [/bash] Seedデータをデータベースに反映するスクリプト seeds.rbを編集 [bash] $ nano db/seeds.rb [/bash] [bash] require ‘csv’ CSV.foreach(‘db/csv/boards.csv’) do |row| Board.create!(id: row[0], title: row[1], description: row[2]) end CSV.foreach(‘db/csv/users.csv’) do |row| User.create!(id: row[0], name: row[1], sex: row[2], age: row[3]) end [/bash] Seedデータの投入 [bash] $ rake db:seed [/bash] 掲示板一覧を表示するページをつくてみる ここからが本題。サンプルデータが入った掲示板を一覧表示する処理を記述していきましょう。 コントローラー作成 [bash] $ rails g controller boards index [/bash] 出来上がったコントローラーに掲示板一覧を読み込む行を追記する。 [bash] class BoardsController < ApplicationController def index @boards = Board.all end end [/bash] 一覧画面を表示することをイメージする 掲示板一覧とはどんな画面でしょうか・・・?? ReactJSでは出来上がりのイメージを頭の中で作って、 そのイメージにあうクラス群を作っていきます。 イメージはこんな感じ。 掲示板一覧全体を表す BoardListクラス 掲示板一行を表す BoardLineクラス Reactコンポーネント作成 じゃあ、クラスは決まったので、実装していきましょう。 [bash] $ rails g react:component BoardList [/bash] 以下のファイルが作成されます。 app/assets/javascripts/components/board_list.js.jsx ではこのファイルを編集していきましょう。 Railsで自動作成されるスクリプトはちょっと古い形式のものなので、 全部消しちゃいます。 [bash] class BoardList extends React.Component{ constructor(props){ super(props); } render(){ return ( 掲示板一覧 ここに一覧が表示される予定 ); } } [/bash] Viewファイルを編集します。 app/views/boards/index.html.erb [bash] [/bash] 動作確認 [bash] $ rails s [/bash] ブラウザーで http://localhost:3000/boards/index こんな感じのものが表示されれば成功です。 Railsで読み込んだデータをコンポーネントに渡して一覧表示する 先ほどの動作確認ではコントローラーでデータを読み込んだにもかかわらず、 そのデータを一切利用していませんでした。今回は読み込んだデータを使って 一覧表示をしてみます。 View Viewファイルを編集します。 app/views/boards/index.html.erb [bash] [/bash] BoardListコンポーネント調整 ここで何が起こっているかというと、 Viewのreact_component の2つ目の引数に コントローラーで読み込んだ 掲示板一覧データ(@boards)が設定されています。 datas : @boards となっているのは、 BoardListクラスでは datasプロパティに掲示板一覧データを セットするよとなっているのです。 ここでようやくデータが渡ってきたのでBoardListクラス内で 掲示板一覧を出力してみましょう。 lines という配列変数を定義し、Viewから渡された @boardsの内容を this.props.datasプロパティを介して読み込み、ループしながら DataLineコンポーネントを出力しています。 [bash] class BoardList extends React.Component{ constructor(props){ super(props); } render(){ var lines = []; var i; for (i = 0 ; i < this.props.datas.length ; i++){ var data = this.props.datas[i]; lines.push(); } return ( 掲示板一覧 {lines} ); } } [/bash] DataLineクラスを出力しましたが、肝心のDataLineクラスが無いので 作成していきます。 お作法的には別ファイルに記述するのが良いのかもしれませんが、 とりあえず、BoardListクラスと同じファイルに記述していきましょう。 [bash] class BoardLine extends React.Component{ constructor(props){ super(props); } render(){ return ( {this.props.data.id} {this.props.data.title} ); } } [/bash] ちょっと見栄えが悪いのでCSSも追加しておきましょう。 app/assets/stylesheets/boards.scss [bash] div.board-line{ .board-id{ display: inline-block; width: 50px; padding: 5px; } .board-title{ display: inline-block;...

    Read more
  • RailsでReactJSを使う〜準備編
    RailsでReactJSを使う〜準備編
    No Comments on RailsでReactJSを使う〜準備編

    RailsでReactJSを使ってみようという企画をスタートしてみます。 まずはRailsのプロジェクトを作って、ReactJSをインストールして、HelloWorldを出力するところまでの準備編です。 これから何回かにわたり連載する内容はGitHubの下記のURLで公開しています。 https://github.com/h-mito/rails_with_react Railsプロジェクト作成、ReactJSインストール [bash] $ cd $ cd workspace $ rails new rails_with_react $ cd rails_with_react $ nano Gemfile [/bash] 末尾に1行追加する [bash] # …省略 gem ‘react-rails’, ‘~> 1.0’ # 追加する [/bash] react-railsをインストールして、プロジェクトに組み込む [bash] $ bundle install $ rails g react:install [/bash] Reactコンポーネントの作成、Hello World作成 [bash] $ rails g react:component FirstTest [/bash] 以下のようなソースがapp/assets/javascripts/componentsに生成されると思います。 [bash] var FirstTest = React.createClass({ render: function() { return ; } }); [/bash] これでも問題ないのですが、ReactJS本家の Get Started風に以下のように書き換えます。 で、renderメソッドに Hello Worldの出力を追加します。 [bash] class FirstTest extends React.Component{ constructor(props){ super(props); } render(){ return ( Hello World! ); } } [/bash] テスト用コントローラー作成 [bash] $ rails g controller first index [/bash] Reactコンポーネントを出力 viewsに出来上がったビューに先ほど作ったReactコンポーネントを出力してみます。 [bash] First#index Find me in app/views/first/index.html.erb [/bash] 動作確認 [bash] $rails s [/bash] ブラウザーで 以下のURLへアクセスし、以下のような画像が出れば成功。 localhost:3000/first/index

    Read more
  • ReactJSことはじめ vol.2
    ReactJSことはじめ vol.2
    No Comments on ReactJSことはじめ vol.2

    では ReactJS 第2回目いってみましょう。 今回は下図のような感じが完成図です。 単純にToDoが一覧されており、ToDoの横には削除ボタンがあり。 ToDoを追加したい場合は上部のテキストボックスに文字を入力し 追加ボタンを押す。 たったこれだけです。 まぁこのたったこれだけが結構難しいんですけどね。 ではいってみましょう。 まずは初期値となる変数をこんな感じで用意します。 [bash] var DATAS = [ {id:1, content:”Softbank解約”}, {id:2, content:”R-SIM10購入”}, {id:3, content:”圏外病を克服するSIMフリールーターゲット”}, {id:4, content:”楽天モバイル申し込み”} ] [/bash] この変数がToDoリストの初期値です。 では次、画面イメージから、何個の独自クラスを定義しなきゃいけないか考えましょう。 簡単に言ってますが、これかなり重要なポイントです。 要はどんなが完成図があるから、どういうパーツを組み合わせて画面を作ろうか?? と考えるのです。そのパーツが classであり、その classが独自タグなんですね。 ToDoリストは至ってシンプル。 ToDoの一覧となるパーツ。これ⇓⇓⇓。 とToDoを追加するためのパーツ。これ⇓⇓⇓。 そしてToDoの一覧の一行を構成するパーツ。これ⇓⇓⇓。 パーツは決まりましたので、このパーツをクラスとして定義することにします。 まず最初のパーツ ToDo一覧を DataList。 次にToDoを追加するパーツを NewToDo。 ToDoの一行を構成するパーツを DataLine 最後にこれら全部を包含する ToDoList とします。 図で書くとこんな感じになります。 ではまずToDo一覧である DataListをクラスとして定義してみましょう。 [bash] class DataList extends React.Component{ constructor(props){ super(props); } handleOnDelete(id){ this.props.onDelete(id); } render() { var dlist = []; var i; for (i=0; i < this.props.datas.length; i++){ var data = this.props.datas[i]; dlist.push( this.handleOnDelete(id)}/>); } return ( {dlist} ); } } [/bash] なんのことか理解できますか? 普通難しいなぁと思いますよね。 クラス定義の説明は HelloWorldを出力する部分でやったので割愛します。 では 次のconstructor とは何でしょうか・・・ 要はクラスの初期化処理をここで行いますよ ということなのですが・・ 初期化ですることは特にないので、お決まりのおまじない super(props)だけを記述しておきます。 [bash] constructor(props){ super(props); } [/bash] 次の handleOnDelete これなんですが・・ 必要ですが、この説明は後回しにします。 [bash] handleOnDelete(id){ this.props.onDelete(id); } [/bash] 最後に renderメソッドです。 HelloWorldでもやったように、renderメソッドで、このクラスが出力する HTMLタグを構築するんです。 ToDoの一覧なんで、このクラスを作るときにToDoの一覧となるデータを引き渡してもらうことを想定します。 それが this.props.datas という変数で参照できます。 renderメソッドの中では、この変数をループで回して、 dlistという変数に pushしていってます。 pushする内容は、ToDoの1行を構成する DataLineタグ(オブジェクト)です。 そして renderメソッドがリターンする内容は <div>タグの中に上記の配列変数を組み込んだものになります。 [bash] render() { var dlist = []; var i; for (i=0; i < this.props.datas.length; i++){ var data = this.props.datas[i]; dlist.push( this.handleOnDelete(id)}/>); } return ( {dlist} ); } [/bash] 肝心なことを忘れていました。 3つのパーツを包含する一番大きなパーツが必要です。これをToDoListクラスとします。 ToDoListクラスのソースは以下のような感じになります。 [bash] class ToDoList extends React.Component{ constructor(props){ super(props); this.state = { datas: props.datas } } render(){ return ( ); } } [/bash] ToDoListクラスの renderメソッドでは、NewToDoタグとDataListタグを構築しているのが解ると思います。 そして DataListタグの datasアトリビュートに this.state.datas を渡しています。 this.state.datas とは何でしょうか? stateとはクラスが管理する動的な変数のようなものです。 ReactJSでは stateの値が変更されると、自動的にそのstateの値が指し示す HTMLを書き換える仕組み になっているのです。 で、実際にここでは this.state.datas に何が入っているかというと、最初の方で説明した ToDoリストの中身である DATAS変数が入ることになります。 これでは言葉足らずですね。 ToDoListクラスが全クラスのトップレベルのクラスであるので、 ReactDOM.render では ToDoListクラスを renderしてもらいます。 ソースで書くとこんな感じ。 [bash] ReactDOM.render( , document.getElementById(“root”) ); [/bash] で、これだけだと、ToDoListの初期値を渡せていないことになるので、 正しくは 以下のようになります。 要はクラス内で使いたいデータは アトリビュートで渡そうね。ということになります。 で、データとは動的に変化するものなので {} で括って渡そうねというルールになります。 [bash] var DATAS = [ {id:1, content:”Softbank解約”}, {id:2, content:”R-SIM10購入”}, {id:3, content:”圏外病を克服するSIMフリールーターゲット”}, {id:4, content:”楽天モバイル申し込み”} ] ReactDOM.render( , document.getElementById(“root”) ); [/bash] で、まだこれでも DataListクラスの this.props.datas に DATASの値が渡っていく仕組みが説明できていませんね。 DataListクラスは ToDoListクラスの子供です。つまり DataListクラスは ToDoListクラスのrenderメソッドで 作成され、その時にDataListクラスが扱う変数として datasアトリビュートに DATASを渡すことになります。 日本語で書くとややこしいですね。 つまりは、ToDoListクラスのrenderメソッドでは 以下のようなことが定義されていることになります。 [bash] class ToDoList extends React.Component{ constructor(props){ super(props); this.state = { datas: props.datas } } render(){ return ( ); } } [/bash] renderメソッドのアトリビュートで渡された変数は、 クラス内で props(プロパティ)として参照することが可能です。 ToDoListクラスは datasアトリビュートで渡された DATAS変数の中身を自身のクラスの stateとして管理しようとします。 これが constructorの中にある。 this.state = {datas: this.props.datas}; これで ToDoListクラス 内では this.state.datas で DATASの内容を参照できることになります。 やっとこれで DataListに DATASの値が渡ることが説明できましたかね・・・ では、次はDataListの renderメソッドでToDoの一行一行を構成するDataLineクラスを作っているところを 見てみましょう。 [bash] render() { var dlist = []; var i; for (i=0; i < this.props.datas.length; i++){ var data =...

    Read more
  • ReactJSことはじめ
    ReactJSことはじめ
    No Comments on ReactJSことはじめ

    ずっと前からはやっているなぁ、と思いつつ、やり過ごしていたReactJS。 ついに重い腰を上げて学習してみることにしました。 ただ、ネットで情報を漁っても、日本語で丁寧に解説しているサイトって少ないのですよね。 仕方なく本家の「Get Started」を読んで、「Tutorial」を読んで、大雑把に理解できたので、 これからReactJSを学び始める人の役に立てればいいなと思いつつ、これから何回かにわたり ReactJSの初歩(というかこれが全てか・・・)を連載していこうと思います。 まずはそもそもReactとは何をするものか・・・ というと、今の僕なりの解釈ですが、動的なコンテンツを表示する場合に・・・ 一般的なWebアプリだと、HTMLのBodyタグを大半普通のHTMLタグを使って記述し、 一部動的に変化する部分をテンプレート言語などを使って、動的な変数の内容を出力します。 Reactの場合、変化するものがあるのなら、その部分はHTML言語として記述せず・・・ 全部JavaScript(厳密にはBabelやJSX)で記述しちゃえばいいじゃん、というコンセプト。 なのでHTMLテンプレートに記述するのはごく普通のHTMLで、かつ、めっちゃ短い。 なぜ短いかというと、ReactJSでHTMLをほぼまるまるレンダリングするので・・・ レンダリングするためのきっかけとなるdivタグなどが1つだけあればOK。 日本語でごちゃごちゃ説明しても理解しがたいかもなので、何はともあれ、 「Hello World」を。 まずは雛形となるHTMLを作成。 [bash] [/bash] 雛形はこれだけでOK。 今後 どんどん複雑な処理をするにしても、HTMLに書くのは、基本これだけ。 ReactJSを使わなきゃなので、ReactJSに必要なJavaScript3つを、Headタグに挿入。 [bash]   〜 中略 〜   〜 中略 〜 [/bash] ここまででReactJSを行う準備ができたので、いざBabelScript(ReactJS)を記述していきましょう。 基本的にReactJSを記述するのはBodyタグ内です。Bodyタグ内に Scriptタグを作り、そこに記述していきます。 [bash] [/bash] 結果は Hello World! 以上。 「Hello World」を出すだけで、どんだけめんどくさいんだよとお思いになるかもしれませんが、 我慢してください。これだけは最低のルールです。 まずはScriptタグでこれからReactJSを書きますよーと目印をつけます。 そして 「root」というIDを持ったタグに HelloWorldクラスをレンダリングしてねとおねがいします。 その部分が [bash] ReactDOM.render( , document.getElementById(“root”) ); [/bash] ここで疑問が出てくると思います。HelloWorldタグってなんぞね??? そんなタグ HTMLにはありませんよね。 じゃあなにかというと、要はReactJSは独自のタグをScriptで作っていこうというコンセプトなのです。 聞いたことのない独自のタグ名を class 名として、クラスを作ります。 そのクラスの継承元は固定で React.Componentです。 よくわからないかもしれませんが、おまじないで、 [bash] class 自分が作りたいタグ名 extends React.Component [/bash] と書くと覚えてください。 じゃあ、実際に作ったタグ名がどんなHTMLをレンダリングするかというのを決めるのが、 自作のタグ名のクラス(ここではHelloWorldクラス)の renderメソッドなのです。 [bash] render(){ return ( Hello World! ); } [/bash] renderメソッド内では、HTMLライクなタグを戻り値として戻します。 ここでは、 <h2>タグですね。 メソッドの戻り値というと普通は変数を連想するものですが・・・ ReactJSの場合はこのタグのようなもの を戻すのがルールです。 「タグのようなもの」というのが味噌で、これがタグではなく ReactJSのオブジェクトというもののようです。 (正確には間違っているかもしれません・・・) たんに <h2>Hello World!</h2> と出力するのにどんだけ記述しなきゃならないんだよと お思いかと思いますが・・・これは最低限のルールですので我慢してください。 これだけじゃあまりにつまらないので、動的に変化するものも入れてみましょう。 [bash] class HelloWorld extends React.Component{ render(){ var dt = new Date(); var hms = dt.getHours() + “:” + dt.getMinutes() + “.” + dt.getSeconds(); return ( Hello World!{hms} ); } } [/bash] こうすると出力結果はブラウザーをリフレッシュするたびに変化させることができます。 結果はこんな感じ。 Hello World!19:20.33 とりあえず、初回はここまで。 覚えておかなきゃならないことは 独自のタグ名を作り、それをクラスとして定義し、 クラス内に renderメソッドを定義して、そこに出力したいHTMLライクなものを記述する。 最後に ReactDOM.render で、HTML上の固定のエレメント内に renderで出力する。 わかりにくいかもしれませんが、ざっとこんな感じです。 次回は TODOリストを作ってみましょう。

    Read more

Back to Top