Category: ‘JavaScript’

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>

select プルダウンの書き換え

2019年2月18日 Posted by PURGE

3年に1度は必ず実装する必要がある技術。
覚え書きです。

<html>
<head>
<title>JS</title>
    <script
        src="https://code.jquery.com/jquery-3.3.1.min.js" integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8=" crossorigin="anonymous">
    </script>
</head>
<body>

<select name="item" id="item">
    <option value="">りんご</option>
    <option value="">イチゴ</option>
    <option value="">バナナ</option>
</select>

<script>
    $(function(){
        $('#item').change(function(){
            $.ajax({	
        		url:"/data.json",
        		type:"POST",
                data:$("#form1").serialize(),
		        dataType:"json",
		        timespan:1000
    		}).done(function(data1,textStatus,jqXHR) {
				console.log(jqXHR.status);
				console.log(textStatus);

                console.log(data1);
                console.log(data1["data"][0].name);
				
                var data2 = JSON.stringify(data1);
				console.log(data2); 
				
                var data3 = JSON.parse(data2);
				console.log(data3);

                $("#item option").remove();
                $("#item").append("<option></option>");
                $.each(data3["data"], function(key, value){
                    console.log(key + ':' + value);
                    $("#item").append($("<option>").val(value.id).text(value.name));
                });
            }).fail(function(jqXHR, textStatus, errorThrown ) {
                console.log(jqXHR.status);
                console.log(textStatus);
                console.log(errorThrown);
                console.log('Failed');
            }).always(function(){
                console.log("complete");
            });
        });
    });
</script>
</body>
</html>
{"data" : [
    {
        "id" : "1",
        "name" : "太郎",
        "age" : "12"
    },
    {
        "id" : "2",
        "name" : "花子",
        "age" : "14"
    },
    {
        "id" : "3",
        "name" : "金太郎",
        "age" : "32"
    },
    {
        "id" : "4",
        "name" : "桃太郎",
        "age" : "47"
    },
    {
        "id" : "5",
        "name" : "赤太郎",
        "age" : "23"
    }
]}

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>

JavaScriptで、substrとsubstring

2016年12月6日 Posted by PURGE

超久しぶりで、JavaScript の文法おさらい。

var str = "こんにちは。たぢさん。";
console.log(str.length);
console.log(str.substr(6,4));       //文字数指定
// => たぢさん
console.log(str.substring(6,10));    //文字位置指定
// => たぢさん

D3でネットワーク図やマップ描画の覚え書き

2015年9月11日 Posted by PURGE

ネットワーク図描画

