ラベル JavaScripts の投稿を表示しています。 すべての投稿を表示
ラベル JavaScripts の投稿を表示しています。 すべての投稿を表示

2021年8月25日水曜日

React:React

1.Reactとは 

JavaScript フロントエンドフレームワーク

アプリケーションで各状態に対するシンプルな設計をすることで、React はデータが変更された時に、適切なコンポーネントだけを効率的に更新してレンダリングすることができる

自身の状態を管理するカプセル化されたコンポーネントを構築することで、それらのコンポーネントを呼び出し複雑なUI もコンポーネント呼び出しで作成できる


2.Reduxとは

Fluxアーキテクチャの一種

2.1.構成用要素

2.1.1.Reduce

状態を変化させる関数

引数

store        今の状態を示すオブジェクト

action        どんな動作を行ったかを示すオブジェクト


ES2015仕様:Spread Operator

const hoge = [23];
console.log(1, ...hoge, 4.5);

// 実行結果 [1,2,3,4,5]


const fuga = { name: 'Taro', age: 25 };
const piyo = { name: 'Jiro', location: 'Tokyo' };
console.log({ ...fuga, ...piyo });

// プロパティがかぶる場合、後のものが優先する
// 実行結果 {name: 'Jiro',age: 25 ,location: 'Tokyo' }


const myFunc = (x, y, z) => [x, y, z];
const age = [012];
mfFunc(...age);

// 実行結果 [0,1,2]


注意点

値渡が基本 オブジェクトや配列は参照渡しとなるため、Object.assignを用いる

onst target = { a: 1, b: 2}
const source = { b: 3, d: 4}

const returnedTarget = Object.assign(target, source);

console.log(target);
console.log(source);
console.log(returnedTarget);

// $ node test.js
// { a: 1, b: 3, d: 4 }
// { b: 3, d: 4 }
// { a: 1, b: 3, d: 4 }


let user = {
    username: "John",
};

let user_id = {
    id: 1,
};

let email = {
    email: "john@example.com",
};

user = Object.assign(user, user_id, email);

console.log(user);

  //結果
  //{ username: 'John', id: 1, email: 'john@example.com' }


Object.assignを使った例(form)

const form = {
    firstName: null,
    lastName: null,
    Email: null,
    zipCode: null,
    Address: null,
    Phone: null
}

const input = {
    firstName: 'John',
    lastName: 'Doe',
    Email: 'john@example.com'
}

Object.assign(form, input)

console.log(form)

// $ node test.js
//  {
//  firstName: 'John',
//  lastName: 'Doe',
//  Email: 'john@example.com',
//  zipCode: null,
//  Address: null,
//  Phone: null
// }


2021年8月22日日曜日

JS:Babel

1.Babelとは

Babel(読み方:「バベル」)は、次の世代のJavaScriptの標準機能をブラウザのサポートを待たずに使えるようにするNode.js製のツールである。次の世代の標準機能を使って書かれたコードを、それらの機能をサポートしないブラウザでも動くコードに変換する。

JavaScriptのコードを新しい書き方から古い書き方に変換するツールである。
具体的には、JavaScriptの言語仕様であるES2015以上の仕様のJavaScriptで記述すると、古いブラウザでは動作しない。そこで、Babelを使ってES2015・ES2016といった仕様で記述したJavaScriptファイルを互換性のあるEXMAScript5に変換する。

主に、es2015以降の新しい構文をes5の構文に変換するのに利用されています。もちろん、設定によってはes2018→es2015といった記述方法も可能です。その他にも、ReactのJSXやTypeScriptの変換にも使われます。

2.インストール

package.jsonがある場所で以下のコマンドを実行する。babel-cliはbabelをcliで実行するための本体モジュールで、babel-preset-envはES6の内容をES5に変換する情報のようなもの。

npmで三つのパッケージをインストールします。

$ npm install @babel/core @babel/cli @babel/preset-env --save-dev

@babel/core: Babel本体

@babel/cli: コマンドライン操作用

@babel/preset-env: 変換内容設定用


3..babelrcによる設定

Babelはそのままでは何も変換してはくれないので、どのように変換するのかを事前に設定します。作業フォルダのルートに.babelrcを作成し、JSON形式で設定情報を追記していきます。

{

  "presets": ["@babel/preset-env"]

}


4.プリセット(Presets)の基本

プリセットは、Babelが変換処理を行う際に利用するプラグインのコレクションです。設定情報を基に、コンパイルに必要なプラグインのリストをBabel本体に渡す役割をしているそうです。公式では下記4つのプリセットが用意されています。その他にもいろいろ開発されています。

  • @babel/preset-env: ECMAScript用
  • @babel/preset-flow: Flow用
  • @babel/preset-react: React用
  • @babel/preset-typescript: Typescript用


