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

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

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

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

JavaScript

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

TypeScript

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

Q&A

1回答

447閲覧

テラテイルの様な入力フォームを作りたいです。

ShojiroAbe

総合スコア31

Vue.js

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

JavaScript

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

TypeScript

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

0グッド

0クリップ

投稿2023/02/27 16:11

テラテイルの様な入力フォームを作成しています。
その際に、コードを記入するような場所を用意し、テキストエリアとプレビューとで連動させたいです。
また、コード記入エリアを随時追加しても問題ない様な実装をしたいです。

※Typescriptも採用しておりますが、まだ本腰入れて組み込んでいないのでスルーしてください…

vue

1 <div class="options"> 2 <div @click="addOptions('code')" class="icon"> 3 <img 4 src="../assets/images/code_icon.png" 5 alt="ソースコード追加" 6 /> 7 </div> 8 </div> 9 10 <textarea 11 v-model="mainText" 12 @input="updatePreview" 13 id="textarea1" 14 placeholder="本文" 15 class="materialize-textarea validate textarea" 16 > 17 </textarea> 18 </div> 19 <div class="preview"> 20 <p>プレビュー:</p> 21 <div class="preview-body" v-html="preview"></div> 22 </div>

javascript

1<script setup lang="ts"> 2import { ref, computed } from "vue"; 3// import codeEditor from "@/components/codeEditor.vue"; 4 5const title = ref(""); 6const mainText = ref(""); 7const preview = ref(""); 8const codeText = ref(""); 9 10// テキストエリアとプレビューを同期させる 11const updatePreview = () => { 12 const texts = mainText.value.split("\n"); 13 const paragraphs = texts.map((text) => { 14 if (text === "") { 15 return "<br>"; 16 } else { 17 return `<p>${text}</p>`; 18 } 19 }); 20 preview.value = paragraphs.join(""); 21}; 22 23// フォーム内各オプション実装 24const addOptions = function (type: string) { 25 // コードエディター挿入 26 if (type === "code") { 27 mainText.value += `----ここに言語を入力\n${codeText.value}\n----\n`; 28 preview.value += `<div><code>コード${codeText.value}</code></div>`; 29 } 30}; 31

【①実装画面】
イメージ説明

【②通常テキスト入力時】
イメージ説明

【③コード挿入ボタン押下後】
イメージ説明

【④「----ここに言語を入力----」の中に入力時】
イメージ説明

【問題点】
最低限の入力と同期は実装できました
しかし③の時に生成されたテキストエリア何の「----ここに言語を入力----」内に入力されると
生成された「<div><code>コード${codeText.value}</code></div>」が削除され、④の画像の様に上書きされてしまいます。

これらの原因と解決方法をどなたか何卒ご教示ください。

※Vue3、Composition API を採用しております

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

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

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

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

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

guest

回答1

0

原因は

Markdown

1----ここに言語を入力 2コード 3----

を、処理するコードが実装されていないことではないですか?

同期をとらせるため、「コード」という文字が追加するとして、

JavaScript

1 if (type === "code") { 2 mainText.value += `----ここに言語を入力\nコード${codeText.value}\n----\n`; 3 preview.value += `<div><code>コード${codeText.value}</code></div>`; 4 }

updatePreviewで、----が来たときの処理を追加してみたらどうでしょう?

投稿2023/03/11 19:06

tritree

総合スコア24

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問