Category: ‘React.js’

Phoenix – React 連携

2019年12月2日 Posted by PURGE

Phoenix Project 作成

$ mix phx.new ProjectName --app project_name --no-ecto

npm モジュールインストール

$ cd ProjectName/assets/node_modules/
$ npm install --save @babel/preset-react
$ npm install --save @babel/polyfill
$ npm install --save react react-dom redux react-redux
$ npm install --save react-router-dom
$ npm install --save connected-react-router history
$ npm install --save redux-thunk
$ npm install --save axios
$ npm install --save redux-form react-hook-form
$ npm install --save react-bootstrap
$ npm install --save history
$ npm install redux-saga --save

.babelrc 設定

assets/.babelrc
{
"presets": [
"@babel/preset-env",
"@babel/react"
]
}

エントリポイント(index.js)の変更

$mv assets/js/app.js assets/js/index.js
index.js

import React from 'react';
import ReactDOM from 'react-dom';

ReactDOM.render(
<div>
Hello React!!
</div>,
document.getElementById('root')
);

webpack.config.js

entry: {
'./js/index.js': glob.sync('./vendor/**/*.js').concat(['./js/index.js'])
},
output: {
filename: 'index.js',
path: path.resolve(__dirname, '../priv/static/js')
},

index.eex の変更

lib/project_name_web/templates/page/index.eex

<section class="row">
<article class="column">
<div id="root"></div>
</article>
</section>

index.jsパスの変更

lib/project_name_web/templates/layout/app.eex

<script type="text/javascript" src="<%= Routes.static_path(@conn, "/js/index.js") %>"></script>

brunchでJSXコンパイルエラー

2018年3月9日 Posted by PURGE

Phoenixで、Reactを使用しようとしていて、BrunchでJSXのコンパイルエラーが発生。

error: Compiling of js/app.js failed. L29:12 Unexpected token 
     27 |     render(){
     28 |         return(
   > 29 |             <div className="App">
        |             ^
     30 |                 <div className="App-header">
     31 |                     <h2>Dash Board</h2>
     32 |                 </div>

Brunchの設定ファイルである、brunch-config.js に下記を追記したら動いた。

  // Configure your plugins
  plugins: {
    babel: {
      // Do not use ES6 compiler in vendor code
      presets: ["es2015", "react"],
      ignore: [/vendor/]
    }
  },

なかなかどうして。

React 事始め

2016年12月12日 Posted by PURGE

JavaScriptのフレームワークとして、Angularを利用していたが、Reactも気になったのでサンプル。
ライブラリは、CDNを使用するが、下記の記述で動作する。

babel等のバージョン違い等によって動作しなくなるので悩ましい。

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <script src="https://unpkg.com/react@15/dist/react.min.js"></script>
    <script src="https://unpkg.com/react-dom@15/dist/react-dom.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/babel-core/5.8.38/browser.min.js"></script>

    <title>React Sample</title>
</head>
<body>
<div id="root">
    <!-- This div's content will be managed by React. -->
</div>

<script type="text/babel">
    ReactDOM.render(
            <h1>こんにちは。たぢさん。</h1>,
        document.getElementById('root')
    );
</script>

</body>
</html>

JSファイルを外出しにする場合は、下記の様に変更する。

<script type="text/babel" src="js/common.js"></script>

また、自作のコンポーネントを作成して表示する。

//コンポーネントのレンダリング
var MyDiv = React.createClass({
    displayName : '表示されるかな?',
    render: function(){
        return (
            <p>わたしはどこへ?</p>
        );
    }
});
ReactDOM.render(
    <MyDiv></MyDiv>,
    document.getElementById('mydiv')
);

HTMLの記述は下記。

<div id="mydiv"></div>

次に、コンポーネントへパラメータを渡してみる。


var MyDiv2 = React.createClass({
    displayName: 'パラメータ渡し',
    render: function () {
        return(
            <p>パラメータは<span style={{color:'red'}}>{this.props.param}</span>です。</p>
        );
    }
});

ReactDOM.render(
    <MyDiv2 param="引数"></MyDiv2>,
    document.getElementById('mydiv2')
);

HTMLの記述は下記。

<div id="mydiv2"></div>

スクリーンショット 2016-12-12 13.13.11

続いて、イベントを発生させてみる。

var MyButton = React.createClass({
    displayName: 'アラート',
    clickHandler: function () {
        alert('クリックされました。');
    },
    render: function () {
        return(
            <input type="button" value="クリック" onClick={this.clickHandler}/>
        );
    }
});
ReactDOM.render(
    <MyButton></MyButton>,
    document.getElementById('mybtn')
);

HTMLの記述は下記。

<div id="mybtn"></div>

さらに、SELCTボックスの値を変更した場合の挙動を試してみる。
ミソは、getInitialState と this.setState である。

var MySelect = React.createClass({
    selValue: '',
    displayName: 'セレクタ',
    //State初期化
    getInitialState: function () {
        return {val: ''};
    },
    selectChangeHandler: function (event) {
        this.selValue = event.target.value;
        //State更新
        this.setState({
            val: this.selValue
        });
    },
    render: function () {
        return(
            <div>
                <div>
                    <select onChange={this.selectChangeHandler}>
                        <option value='1'>Java</option>
                        <option value='2'>Ruby</option>
                        <option value='3'>Python</option>
                        <option value='4'>JavaScript</option>
                        <option value='5'>C#</option>
                    </select>
                </div>
                <p>VALUE: {this.state.val}</p>
            </div>
        );
    }
});
ReactDOM.render(
    <MySelect></MySelect>,
    document.getElementById('myselect')
);

HTMLの記述は下記。

<div id="myselect"></div>