利用したいプリセットをインストールした後、配列で名前を指定します。後ろから順に適用されます。下記のケースでは、typescript → react → env の順で実行されます。

{

  "presets": ["@babel/preset-env", "@babel/preset-react", "@babel/preset-typescript"]

}

各プリセットにて詳細な設定をしたい場合は、配列で囲みます。0番目に名前、1番目に設定情報です。

{

  "presets": [

    ["@babel/preset-env", {<@babel/preset-envの設定値>}],

    "@babel/preset-react",

    "@babel/preset-typescript"

  ]

}


4.1.@babel/preset-env

@babel/preset-envは、出力したいECMAScriptのバージョンを指定するためのプリセットです。基本的には、サポートしたい範囲(ブラウザバージョンやブラウザシェア、サポートの可否など)を指定します。指定内容に応じて適切なバージョンのJSに変換されるようにしてくれます。特に何も指定しない場合は、一律es5の構文に変換されます。

下記の設定は、Chrome40以上・iOS10以上をサポート対象とした場合です。es5で出力されました。


{

  "presets": [

    ["@babel/preset-env", {

        "targets": [

          "chrome 40",

          "iOS 10"

        ]

      }

    ]

  ]

}

cover 80% in JPは、ブラウザシェア率を基に日本で80%のユーザをカバーするという指定です。es5で出力されました。モダンブラウザの新しいバージョンを指定すると、es2015以降のバージョンで出力されます。


4.2.PolyfillとuseBuiltInsオプション

初期設定では、@babel/preset-envが行うのは構文の変換のみです。Promiseやgeneratorなど、新たに追加された機能の変換には対応していません。オプションで、useBuiltInsにusageを指定すると、必要に応じてPolyfill(代替コード)に変換してくれます。(初期値はfalse)

{

  "presets": [

    ["@babel/preset-env", {

        "targets": [...],

        "useBuiltIns": "usage"

      }

    ]

  ]

}


@babel/polyfill

2019年2月現在、「useBuiltIns:'usage'」の項目には「experimental(実験的)」とあります。お使いの環境でうまく動かなかった場合は、@babel/polyfillと「useBuiltIns:'entry'」の合わせ業もあります。


@babel/polyfillをインストール

$ npm install @babel/polyfill --save

アプリ(サイト)内の一箇所にだけ、下記インポート文を記述します。複数個所に記述するとエラーとなるそうです。この記述は、必要に応じて個別のpolyfillのインポート文に書き換えられます。


// 記述する内容

import "@babel/polyfill";


// 最終的に個別のimport文に変換される

import "core-js/modules/es7.string.pad-start";

import "core-js/modules/es7.string.pad-end";


4.3.設定ファイルをpackage.jsonにまとめる

設定ファイルを増やしたくない場合は、package.jsonにまとめることも可能です。babelという項目を追加します。記述方法は.babelrcの場合と同様です。またwebpack同様、コマンドをscriptsに登録して利用することも可能です。


{

  "name": "sample",

  "version": "1.0.0",

  "main": "index.js",

  "scripts": {

    "build": "babel ./src/index.js --out-file ./dist/index.js"

  },

  "devDependencies": {

    "@babel/cli": "^7.2.3",

    "@babel/core": "^7.2.4",

    "@babel/preset-env": "^7.3.4",

    "webpack": "^4.29.6",

    "webpack-cli": "^3.2.3"

  },

  "babel": {

    "presets": ["@babel/preset-env", {

        "targets": [...],

        "useBuiltIns": "usage"

      }

    ]

  }

}

以上がBabelの基本(の一部)となります。設定方法一つとっても手段が多種多様で迷います。。。


2014年5月11日日曜日

jQuery3

◆処理のタイミング「イベント」
jQueryの処理を実行するタイミングを制御するのが「イベント」です。
イベントを設定することで、「クリックしたとき」や「ドラッグ&ドロップしたとき」など、指定した要素に対する何らかの操作が発生したときに、HTMLやCSSを操作できます。

イベントは次のようにして設定します。
$("セレクター").イベント(function(){
    // イベント処理
});

【例】
 $("button").click(function(){
    $("img").attr("src","sea.jpg");
 });
 
 実行前HTML
 <button>画像を変更</button>
 <img alt="" src="flower.jpg" />

 
 実行結果(画像はなし)
  
  


イベントには、クリック(click)やダブルクリック(dblclick)、マウスダウン(mousedown)、マウスアップ(mouseup)、マウスオーバー(mouseover)、マウスアウト(mouseout)、マウスムーブ(mousemove)などを設定できます。

