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

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

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

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

React.js

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

Q&A

解決済

2回答

2839閲覧

Reactで真偽値の値によってテキストを変えたい

pontarou3

総合スコア18

JavaScript

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

React.js

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

0グッド

0クリップ

投稿2020/11/03 11:10

前提・実現したいこと

ReactでuseStateを使って、学習用の簡易アプリケーションを作成しています。

チェック項目の真偽値の値によって、文字をinnerTextで変化させたかったのですが、エラーメッセージが発生しました。

発生している問題・エラーメッセージ

TypeError: Cannot set property 'innerText' of null

該当のソースコード

react

1 2import React, {useState} from 'react'; 3 4const Article = ()=>{ 5 const [isPublished, togglePublished] = useState(false); 6 7 {/* isPublishedじゃなく、別の書き方になるかと思いました */} 8 if (isPublished){ 9 document.getElementById('booleanValue').innerText ='公開中'; 10 } else { 11 document.getElementById('booleanValue').innerText ='非公開'; 12 } 13 14 return( 15 <div> 16 <label htmlFor="check">公開状態</label> 17 <input type="checkbox" id="check" checked={isPublished} onClick={()=>togglePublished(!isPublished) } /> 18 {/* 下記に公開か非公開かをif文で実施してみる */} 19 <div id="booleanValue">公開か非公開かをここで表示させたい</div> 20 </div> 21 ) 22} 23export default Article;

試したこと

useStateの変数名であるisPublishedをtrueかfalseかをあてはめてみましたが、エラーでした。
useStateで真偽値を利用して、真偽値の値次第で文字を変化させるにはどうすればいいか、自分なりにググってみたのですが、
答えに近づけず、つまりました。

補足情報(FW/ツールのバージョンなど)

├── react@17.0.1
├── react-dom@17.0.1
└── react-scripts@3.4.4

以上となります。
Reactの学習中で知識不足なところがあり、お気づきの方がいらっしゃいましたら
ご教授いただけますと幸いです。

最後までみていただきありがとうございます。

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

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

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

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

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

guest

回答2

0

divタグ等が描画される前にdocument.getElementById('booleanValue')を参照しているためnullでエラーとなっています。

描画された後に実行されるようにuseEffectを使って以下のようにするとエラーは解消できますが、2つ目の例のように、React的にシンプルに書く方が良いです(innerTextによる書き換えをそもそもしない)。

js

1const Article = ()=>{ 2 const [isPublished, togglePublished] = useState(false); 3 4 useEffect(() => { 5 if (isPublished){ 6 document.getElementById('booleanValue').innerText ='公開中'; 7 } else { 8 document.getElementById('booleanValue').innerText ='非公開'; 9 } 10 }, [isPublished]) 11 12 return( 13 <div> 14 <label htmlFor="check">公開状態</label> 15 <input type="checkbox" id="check" checked={isPublished} onClick={()=>togglePublished(!isPublished) } /> 16 {/* 下記に公開か非公開かをif文で実施してみる */} 17 <div id="booleanValue">公開か非公開かをここで表示させたい</div> 18 </div> 19 ) 20}

js

1const Article = ()=>{ 2 const [isPublished, togglePublished] = useState(false); 3 4 return( 5 <div> 6 <label htmlFor="check">公開状態</label> 7 <input type="checkbox" id="check" checked={isPublished} onClick={()=>togglePublished(!isPublished) } /> 8 {/* 下記に公開か非公開かをif文で実施してみる */} 9 <div id="booleanValue">{isPublished ? "公開" : "非公開"}</div> 10 </div> 11 ) 12}

投稿2020/11/03 11:36

nabenabe11234

総合スコア126

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

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

pontarou3

2020/11/03 12:23

nabenabe11234 さん ご指摘ありがとうございます! useEffectについての使い方、また実践的なご指摘についてもありがとうございます。 https://ja.reactjs.org/docs/hooks-effect.html 上記公式をみて理解しました。 チュートリアルのようなカウントするような事例には使えそうですね。 ただ、今回のような単純な処理の場合、おっしゃっていただいた後者のコードを書いたほうが、 一番シンプルで良いと思いました。 こんな書き方できるんだ! っと実は驚いてます。(しょぼすぎてスミマセン) めっちゃ参考になります!ありがとうございました。
guest

0

ベストアンサー

JSXのなかで条件分岐するか、条件ごとに値を決めてJSXに埋め込んでください。

jsx

1<div id="booleanValue">{ isPublished ? '公開中' : '非公開' }</div>

文字をinnerTextで変化させたかったのですが

よほどそれが必要な場面を除いて、Reactで生成した要素を通常のDOMで変更してはいけません。

投稿2020/11/03 11:32

maisumakun

総合スコア145930

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

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

pontarou3

2020/11/03 12:17

maisumakun さん ありがとうございます!根本的なところを間違ってましたね。。。。 今回の間違いで安易にDOM操作しないよう気をつけることができます。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問