<html>
<head>
<title>取引ネットワーク図</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.6/d3.min.js" charset="utf-8"></script>
<style>
  svg{width: 640px; height: 640px; border: 1px solid black; background-color: #fff;}
  .forceLine{stroke:blue; stroke-width:2;}
</style>

</head>
<body>
  <h2>取引ネットワーク図</h2>
  <svg id="myNetwork"></svg>
  <script src="js/network.js"></script>
</body>
</html>
var dataSet = {nodes : [{name : "Apple"}, {name : "Orange"}, {name : "Banana"}, {name : "Melon"},],
                        links : [{ source : 0, target : 1}, {source : 1, target : 0}, {source : 2, target : 0},{source : 3, target : 0}]
                      }

var force = d3.layout.force()
    .nodes(dataSet.nodes)
    .links(dataSet.links)
    .size([320, 320])
    .linkDistance(100)
    .linkStrength(5)
    .gravity(0.0001)
    .start()

var link = d3.select("#myNetwork")
  .selectAll("line")
  .data(dataSet.links)
  .enter()
  .append("line")
  .attr("class", "forceLine" )

var node = d3.select("#myNetwork")
  .selectAll("circle")
  .data(dataSet.nodes)
  .enter()
  .append("circle")
  .attr("r", 10 )
  .call(force.drag)

force.on("tick", function(){
  link
  .attr("x1", function(d) { return d.source.x;})
  .attr("y1", function(d) { return d.source.y;})
  .attr("x2", function(d) { return d.target.x;})
  .attr("y2", function(d) { return d.target.y;})
  node
  .attr("cx", function(d) { return d.x;})
  .attr("cy", function(d) { return d.y;})
})

地図描画

<html>
<head>
<title>群馬県</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.6/d3.min.js" charset="utf-8"></script>
<script src="http://d3js.org/d3.geo.projection.v0.min.js" charset="utf-8"></script>
<style>
  svg{width: 640px; height: 640px; border: 1px solid black; background-color: #fff;}
</style>
</head>
<body>
  <h2>群馬県</h2>
  <svg id="myMap"></svg>
  <script src="js/map.js"></script>
</body>
</html>
var svgWidth = 640;
var svgHeight = 640;
var path = d3.geo.path()
                .projection(d3.geo.mercator()
                                          .center([138.700, 36.5000])
                                          .scale(24000)
                                          .translate([200,300])
                                        )
                                        d3.json("js/Gumma.json",
                                                    function(error, pref) {
                                                      d3.select("#myMap")
                                                          .selectAll("path")
                                                          .data(pref.features)
                                                          .enter()
                                                          .append("path")
                                                          .attr("d", path)
                                                          .style("fill", "#cceeee")
                                                    })

Backbone.js 事始め

2014年9月16日 Posted by PURGE

Backbone.js を始めてみた。そのHTMLテンプレートの覚え書き。

<!DOCTYPE html>
<html lang="ja">
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

	<title>Hello Backbone.js</title>
	<script type="text/javascript" src="https://code.jquery.com/jquery-2.1.1.min.js"></script>
	<script type="text/javascript" src="http://underscorejs.org/underscore-min.js"></script>
	<script type="text/javascript" src="http://backbonejs.org/backbone-min.js"></script>
	<script type="text/javascript">
	(function() {
		//Model作成
		var Animal = Backbone.Model.extend({
			//Attribute(属性)
			defaults: {
				species: "Animal",
				name: "None"
			},
			//コンストラクタ
			// constructor: function(){
			// 	console.log("初期化処理");
			// },
			//メソッド
			call: function(){
				console.log("動物 : " + this.get("species"));
				console.log("私の名前は" + this.get("name") + "です。");
			}
		});
		//Animalのインスタンス化	
		var none = new Animal();

		//Animal(犬)のインスタンス化	
		var dog = new Animal({
			species: "犬",
			name: "ポチ"
		});

		//Animal(猫)のインスタンス化	
		var cat = new Animal({
			species: "猫",
			name: "タマ"
		});


		//console.log(dog);
		//console.log(cat);
		//console.log(dog.toJSON());
		none.call();
		dog.call();
		cat.call();
	})();
	</script>
</head>
<body>
	<h3>Backbone.js</h3>
</body>
</html>
  1. コンストラクタを定義した場合、callメソッド内で、属性を取得しようとthis.get(“name”)するとエラーとなる。
  2. dog.toJSON()をコールするとエラーとなる。メソッドfunctionまでは、JSON化できないからかな?

別の機会に検証しようと思う。

D3.js でSVG領域を描くその2

2014年6月28日 Posted by PURGE

<html>
<head>
<title>D3.js</title>
</head>
<body>
<script src="http://d3js.org/d3.v3.min.js" charset="utf-8"></script>
<script type="text/javascript">
	var dataset = [25, 30, 19, 33, 18];

	var h = 300;
	var w = 400;
	var svg = d3.select("body")
				.append("svg")
				.attr({width:w, height:h})
				.style("background-color","lightgray");

	svg.selectAll("circle")
		.data(dataset)
		.enter()
		.append("circle")
		.attr({
			cx: function(d,i){return (60 + (i * 60));},
			cy: h/2,
			r:  function(d,i){return d;},
			fill:"blue"
		});
</script>
</body>
</html>

SVG

D3.js でSVG領域を描くその1

2014年6月28日 Posted by PURGE

少しずつ覚え書き。

<html>
<head>
<title>D3.js</title>
</head>
<body>

<script src="http://d3js.org/d3.v3.min.js" charset="utf-8"></script>
<script type="text/javascript">

	var svg = d3.select("body")
				.append("svg")
				.attr({width:"300px", height:"200px"})
				.style("background-color","lightgray");
</script>
</body>
</html>

D3.js 事始め

2014年6月28日 Posted by PURGE

D3.jsには、以前から興味があったのでちょっと触ってみる。
これからも新たな勉強です。

<html>
<head>
<title>D3.js</title>
</head>
<body>


<p>こんにちは。D3は楽しそうですね。</p>

<div>Hello Whoocus!!</div>
<div>Welcome to Whoocus!!</div>
<div>Welcome to Whoocus!!</div>
<div>Welcome to Whoocus!!</div>

<script src="http://d3js.org/d3.v3.min.js" charset="utf-8"></script>
<script type="text/javascript">
	var dataset = [22, 45, 54, 12];

	d3.select("body").selectAll("div").text("こんにちは。Whoocus!!");

	var p = d3.select("body").select("p");
	var devs = d3.select("body").selectAll("div");
	//p.style("font-size","60px");
	p.style({"font-size" : "60px",
			 "color" : "red"	
			})

	devs.data(dataset).text(function(value,index){
		return "Index:" + index + " Value:" + value;
	});

</script>
</body>
</html>