質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
ECMAScript

ECMAScriptとは、JavaScript類の標準を定めるために作られたスクリプト言語です。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

2回答

5361閲覧

React(ES6)でif文内での変数宣言について

twin_bird

総合スコア230

ECMAScript

ECMAScriptとは、JavaScript類の標準を定めるために作られたスクリプト言語です。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2016/09/30 15:49

ES6でReactをつかっているのですが、以下のような条件分岐ではletやconstではなく、varを使うのが最適でしょうか?

そもそも実装が良くないという指摘も含めて回答いただければと思います。

hoge.js

1 2class Hoge extends React.Component{ 3 4 ~~ 5 6 ~~ 7 8 render() { 9 // フォームの入力が成功だったときにメッセージがオブジェクト(this.state.message.job)に格納されます。デフォルトでは空です。 10 const msgJob = this.state.message.job; // 空またはオブジェクト 11 12 // letやconstは使えない!? 13 if (msgJob.length > 0) { 14 var msgOfJob = msgJob.map(function(msg) { 15 return ( 16 <p key={msg}>{msg}</p> 17 ); 18 }); 19 } else { 20 var msgOfJob = false; 21 } 22 } 23 24 return ( 25 <div> 26 {msgOfJob} 27 </div> 28 ); 29}

※変数名についてはご容赦ください・・・。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

varletの違いはスコープのみです。letはブロックスコープになるため、if文内で宣言した場合は、そのif文内でしか使用できません。逆にvarは関数スコープになるため、関数全体で使用する事が目的であれば、varを使っても問題ありません。どうしても、letにする場合は、スコープがif文の外側になるようにif文の外側で宣言しておきます。

JavaScript

1let msgOfJob = false; 2if (msgJob.length > 0) { 3 msgOfJob = msgJob.map(function(msg) { 4 return ( 5 <p key={msg}>{msg}</p> 6 ); 7 }); 8}

この場合は、上記のように、予めfalseを入れておいて、if-elseではなくifのみにするように工夫することもできます。

constですと最初の宣言時にしか代入できないため、同じようにするには?:文を使う必要があります。

JavaScript

1const msgOfJob = msgJob.length > 0 2 ? msgJob.map(function(msg) { 3 return ( 4 <p key={msg}>{msg}</p> 5 ); 6 }) 7 : false ;

単文のみで書くことにこだわりがなければ、下記のように書いても良いでしょう。

JavaScript

1const msgOfJobList = msgJob.map(msg => <p key={msg}>{msg}</p>); 2const msgOfJob = msgOfJobList.length > 0 ? msgOfJobList : false;

そもそも、msgObJobは空配列[]であっても問題ないと思いますので思い切って、下記でも動くと思います。

JavaScript

1const msgOfJob = msgJob.map(msg => <p key={msg}>{msg}</p>);

投稿2016/10/01 06:06

raccy

総合スコア21735

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

twin_bird

2016/10/01 06:26

回答ありがとうございます。参考になりました! falseを代入するやり方はvarでやっていたのですが、letでも問題ないのですね。 他に上げていただいたやり方を含め、試してみます!
guest

0

Reactはこのエラーとは関わりがないです、ES2015の仕様です。

Babel Replで以下のコードを試したらエラーになります。
※constじゃなくてletでもエラーになります。

const x = 1; if (x === 1) { const y = 2; } else { const y = 2; } console.info(y);

letとconstはvarとはスコープが違いブロックスコープです。
ifブロックの中で使用された場合は、そのブロック内でしか使用できません。

投稿2016/09/30 16:27

編集2016/09/30 16:27
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

twin_bird

2016/10/01 04:51

回答ありがとうございます。 constやletでエラーが出るのは検証済みだったのですが、今回の場合はvarを用いてしまって良いのでしょうか? 再代入可能なvarはできるだけ避けた方が良いと認識しており、constやletを用いた別の方法を模索しております。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問