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

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

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

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

Q&A

解決済

1回答

2253閲覧

【Vue】inputタグのDisabledの値を切り替えた時に再フォーカスをしたい。

hasshy

総合スコア102

Vue.js

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

0グッド

0クリップ

投稿2019/10/28 06:29

いつもお世話になります。

vueを使ってアプリケーションを開発しています。
inputタグの状態をDisabledで切り替えているのですが、切り替えた後に再度同じinputタグにフォーカスする方法についてご教示ください。

##概要
以前投稿したものと重複しますが、下記のようなフォームを作っています。
フォームでTodoを登録し、登録したものも含めて一覧で表示するとします。

イメージ説明

API経由でデータを保存して、保存したデータを含めて表示用に加工された一覧データを取得して更新します。
その場合、APIにリクエストするのは下記の2つを順番に処理します。

  1. データベースにデータを追加
  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のコールバックイベントのようなものがあるのでしょうか?

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

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

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

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

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

guest

回答1

0

自己解決

自己解決しました。
解決方法は、$nextTickを使う事でした。

自信はありませんが、nextTickを使う事でdisabledで入力状態を切り替わるのを待つ事ができたためだと思われます。

js

1 .finally(function() { 2 self.processing = false; 3 self.$nextTick(function(){ 4 self.$refs.todo_form.focus(); 5 }); 6 });

投稿2019/10/28 06:52

編集2019/10/29 05:13
hasshy

総合スコア102

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問