electronのtextareaに入力ができなくなる、という事象について相談させてください。
親コンポーネント(memo.vue)に、ヘッダーとサイドバーを子コンポーネント(header.vue / sideBar.vue)として実装し、子コンポーネントのアクションを親コンポーネントに記載しています。
実装の内容は下記の通りです。
・ヘッダーの「保存」ボタンを押下した際に、textareaの内容を配列に保存(新規登録の場合は配列に追加、既存編集の場合は対象項目を上書き)しサイドバーに縦並びで一覧表示
・サイドバーの項目をクリックすると対象のメモの内容がtextareaに表示される
ここで下記の問題が起きています。
・「保存」ボタンを押下した際にtextareaの内容が変更不可となる。
・デバッグ実行し開発者ツールを開いている状態であれば、開発者ツールにて何かしらのアクション(何か項目を選択する等)すれば入力可能となる。
開発者ツールにて何かしらのアクションを行わなくても入力可能としたいのですがどのようにすればよいでしょうか。
何卒宜しくお願い致します。
【実装】
memo.vue
vue.js
1<template> 2 <div class='container'> 3 <headerVue class='header' 4 @saveChild="saveParent" 5 @addChild="addParent" 6 @delChild="delParent" 7 @outChild="outParent" 8 @settingChild="settingParent" /> 9 <div class='flex'> 10 <sideBarVue class="leftSidebar" :memoList = "memoList" @selectMemo="selectMemo" /> 11 <textarea spellcheck='false' v-model.lazy='textMemo' class='body' /> 12 </div> 13 </div> 14</template> 15 16<script> 17import headerVue from '../components/header.vue' 18import sideBarVue from '../components/sideBar.vue' 19 20export default { 21 data(){ 22 return{ 23 textMemo:'', 24 memoList:[{ 25 id:0, 26 memo:'' 27 }] 28 } 29 }, 30 components:{ 31 headerVue, 32 sideBarVue 33 }, 34 methods:{ 35 saveParent:function(){ 36 alert("保存ボタン押下") 37 38 // 既にメモリスト登録済か判断 39 if(sessionStorage.getItem("load")){ 40 let memoId = this.memoIDSearch() 41 // 登録中の場合、対象のメモ内容を上書き 42 this.memoList[memoId].memo = this.textMemo 43 }else{ 44 // 登録済ではない場合、新規登録用のIDを取得 45 let max = 0 46 if(this.memoList.length != 0){ 47 max = this.memoList.reduce(function (a, b) { 48 return a > b.id ? a : b.id 49 }, 0) 50 } 51 52 // memoListに新規登録 53 this.memoList.push({ 54 id:max +1, 55 memo:this.textMemo, 56 }) 57 58 // sessionStorageに保存する。 59 sessionStorage.setItem("load",max+1); 60 } 61 }, 62 addParent:function(){ 63 alert("追加ボタン押下") 64 65 // 他メモの編集中の場合、ポップアップを表示 66 if(sessionStorage.getItem("load")){ 67 if(window.confirm('現在の内容を保存しますか?')){ 68 let memoId = this.memoIDSearch() 69 this.memoList[memoId].memo = this.textMemo 70 } 71 } 72 73 this.textMemo = ''; 74 sessionStorage.removeItem("load"); 75 }, 76 delParent:function(){ 77 alert("削除ボタン押下") 78 if(sessionStorage.getItem("load")){ 79 if(window.confirm('現在の内容を削除しますか?')){ 80 let memoId = this.memoIDSearch(); 81 this.memoList[memoId].splice() 82 this.textMemo = ''; 83 } 84 }else{ 85 alert('対象のメモが存在しません') 86 } 87 }, 88 outParent:function(){ 89 alert("outボタン押下") 90 }, 91 settingParent:function(){ 92 alert("settingボタン押下") 93 }, 94 selectMemo:function(id){ 95 console.log(id) 96 let memoId = 0; 97 for(let i = 0;i<this.memoList.length;i++){ 98 if(this.memoList[i].id == id){ 99 memoId = i; 100 break; 101 } 102 } 103 this.textMemo = this.memoList[memoId].memo 104 }, 105 memoIDSearch:function(){ 106 let memoId = 0; 107 for(let i = 0;i<this.memoList.length;i++){ 108 if(this.memoList[i].id == sessionStorage.getItem("load")){ 109 memoId = i; 110 break; 111 } 112 } 113 return memoId; 114 } 115 } 116} 117</script> 118 119<!-- Add "scoped" attribute to limit CSS to this component only --> 120<style scoped> 121.container{ 122 width:100%; 123 height:90%; 124} 125.header{ 126 height:60px; 127 width:100%; 128 margin-left: 100px; 129} 130.flex{ 131 display: flex; 132} 133.leftSidebar{ 134 height:90%; 135 width:100px; 136} 137.body{ 138 height:90%; 139 font-size: 20px; 140 width:90%; 141} 142</style> 143
sideBar.vue
vue.js
1<template> 2 <div class="leftSidebar"> 3 <ul v-for="(item,index) in memoList" v-bind:key="index"> 4 <li><a @click="selectMemo(item.id)"> {{ item.memo }}</a></li> 5 </ul> 6 </div> 7</template> 8 9<script> 10export default { 11 props:["memoList"], 12 methods:{ 13 selectMemo: function (id) { 14 this.$emit('selectMemo',id) 15 } 16 } 17} 18</script> 19<style scoped> 20.leftSidebar{ 21 width:100px; 22} 23li{ 24 list-style:none; 25 margin:8px; 26 width:20px; 27} 28</style>
header.vue
vue.js
1<template> 2 <div class="header"> 3 <a @click="save" class="btn-gradient-flat"> 4 <span>保存</span> 5 </a> 6 <a @click="add" class="btn-gradient-flat"> 7 <span>追加</span> 8 </a> 9 <a @click="del" class="btn-gradient-flat"> 10 <span>削除</span> 11 </a> 12 <a @click="out" class="btn-gradient-flat"> 13 <span>出力</span> 14 </a> 15 <a @click="setting" class="btn-gradient-flat"> 16 <span>設定</span> 17 </a> 18 </div> 19</template> 20 21<script> 22export default { 23 methods:{ 24 save:function(){ 25 this.$emit('saveChild'); 26 }, 27 add:function(){ 28 this.$emit('addChild'); 29 }, 30 del:function(){ 31 this.$emit('delChild'); 32 }, 33 out:function(){ 34 this.$emit('outChild'); 35 }, 36 setting:function(){ 37 this.$emit('settingChild'); 38 } 39 } 40} 41</script> 42<style scoped> 43.header{ 44 display: -webkit-flex; 45 display: -moz-flex; 46 display: -ms-flex; 47 display: -o-flex; 48 display: flex; 49} 50.btn-gradient-flat { 51 display: flex; 52 padding: 0.3em 1em; 53 text-decoration: none; 54 color: #67c5ff; 55 border: solid 2px white; 56 border-radius: 3px; 57 transition: .4s; 58 59 justify-content: center; 60 align-items: center; 61 62 font-size: 25px; 63} 64.btn-gradient-flat:hover { 65 background: #67c5ff; 66 color: white; 67} 68</style>
【環境】
windows10
electron:v13.6.1
@vue/cli:4.5.15
あなたの回答
tips
プレビュー