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

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

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

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

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

React.js

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

Q&A

3回答

787閲覧

Reactで先頭のゼロが消えない

hupyaginu

総合スコア15

JavaScript

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

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

React.js

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

0グッド

2クリップ

投稿2024/06/18 02:07

編集2024/06/25 13:10

実現したいこと

inputで「01」と入力したとき「1」が表示される事を期待しています

発生している問題・分からないこと

inputで「01」と入力したとき「01」が表示されてしまう
intに変換してからsetValueしているので「01」ではなく「1」が代入され、inputの表示も「01」ではなく「1」になると思っていたが、「01」が表示されてしまう

エラーメッセージ

error

1期待する結果が得られないだけなのでエラーメッセージは存在しない

該当のソースコード

tsx

1import { useState } from 'react' 2 3function App() { 4 const [value, setValue] = useState<number>(123) 5 6 return ( 7 <> 8 <span>value is {value}</span> 9 10 <div> 11 <input type="number" value={value} onChange={(e) => { 12 const _value = parseInt(e.target.value) 13 console.log(_value) 14 15 setValue(_value) 16 }} /> 17 </div> 18 </> 19 ) 20} 21 22export default App 23

参考画像

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

自分が書いたプログラムの意味を理解していて、上記プログラムで問題ないと思っているので、何が問題なのか理解できない状態です。

補足

特になし

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

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

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

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

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

guest

回答3

0

useRefを使ってみるのはどうでしょうか。chromeの検証ツールから見るとinputタグのvalue属性は確かに最初stateのvalueの値が入っていますが、これは初回レンダリング以降静的な値として生成されているようで、inputの値を変えた時にsetValueでstateを書き換えた時にはspanタグしか際レンダリングされていないためにinputタグのvalue属性が入力された値で置き換わっていないようです。これをinputタグのvalue属性に反映させるためにuseRefを使用すると意図される動きになると思います。
追記:訂正:value属性は初期値を設定する属性で、上記で実際に置き換えているのはinputの入力内容です。

function App() { const [value, setValue] = useState<number>(123) const inputRef = useRef<HTMLInputElement>(null); //useRefを使用 return ( <> <span>value is {value}</span> <div>                //ref属性にuseRefを宣言したinputRefを指定 <input type="number" value={value} ref={inputRef} onChange={(e) => {  const _value = parseFloat(e.target.value) console.log(_value)                   //typescriptのためif分でnullを回避                   //value属性は文字列型なのでString()で文字列に変換 if(inputRef.current) { console.log(inputRef.current); inputRef.current.value = String(_value); } setValue(_value) }} /> </div> </> ) }

useRefの詳しい使い方は調べていただければと思います。
間違っていたら申し訳ありません。

投稿2024/06/18 09:42

編集2024/06/18 10:01
ryuichi-works

総合スコア40

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

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

hupyaginu

2024/06/19 01:00 編集

回答有り難うございます しかし、DOM側の値を操作しているようなコードに伺えます DOM側を触るとReact側と状態が異なる状態になる気がするので良くない気がしています
guest

0

<input type="number">を使用している場合、ユーザーが入力した値は文字列として扱われ、valueプロパティにセットされます。
ただし、valueプロパティが数値型の場合、その値は文字列ではなく数値として解釈され、表示されるため、先行するゼロが無視されます。

このため、valueを数値に変換した後に再度文字列としてinputに設定することで、期待する動作を実現することができます。

案1

tsx

1import { useState } from 'react' 2 3function App() { 4 const [value, setValue] = useState<number>(123) 5 6 return ( 7 <> 8 <span>value is {value}</span> 9 10 <div> 11 <input type="number" value={value} onChange={(e) => { 12 const _value = parseFloat(e.target.value); 13 // 文字列にして値を渡す 14 e.target.value = _value.toString(); 15 console.log(_value); 16 17 setValue(_value) 18 }} /> 19 </div> 20 </> 21 ) 22} 23 24export default App

案2

tsx

1import { useState } from 'react' 2 3function App() { 4 // 文字列に変更 5 const [value, setValue] = useState<string>("123") 6 7 return ( 8 <> 9 <span>value is {value}</span> 10 11 <div> 12 <input type="number" value={value} onChange={(e) => { 13 const _value = parseFloat(e.target.value); 14 console.log(_value); 15 16 // 文字列に変換してから値を渡す 17 setValue(_value.toString()); 18 }} /> 19 </div> 20 </> 21 ) 22} 23 24export default App

投稿2024/06/18 08:52

lovam-nm

総合スコア18

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

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

hupyaginu

2024/06/19 00:58 編集

回答ありがとうございます 案1はDOMを直接触っている気がするので良くない気がしています。 (React側で保持している状態とDOMが異なる状態になってしまうような気がしています。今回の質問主題自体がすでにそのような状態なのかもしれないですが…) 案2は確かに期待する結果が得られました。 しかし、なぜnumberだとだめでstringだとOKだったのか理解できていません。 valueは0から1への変化するので再レンダリングがされると思っていて、「01」ではなく「1」が表示されると期待します。
lovam-nm

2024/06/19 02:05

この問題は、<input type="number">の挙動に起因しています。 <input type="number">は入力された値を文字列として扱いますが、valueに渡された数値を数値として解釈し、その結果として表示します。そのため、先行するゼロを無視してしまうということが起こります。 参考: https://plustrick.com/input_type_number/ https://note.com/takamoso/n/n79df2d8f16bf https://scrapbox.io/fsubal/input%5Btype=number%5D_%E3%81%AE%E3%82%B9%E3%83%86%E3%83%BC%E3%83%88%E3%82%92%E5%AE%89%E6%98%93%E3%81%AB_number_%E5%9E%8B%E3%81%AB%E3%81%97%E3%81%AA%E3%81%84
guest

0

このような修正はどうでしょう?

diff

1 <div> 2- <input type="number" value={value} onChange={(e) => { 3+ <input value={value} onChange={(e) => { 4 const _value = parseFloat(e.target.value) 5 console.log(_value) 6 7- setValue(_value) 8+ setValue(isNaN(_value) ? 0 : _value) 9 }} /> 10 </div>

この修正によって、以下のようになります。

  • input を空欄にしようとすると 0 が表示されることになりますが、0 の後ろにカーソルがあるときに 1 を入力すると、input には 01 ではなく1 と表示されます。

  • また、parseFloat の仕様によって半角数字ではないキーを打っても input の表示には反映されません。

投稿2024/06/21 13:37

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.40%

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

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

質問する

関連した質問