◆jQueryでアニメーション効果を付ける
jQueryを使うと、要素の表示/非表示に、アニメーション効果を付けられます。アニメーション効果には次のような命令があります。
①ノーマルアニメーション
 $("セレクター").show(スピード); 表示
 $("セレクター").hide(スピード); 非表示
②スライドアニメーション
 $("セレクター").slideDown(スピード); 表示
 $("セレクター").slideUp(スピード); 非表示
③フェードアニメーション
 $("セレクター").fadeIn(スピード); 表示
 $("セレクター").fadeOut(スピード); 非表示


「スピード」のところには
 slow/normal/fastのいずれか、
 またはミリ秒(1秒=1000秒)単位で数字を指定できます。
 たとえば次のサンプルでは、
 button要素がクリックされると、
 CSSで非表示(display:none;)に設定されている赤色のdiv要素が、
 少しずつ拡大しながら表示されます。

 スクリプト部分
 $("button").click(function(){
  $("div").show("slow");
 });

 CSS部分
 div{
  width:200px;
  height:200px;
  background:red;
  display:none;
 }

 HTML部分
 <button>表示</button>
 


2014年5月10日土曜日

jQuery2

◆jQueryでHTML/CSSを操作する
jQueryにはさまざまな機能があります。
jQueryでHTML/CSSを操作するには、次のような書式でjQueryの命令を記述します。

【例1:】
 jQueryの命令は豊富にあり、
 たとえばhtml()という命令を使うと、セレクターで指定した要素の内側を変更できます。
 $("p#first").html("<strong>変更後<strong>");</strong></strong>
 
 上記のサンプルコードを実行すると、id属性に「first」が設定されているp要素の内容が、
 <strong>変更後<strong>に変わります。</strong></strong>

 実行前
  <div id="first"> 変更前</div>

 実行後
  <div id="first"> <strong>変更後</strong></div>

【例2:】
 CSSを変更する場合は、css()という命令を使います。
 css()はCSSプロパティ名と設定したい値を括弧内に ,(カンマ)区切りで記述します。
 $("p").css("color","red");

 実行すると、p要素のCSSのcolorプロパティがredに変わり、
 p要素のテキストが赤色で表示されます。

◆jQueryで利用できる主なHTML/CSSを操作する命令

命令名・書式 意味
テキストの変更と取得
text(変更後のテキスト) テキストを変更する
text() テキストを取得する
HTMLの変更と取得
html(変更後のHTML) HTMLを変更する
html() HTMLを取得する
HTMLの挿入
prepend(挿入するHTML) 要素内の先頭にHTMLを挿入する
append(挿入するHTML) 要素内の最後にHTMLを挿入する
before(挿入するHTML) 要素の前にHTMLを挿入する
after(挿入するHTML) 要素の後にHTMLを挿入する
HTMLの移動
prependTo(移動先のセレクター) 他の要素内の先頭に要素を移動する
appendTo(移動先のセレクター) 他の要素内の最後に要素を移動する
insertBefore(移動先のセレクター) 他の要素の前に要素を移動する
insertAfter(移動先のセレクター) 他の要素の後に要素を移動する
他の要素で包む
wrap(<要素名></要素名>) 要素を他の要素で包む
wrapAll(<要素名></要素名>) 要素をまとめて他の要素で包む
wrapInner(<要素名></要素名>) 子要素/テキストを他の要素で包む
要素の置き換え
replaceWith(置換後の要素) 要素を他の要素に置き換える
要素の削除
remove() 要素を削除する
属性値の変更と取得
attr(属性名, 属性値) 指定した属性の値を変更する
attr(属性名) 指定した属性の値を取得する
removeAttr(属性名) 指定した属性を削除する
class属性の追加と削除
addClass(class属性値) class属性を追加する
removeClass(class属性値) class属性を削除する
CSSの制御
css(プロパティ名,値) 指定したCSSプロパティの値を設定する
css(プロパティ名) 指定したCSSプロパティの値を取得する
フォーム部品の操作
val("入力値") フォームの入力値(val ue属性の値)を変更する
val() フォームの入力値(val ue属性の値)を取得する

2014年5月9日金曜日

JQuery1

◆jQueryのダウンロードと利用方法

グーグルのWebサービス「Google AJAX Libraries API」を利用すると、jQuery本体をサーバーにアップロードをしなくてもすぐに利用できます。


