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

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

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

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

React.js

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

Q&A

解決済

2回答

1181閲覧

Reactで複数の空文字を入力できないようにしたい

shinchan_

総合スコア2

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

React.js

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

0グッド

0クリップ

投稿2021/11/06 04:20

今回したかったこと

  • 正規表現「/\s+/」を用いて複数の空文字の入力が来た際にonClickAdd関数の処理を終わらせたかった。
  • 今回初めてReactを触って、入力値の検知をフロント側でしたため、railsのblank?メソッドのようなものを最初は探したが無かったため、正規表現で空文字と複数の空文字にマッチする際に弾くという形を取ることにしました。

js

1...省略 2export const App = () => { 3 const [todoText, setTodoText] = useState(''); 4 const [incompleteTodos, setIncompleteTodos] = useState([ 5 'ああああ', 6 'いいいい' 7 ]); 8 const [completeTodos, setCompleteTodos] = useState([ 9 'うううう', 10 'ええええ' 11 ]); 12 13 const onChangeTodoText = (event) => setTodoText(event.target.value); 14 const onClickAdd = () => { 15 // 以下がうまくいかなかったため、仕方なく空文字1文字のみに対応 16 // if (todoText === /\s*/) return; 17 if (todoText === '') return; 18 const newTodos = [...incompleteTodos, todoText]; 19 setIncompleteTodos(newTodos); 20 setTodoText(''); 21 }; 22 23...省略*
<br>

試したこと

  • todoTextの型を確認 => string
  • console.logで正規表現がそもそも作動しているのか確認 => 作動していなかった?全てfalseになった

js

1todoText = ""; 2console.log(todoText === /\s*/); 3// => false 4 5todoText = " "; 6console.log(todoText === /\s*/); 7// => false 8 9todoText = ""; 10console.log(todoText === /\s{0,}/); 11// => false 12 13todoText = " "; 14console.log(todoText === /\s{0,}/); 15// => false
<br>

実行環境

package.json

1"dependencies": { 2 "@testing-library/jest-dom": "^5.11.4", 3 "@testing-library/react": "^11.1.0", 4 "@testing-library/user-event": "^12.1.10", 5 "react": "^17.0.2", 6 "react-dom": "^17.0.2", 7 "react-scripts": "4.0.3", 8 "web-vitals": "^1.0.1" 9 },

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

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

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

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

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

guest

回答2

0

ruby だと todoText =~ 正規表現 って書けるので、コメントアウトされている

javascript

1// if (todoText === /\s*/) return;

とかって書きたくなるのも分かるんですが、JSでは =~ みたいなのは無いので、

javascript

1if (/^\s*$/.test(todoText)) return;

とするとか、あるいは正規表現を使わずに、(ソース見た限りだとtodoTextはnullやundefinedにならなさそうなので、)

javascript

1if (!todoText.trim()) return;

とするとかですね。

投稿2021/11/06 04:51

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

shinchan_

2021/11/06 06:25

ご回答ありがとうございます。 正しく、Rubyを一番最初に学習していまして、Rubyの書き方をしていました。trim関数は存じ上げなかったため、返信する前に調べてみたのですが、空白を削除してくれる関数なのですね。 コンソール上で試してみたところ、空白文字のみの文字列に対して!を先頭につけて呼び出すとtrueを返してくれるところまで観測できたのですが、なぜそうなるのかまでは腑に落ちていないので、色々と試して理解していこうと思います。 nullやundefinedにならない変数にはtrim関数も使用するのも手だということを勉強になりました。 ありがとうございます。 //以下はコンソール上で試したtrim関数の挙動です > const orig = ' foo '; undefined > console.log(!orig.trim()); false undefined > const orig2 = ' '; undefined > console.log(!orig2.trim()); true undefined > console.log(orig2.trim()); undefined
guest

0

ベストアンサー

console.logで正規表現がそもそも作動しているのか確認 => 作動していなかった?全てfalseになった

はい、文字列と正規表現を等号で比較しても、単に一致しないだけです。

/正規表現/.test(文字列)のような形でチェックする必要があります。

投稿2021/11/06 04:46

maisumakun

総合スコア146018

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

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

shinchan_

2021/11/06 04:56

前回に続き、ご回答ありがとうございます。 if ((/\s*/).test(todoText)) return; ご指摘通り、この記述にしたところ、求めていた挙動になりました。 今後、フロント側で正規表現にマッチするかどうか確認する際にはtest関数を使用して学習をしていこうと思います。 ありがとうございました。 モヤモヤしながら、飛ばして作業していたので解決でき、スッキリしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問