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

バッドをするには、ログインかつ
こちらの条件を満たす必要があります。