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

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

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

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Nuxt.js

Nuxt.jsは、ユニバーサルなSPAが開発可能なVue.jsベースのフレームワーク。UIの描画サポートに特化しており、SSRにおけるサーバーサイドとクライアントサイドのUIレンダリングなどさまざまな機能を持ちます。

JavaScript

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

Bootstrap

BootstrapはウェブサイトデザインやUIのWebアプリケーションを素早く 作成する可能なCSSフレームワークです。 Twitter風のデザインを作成することができます。

Q&A

解決済

2回答

4117閲覧

vue.jsで、指定したpropsがtrueの場合に特定のhtmlタグを埋め込む方法

umino

総合スコア54

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Nuxt.js

Nuxt.jsは、ユニバーサルなSPAが開発可能なVue.jsベースのフレームワーク。UIの描画サポートに特化しており、SSRにおけるサーバーサイドとクライアントサイドのUIレンダリングなどさまざまな機能を持ちます。

JavaScript

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

Bootstrap

BootstrapはウェブサイトデザインやUIのWebアプリケーションを素早く 作成する可能なCSSフレームワークです。 Twitter風のデザインを作成することができます。

0グッド

0クリップ

投稿2021/04/26 00:20

編集2021/04/26 00:22

前提・実現したいこと

vue.jsについての質問です。
とある項目(田中太郎、などの名前)を表示/入力するコンポーネントを作成したいです。

現在、propsreadModeプロパティを設定しています。
これにtrueが入ってきた場合は表示モード、falseの場合は入力フォームモードにしたいです。
v-if v-elseで分岐させれば良いのですが、事情があり1つにまとめたい)

該当のソースコード

vue

1<template> 2 <div class="component"> 3 名前:<input 4 type="text" 5 class="form-control-plaintext" 6 readonly 7 :value="hitoName" 8 :?????="readMode" 9 /> 10 <!-- readMode=trueだった場合 11 名前:田中太郎 12 13 readMode=falseだった場合 14 名前:(入力フォーム表示) 15 --> 16 </div> 17</template> 18 19<script> 20export default { 21 props: { 22 hitoName: String, //"田中太郎"などの文字列が入ってくる 23 readMode: true, //true(表示モード),またはfalse(入力モード)の指定 24 }, 25} 26</script>

bootstrapを使用しており、公式ドキュメントによると、
https://getbootstrap.jp/docs/4.1/components/forms/#readonly-plain-text

<input>class="form-control-plaintext"readonlyを設定すれば、
フォームをプレーンテキストで表示することができるので、表示/入力の切り替えにこちらを使いたいです。

考えた案として、
readModepropsがtrue(表示モード)の場合、
<input>内にclass="form-control-plaintext"readonlyを設定する(もしくはfalse(入力モード)の場合に取り除く)
という処理で動作するのでは?と思っているのですが、
htmlタグに埋め込むプロパティの操作の仕方がわかりません。

お詳しい方、ご教示願えませんでしょうか?
また、上記の方法以外の方が良いよ、などあれば合わせて指摘いただきたいです。
初心者質問で申し訳ありませんが、よろしくお願いします。

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

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

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

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

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

guest

回答2

0

・コンポーネントのプロパティ(下記では「readOnlyMode」)にboolean値を指定して渡すことで、readonly属性の有無を制御します。

■CustomInput.vue

<template> <div class="form-group"> 名前:<input type="text" class="form-control-plaintext" :value="hitoName" :readonly="readOnlyMode" /> </div> </template> <script> export default { name: "CustomInput", props: { hitoName: { type: String, required: false, default: "名前を入力してください", }, //hitoNameを指定しなかった場合のdefault値 readOnlyMode: { type: Boolean, required: false, default: false, }, //true(表示モード),またはfalse(入力モード)の指定 }, }; </script>

■使い方の例
・data()に、hitoNameの設定値を持たせておきます。

Vue

1<template> 2 <div id="app"> 3 <CustomInput :hitoName="dataName" :readOnlyMode="false"/> 4 </div> 5</template> 6 7<script> 8import CustomInput from './components/CustomInput.vue' 9export default { 10 name: 'App', 11 components: { 12 CustomInput 13 }, 14 data() { 15 return { 16 dataName: '田中太郎' 17 } 18 } 19} 20</script>

投稿2021/04/26 02:00

編集2021/04/26 02:01
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

umino

2021/04/26 04:25

qnoirさん ご回答ありがとうございます、(すみません、回答いただいていたことに気付くのが遅れました) なるほど、readonly要素にdata(readOnly)を持たせてdataに設定する、というやり方ですね。 こちらでも、入力/表示を切り替えることを試してみます。 サンプルコードでまで丁寧にご提示いただきまして大変助かります。 ありがとうございました。
guest

0

ベストアンサー

Vueは詳しくないので的外れでしたら申し訳ないのですが、v-bind:classを使ってはどうでしょうか。

オブジェクト構文 | クラスとスタイルのバインディング — Vue.js


蛇足ですが、propsの構造はその書き方でいいのでしたでしょうか?

props | API — Vue.js

投稿2021/04/26 01:19

Lhankor_Mhy

総合スコア36115

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

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

umino

2021/04/26 02:14

Lhankor_Mhyさん さっそくのご回答ありがとうございます。 アドバイスいただいた通り修正、`v-bind:class`を使用したところ、切り替えができました。 ------------- <template> <div class="component"> 名前:<input type="text" readonly v-bind:class="ioMode" :value="hitoName"> </div> </template> <script> export default { data: function () { return { // read/write時の表示切り替え ioMode: { 'form-control-plaintext': this.readMode, readonly: this.readMode, } } }, props: { hitoName: String, //"田中太郎"などの文字列が入ってくる readMode: true, //true(表示モード),またはfalse(入力モード)の指定 }, } </script> ------------- また、propsの構造についてもご指摘ありがとうございます。 初期値のつもりで入れていましたが、認識が誤っていたことを知りました。 こちらも教えていただいたドキュメントを元に修正しました。 --------- props: { hitoName: { type: String, required: true, }, readonly: { type: Boolean, default: true, required: true, }, --------- おかげさまで期待した結果を取得することができました。 丁寧なご回答に感謝します。ありがとうございました。
Lhankor_Mhy

2021/04/26 02:27

qnoir さんのご回答を拝見して気づいたのですが、readonly はクラス指定ではなくて属性だったのですね。誤読をしていました、すみません。 qnoir さんのご回答をBAにされた方がいいと思います。
umino

2021/04/26 04:28

Lhankor_Mhyさん コメントありがとうございます、qnoirさんに回答いただいていることに気づいておりませんで、指摘いただけて助かりました。 属性であることはそうですね、ただ、教えていただいたこと(バインディング、propsの扱い方)などは普遍的なもので、大変勉強になりましたので、変わらず感謝いたします。 また、よろしくお願いします。
Lhankor_Mhy

2021/04/26 04:42

BAはベストアンサーは変更できますので、今からでもつけ直していただいた方がいいのではないかな、と……
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問