いつもお世話になります。
vueを使ってアプリケーションを開発しています。
inputタグの状態をDisabledで切り替えているのですが、切り替えた後に再度同じinputタグにフォーカスする方法についてご教示ください。
##概要
以前投稿したものと重複しますが、下記のようなフォームを作っています。
フォームでTodoを登録し、登録したものも含めて一覧で表示するとします。
API経由でデータを保存して、保存したデータを含めて表示用に加工された一覧データを取得して更新します。
その場合、APIにリクエストするのは下記の2つを順番に処理します。
- データベースにデータを追加
- データ一覧を更新
##実現したい事
APIで通信中はDisabledで入力を禁止し、通信完了後inputを解除するという事をして、解除後に再度inputにフォーカスさせたいです。
##ソース
下記のようなコンポーネントを用意しました。
APIの通信の処理は省略しますが、addTodo()
内でAPI経由で登録後、finally
の最後にフォーカスをinputに戻す処理をする想定です。
js
1<template> 2<div> 3 <div class="form-group row justify-content-center"> 4 <input 5 class="form-control col-sm-10" 6 type="text" 7 name="body" 8 ref="todo_form" 9 :disabled="processing" 10 /> 11 <button 12 class="btn btn-primary2 col-sm-2" 13 type="button" 14 @click="addTodo" 15 >送信する</button> 16 </div> 17 18 <div class="row justify-content-center"> 19 <div class="col-11"> 20 <div class="table-responsive"> 21 <table class="table"> 22 <thead> 23 <tr> 24 <th class="th-time">時間</th> 25 <th class="th-name">内容</th> 26 </tr> 27 </thead> 28 <tbody> 29 <tr v-for="todo in todos"> 30 <td>{{ todo.created_at }}</td> 31 <td>{{ todo.text }}</td> 32 </tr> 33 </tbody> 34 </table> 35 </div> 36 </div> 37 </div> 38</div> 39</template> 40 41<script> 42export default { 43 name: "TodoComponent", 44 props: { 45 disabled: { 46 type: Boolean, 47 default: false 48 } 49 }, 50 data () { 51 return { 52 body: '', 53 todos: [], 54 processing: false 55 } 56 }, 57 methods: { 58 // todo追加 59 addTodo() { 60 if(this.processing) { 61 return false; 62 } 63 // プロセスを始める 64 this.processing = true; 65 66 let self = this; 67 let data = { 68 body: this.body 69 }; 70 71 let url = 'http://api.example.com/api/todos'; 72 axios.post(url, data) 73 .then(async function(){ 74 await self.getTodos() 75 }) 76 .catch(function(e){ 77 console.log('error'); 78 }) 79 .finally(function() { 80 self.processing = false; 81 // inputにフォーカスを当てたい 82 // self.processing自体もfalseに変わっているがフォーカスが当たらない 83 self.$ref.todo_form.focus() 84 }); 85 }, 86 87 // 一覧取得 88 getTodos() { 89 let self = this; 90 let url = 'http://api.example.com/api/todos'; 91 92 axios.get(url, { 93 headers: { 94 "Content-Type": "application/json" 95 }, 96 data: {} 97 }) 98 .then(function(result){ 99 // 一覧を更新 100 self.todos = result.data.todos; 101 }) 102 .catch(function (e) { 103 console.error(e); 104 }) 105 }, 106 } 107 mounted() { 108 // 読み込み時に最新の一覧を取得しておく 109 this.getTodos(); 110 }, 111} 112</script>
現状
Disabledで入力禁止・解除自体は実装できているのですが、フォーカスをinputに戻す処理が動きません。
試しに、mounted()
でthis.$ref.todo_form.focus()
で動作自体するか確認してみたのですがフォーカスはされます。
Disabledのコールバックイベントのようなものがあるのでしょうか?
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。