「ECMAScript2015」タグアーカイブ
【React】ブラウザ間の差異をなくすcore.jsをReact内にimportする方法〜ES6,ES7のメソッドを快適に使う〜
以前の記事でObject.assignがios8で使えなくてpolyfillを使った話をしたのですけど、
core-jsで解決できるようなので試してみた。
ES6でimportして実際使ってみるまでの記事です。
読み込む
npm i -D core-js
//React内に読み込む
使いたいオブジェクト名の階層までのパスを書きメソッドを読み込む
import { findIndex, fill } from 'core-js/library/fn/array/virtual'; import { includes }from 'core-js/library/fn/array/'; import { assign } from 'core-js/library/fn/object'; const HelloReact = React.createClass({ render() { console.log(Array(10)::fill(0).map((a, b) => b * b)::findIndex(it => it && !(it % 8))); var obj = {a: "fa"}; console.log(assign({b: 'ooo'}, obj)); var array = ["","faf"] console.log(array.includes("faf")); return ( <div> <div>
////
【React × ECMAScript2015】Object.assign,Array.includesがiOS8.1.1、Androidで使えない!ES6(ECMAScript2015)でのpolyfillの意味と使い方
今日Reactでmodalを作っているとsetStateする値をオブジェクトそのままで保持しておく必要があって、さらにもし他のstateが更新されたら一緒にsetStateをする必要があった。
objectとobjectをマージしなくてはならなかったし、objectを非破壊メソッドでコピーしておかなければならなかった。
この2つができるObject.assign
なのですが、
これがiOS9からで8やAndroidには対応していない。
じゃあJSON.parse(JSON.stringify(obj))でコピー作ろうと思ったんだけど、
調べるとfunctionやundefinedをkey値にしてはいけないなどいろいろあるみたい。そもそもオブジェクトコピーするだけでJSONオブジェクトってなんかあれですよねってことで、
やはりObject.assign使いたい!
polyfillの意味は壁の穴を埋めるための物のようです。まさにブラウザのバージョンの差異を埋めるためのもの。
でES6でどこにどう書くんだと思った。
・constructor内にpolyfillを入れる(初期化時にObjectがもっているかどうか判定して持っていなかったらfunctionを代入している)
iphoneをMacにつないでwebインスペクタのコンソールでObject.assignが使えたらOK
よかったね!
でわまたーーーー
【React】react-modalの簡単実装するための9つの手順とハマりポイント
業務でmodalを実装したのですが、ハマったところがありました。
で、それにまつわる記事がなかったので書きます
作るモーダルは
これ
githubにReact-Sampleとしておいています。ここ
他のサンプルと混在していて見にくいですが。。
作り方
1. npm i -D react-modal
プロジェクトのnode_modulesにインストールしてください
2. 親コンポーネントでreact-modalを読み込む
ここ
[code language="javascript"]
import Modal from 'react-modal';
[/code]
3 トリガーになるidを付与、button設置
※WPエディタがhtmlタグと認識してしまうので画像で表示しています
ここ
[code language="javascript"]
<h2 id="modal">react-modal</h2>
<button className="btn btn-primary" onClick={this.openModal}>open modal</button>
<Modal><button onClick={this.closeModal}>Close<button></Modal>
[/code]
//ここでのcloseボタンの位置に注意してください。ここで更に下、子コンポーネントにthis.closeModalを渡すことはできません
4 stateを管理(初期はOpenではないのでfalse)
ここ
[code language="javascript"]
this.state = {
modalIsOpen: false
}
[/code]
5 constructorでbind
ここ
[code language="javascript"]
this.openModal = this.openModal.bind(this);
this.closeModal = this.closeModal.bind(this);
[/code]
6 this.openModalとthis.closeModalを実装
//setStateでbooleanを渡すだけ
ここ
[code language="javascript"]
openModal() {
this.setState({modalIsOpen: true});
}
closeModal() {
this.setState({modalIsOpen: false});
}
[/code]
7.Modalのpropに設定を渡す
ここ
[code language="javascript"]
<Modal isOpen={this.state.modalIsOpen} onAfterOpen={this.afterOpenModal} onRequestClose={this.closeModal} shouldCloseOnOverlayClick={true} style={customStyles}>
//ここで最低限必要なのはisOpenだけです。
//あとはご自由に
[/code]
7_2 スタイルをカスタムしたい場合styleにcustomStyleを渡す
//render内です。
ここら辺
[code language="javascript"]
const customStyles = {
overlay : {//ovelayの色を変える
background: 'rgba(0,0,0, .4)'
},
content : {
top : '50%',
left : '50%',
right : 'auto',
bottom : 'auto',
marginRight : '-50%',
transform : 'translate(-50%, -50%)',
width : '72%'//openしているコンテンツの幅を変える
}
};
[/code]
8、モーダルを実装しているコンポーネントのclassより外に下記
ここらへん
[code language="javascript"]
const appElement = document.getElementById('content');
Modal.setAppElement(appElement);
[/code]
わかりずらかったらチュートリアルのここ見てね
9 おしまい
おしまいです。どうでしょうか??
はまりポイント
ハマったところは
3の閉じるボタンの位置でした。。
これはModalコンポーネントの直下に置かなくてはならず、、これをModalコンポーネントの子コンポーネントの中で使うことが
できませんでした。
子コンポーネントにpropsで渡しているんですけどいけなかった。
子コンポーネントではいろいろなボタンがあり、そのボタンの状態を管理して、「今の状態でcloseする 」ということが
したかったのですが、そこにはcloseModalは実装できず、
ここにもかいてある「subComponentは持てない」って。
ではModal直下にcloseを置くといろいろなボタンの状態を変えるとモーダル下のrenderが走ってしまう。
(それはshouldComponentUpdateで制御しなくてはだめ)
でした。
また
closeModal内で他の関数を呼べなかった気がする。。これは多くの時間を割いて調査していませんが、、
わかっちゃえば簡単なのですが、地味にやられました。
でわ〜〜〜
【 併せて読みたい 】
【React】Reactの動きを理解したい人の為の最小サンプル
【REACT入門】過去のREACT初心者の自分にREACTのPROPSとSTATEの違いを簡単に説明してあげたい
【REACT × ES6 × FLUX】を手っ取り早く学びたい人の為にサンプル作ったよ【3の倍数と3が付くときだけ猫になるCOUNTER】
【ES6】適当に試したり。正規表現とか
[code lang="javascript"]
function getKey(k) {
return `${k}`;
}
const obj = {
id: 5,
name: 'San Francisco',
[getKey('enabled')]: true,
};
console.log(obj)
///////////////////////////
function f(x, ...y) {//ここで受け取らない分が配列の要素としてyになる
// y is an Array
console.log(y)//["hello","true"]
return x * y.length;
}
const r1 = f(3, "hello", true) == 6
console.log(r1);//true
//////////////////////////////
function f(x, y, z, t, p) {//インデックス順に受け取る
console.log(z);
return x + y + z;
}
// Pass each elem of array as argument
//const arry = [1,2,3,5,6];
//f(...arry) == 6
//or
f(...[1,2,4]);
///////////////////////////////
let fibonacci = {
[Symbol.iterator]() {
let pre = 0, cur = 1;
return {
next() {
console.log([pre, cur] = [cur, pre + cur]);
return { done: false, value: cur }
}
}
}
}
//////////////////////
let [a, b, c] = []
console.log(a,b,c);
typeof b
function getSomething(){
return {
first: 1,
second: 2,
third: 3
}
}
var { first, second, third } = getSomething();
console.log(first)
console.log("repeat".repeat(2));
console.log(["morita","kenji","fafafa"].findIndex(x => x == "fafafa"))
console.log(["A","B","C"].map(x => Array.of(x)));
console.log(['a', 'b', 'c'].fill('kenji', 1, 2));
const i = [3, 0, 6, -1].find(x=> x < 0);
console.log(i)
function* idMaker(){
var index = 0;
while(true)
yield index++;
}
const gen = idMaker();
console.log(gen)
////////////////////////////
const str = "わたしの名前は「もりた」です。あだなは「もりけん」です";
const re = /「.*?」/ig;
const myRe=/ken*/g;
const str2 = "fafakenfafkenji";
let array;
while ((array = myRe.exec(str2)) !== null) {
let msg = array[0] + " を見つけました。";
msg += "次のマッチは " + myRe.lastIndex + " からです。";
console.log(msg);
}
const str3 = "<img src='fafa.com'>"
const str4 = "<p>"
const reg2 = /<(\S+)(\s+.+)?>/;
const reg3 = /<(?:\S+)(?:\s+.+)?>/;
const re2 = str3.match(reg2);
const re3 = str3.match(reg3);
const re4 = str4.match(reg2);
console.log(re2);console.log(re2[0]);
console.log(re3);console.log(re3[0]);
console.log(re4);console.log(re4[0]);
const str222 = "わたしの名前は「もりた」です。あだなは「もりけん」です";
const re222 = /「(.+?)」/ig;
let result;
while ((result = re222.exec(str222)) !== null){
console.log(result[0],"ここ")
}
const nen = "西暦1980年の3581歳です";
const reg1 = /\d+(?=年)/;
console.log(nen.match(reg1))
const string3 = "washable reasonable accessible assemble answerable";
const reg5 = /\b\w+(?=able\b)/g;
console.log(string3.match(reg5));
const nen1 = "ケンジは昭和55年生まれの35歳であり、ケンジの母は昭和22年生まれの64歳である"
const reg6 = /\d+(?![年\d])/g;
console.log(nen1.match(reg6));
const str5 = "あの客はよく柿食う客だ";
const res5 =str5.match(/あの(.+)はよく柿食う\1だ/);
console.log(res5);
const tag = "<div><h1>kenjimorita.jp</h1></div>";
console.log(/<(\w+)><(\w+)>kenjimorita.jp<\/\2><\/\1>/.test(tag))
// const str6 = "西暦2010年は平成22年です。西暦1980年は昭和55年です。";
// console.log(str6.match(/(?<=昭和|平成)\d+/))
const str7 = "My name is Taro Suzuki and I am a researcher at ABC.";
console.log(str7.match(/\ba\w*\b/g));
var falseValue = new Boolean(false);
console.log(falseValue)//false
var fafa = null;
console.log(typeof fafa)//Object
console.log(fafa == undefined)//等値演算子ではtrueになってしまう
console.log(fafa === null);//true //同値演算子を使う
[/code]
Chrome CanaryのconsoleでECMAScript2015試せるよ
【ECMAScript2015(ES6)】後で猫に教えてあげたいES6の「Generators(ジェネレーター)とIterator(イテレータ)」
昨日はSymbol(シンボル)でしたが、今日はGeneratorsとIterator。
babel立ち上げてコード確認しながらやりました。
ジェネレータってなにかって再帰処理を簡単にしてくれるものなんですね。
そのイテレータオブジェクトを返す関数がジェネレータ
ジェネレータを扱うにはイテレータを理解する必要があるようです。
続きを読む