◆jQueryのコードを記述する場所
jQueryのコードは、jQueryを読み込んだ後のscript要素内に、次のような書式で記述
①$(document).ready()の省略形
$(function(){
  // jQueryの処理
})
②$(document).ready()
$$(document).ready((function(){
  // jQueryの処理
})

◆要素を指定するためのセレクター
jQueryでは次のステップで処理を記述します。
・指定した要素に何らかの操作が発生したタイミング
・指定した要素のHTMLやCSSを変更
 ⇒
「操作が発生した要素」や「変更したい要素」を指定するのが「セレクター」
$("セレクター")

セレクターにはCSSのセレクターとほぼ同じものが利用できます。
たとえば次のように記述すると、id属性が「main」の要素内に存在するimg要素を指定できます。
 $("#main img")


◆jQueryで利用できる主なセレクター
名称 書式 指定対象
CSSでよく利用されるセレクター
要素セレクター $(要素名) 特定のHTML要素
IDセレクター $(#ID名) 特定のid属性を持つ要素
クラスセレクター $(.クラス名) 特定のclass属性を持つ要素
子孫セレクター $(要素1 要素2) 特定の要素の内側にある要素
ユニバーサルセレクター $(*) すべての要素
グループセレクター $(セレクター1) セレクター2
CSS2のセレクター
子セレクター $(親要素名 > 子要素名) 特定の要素の直下の子要素
隣接セレクター $(要素1 + 要素2) 特定の要素の次の要素
first-child擬似クラス $(要素:first-child) 同一の親要素内の最初の要素
CSS3のセレクター
間接セレクター $(要素1 ~ 要素2) 特定の要素の後に出現する要素
否定擬似クラス $(要素1:not(要素2)) 特定の要素内で指定した要素以外の要素
empty擬似クラス $(要素:empty")" 子要素やテキストを含まない要素
nth-child擬似クラス $(要素:nth-child(番号)) 特定の要素内の指定した番号の要素
last-child擬似クラス $(要素:last-child) 特定の要素内の最後の要素
only-child擬似クラス $(要素:only-child) 指定した要素が1つだけ含まれる特定の要素
CSSの属性セレクター
[attribute] $([属性名]) 特定の属性を持つ要素
[attribute='value'] $([属性名='値']) 特定の属性が指定した値を持つ要素
[attribute!='value'] $(要素名[属性名!='値']) 特定の属性が指定した値を持たない要素
[attribute^='value'] $([属性名^='値']) 特定の属性が特定した値で始まっている要素
[attribute$='value'] $([属性名$='値']) 特定の属性が特定した値で終わっている要素
[attribute*='value'] $([属性名*='値']) 特定の属性が特定した値を含んでいる要素
[attributeFilter1][attributeFilter2] $([属性セレクター1][属性セレクター2]) 複数の属性セレクターに該当する要素
jQueryの独自フィルター
firstフィルター $(要素:first) 同一の親要素内の最初の要素
lastフィルター $(要素:last) 指定した要素の最後の要素
evenフィルター $(要素:even) 指定した要素の偶数番目の要素
oddフィルター $(要素:odd) 指定した要素の奇数番目の要素
eqフィルター $(要素:eq(番号)) 指定した番号の要素
gtフィルター $(要素:gt(番号)) 指定した番号より後の要素
ltフィルター $(要素:lt(番号)) 指定した番号より前の要素
headerフィルター $(要素:header) h1〜h6までのheader要素
containsフィルター $(要素:contains(文字列)) 特定の文字列が含まれている要素
hasフィルター $(要素1:has(要素2)) 特定の要素が含まれている要素
parentフィルター $(要素:parent) 子要素やテキストを含む要素
フォームフィルター
:inputフィルター $(要素:input) input要素/textarea要素/select要素/button要素
:textフィルター $(要素:text) 1行テキスト入力フォーム(type属性がtextのinput要素)
:passwordフィルター $(要素:password) パスワード入力フォーム(type属性がpassowordのinput要素)
:radioフィルター $(要素:radio) ラジオボタン(type属性がradioのinput要素)
:checkboxフィルター $(要素:checkbox) チェックボックス(type属性がcheckboxのinput要素)
:submitフィルター $(要素:submit) 送信ボタン(type属性がsubmit/imagesのinput要素)
:imageフィルター $(要素:image) イメージボタン(type属性がimageのinput要素)
:resetフィルター $(要素:reset) リセットボタン(type属性がresetのinput要素)
:buttonフィルター $(要素:button) ボタン(button要素)
:fileフィルター $(要素:file) ファイル選択フォーム(type属性がfileのinput要素)
:checkedフィルター $(要素:checked) ラジオボタン、チェックボックスでチェックが入っている要素
:selectedフィルター $(要素:selected) セレクトボックスで選択されている要素