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

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

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

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

Nuxt.js

Nuxt.jsは、ユニバーサルなSPAが開発可能なVue.jsベースのフレームワーク。UIの描画サポートに特化しており、SSRにおけるサーバーサイドとクライアントサイドのUIレンダリングなどさまざまな機能を持ちます。

Q&A

解決済

1回答

1000閲覧

Vue の機能で watch などで見ている変数が変更される前のタイミンングで何か処理を行う方法ってありますか??

Hayato1201

総合スコア232

Vue.js

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

Nuxt.js

Nuxt.jsは、ユニバーサルなSPAが開発可能なVue.jsベースのフレームワーク。UIの描画サポートに特化しており、SSRにおけるサーバーサイドとクライアントサイドのUIレンダリングなどさまざまな機能を持ちます。

1グッド

0クリップ

投稿2023/06/13 09:48

編集2023/06/15 23:30

実現したいこと

ts

1const hoge = ref<number>(1)

例えば上記のような変数 hoge があり、これを以下のように watch しているとします。

ts

1 watch( 2 () => hoge.value, 3 (n, o) => { 4 doSomething() 5 } 6 )

watch では無くても良いのですが、要は hoge の値が更新されてから doSomething() が呼ばれると思いますが、 hoge の値が変わるとなった時に実際の値が変わる前に doSomething() を呼ぶ方法って何かあったりしますでしょうか?

もし何か方法ご存知の方いましたらご教示いただけるととても助かります。。。

--------------------追記----------------------------------------------

以下状況となります。
・監視するのは hoge である必要がある
・hoge が実際に変わる前に関数を呼びたい
理由としては
上記 doSomething では hoge の値を参照しており hoge 変更のタイミングで変更前の値を参照して doSomething を実行したいという状況です。
ですので old の値を doSomething に渡せば実現可能なのですが、それだと他の関数との一貫性が崩れるなどの理由から避けたいと思い何か良い方法があれば、、と思い質問させていただいています。

tkc310👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

①hogeは変更監視の値として利用して、表示などに参照する値にはfugaを利用する方法

watch関数、第2引数のコールバックをasyncにして await doSomething にするのはいかがでしょうか?
https://ja.vuejs.org/guide/essentials/watchers.html#basic-example

ts

1<script setup> 2 const hoge = ref<number>(1); 3 const fuga = hoge; // ref<number>(1);でも問題ない 4 const doSomething = async () => { await piyo(); }; 5 6 watch(hoge, async (new, old) => { 7 await doSomething(); 8 fuga.value = new; 9 }); 10</script> 11 12<template> 13 <p> 14 <input v-model="hoge" /> 15 </p> 16 <p>{{ fuga }}</p> 17</template>

②hogeを変更監視・参照する値として利用する方法

hogeのみで監視・参照を行う必要があれば doSomething の処理結果に応じて、watch関数内で hoge.value の値を入れ直す方法はいかがでしょうか?
(これは循環参照が起こるかも?)

ts

1<script setup> 2 const hoge = ref<number>(1); 3 const doSomething = async () => { 4 const result = await piyo(); 5 return result; 6 }; 7 8 watch(hoge, async (new, old) => { 9 const condition = await doSomething(); 10 switch(condition) { 11 case 'success': 12 hoge.value = new; 13 break; 14 case 'fail': 15 hoge.value = old; 16 break; 17 case 'x': 18 ... 19 } 20 }); 21</script> 22 23<template> 24 <p> 25 <input v-model="hoge" /> 26 </p> 27</template>

追加の提案

hogeを変更するイベントが発行される要素の参照とイベントハンドラーを分ける方法

js

1<script setup> 2import { ref } from "vue"; 3 4const hoge = ref(1); 5 6const doSomthing = () => { 7 console.log("doSomthing", hoge.value); 8 9 return Promise.resolve("success"); 10}; 11 12const handleChange = async (event) => { 13 const result = await doSomthing(); 14 15 if (result) { 16 hoge.value = event.target.value; 17 } 18 19 console.log("handleChange", event.target.value); 20}; 21</script> 22 23<template> 24 <p> 25 <input :value="hoge" @input="handleChange" /> 26 </p> 27</template>

投稿2023/06/14 04:01

編集2023/06/16 01:37
taka-p

総合スコア28

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

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

Hayato1201

2023/06/15 23:29

ご回答ありがとうございます! 後出しの条件となってしまい申し訳ないのですが、以下状況となります。 ・監視するのは hoge である必要がある ・hoge が実際に変わる前に関数を呼びたい 理由としては 上記 doSomething では hoge の値を参照しており hoge 変更のタイミングで変更前の値を参照して doSomething を実行したいという状況です。 ですので old の値を doSomething に渡せば実現可能なのですが、それだと他の関数との一貫性が崩れるなどの理由から避けたいと思い何か良い方法があれば、、と思い質問させていただいています。 ですので大変申し訳ありませんが上記以外で何か可能な手はありそうでしょうか?
taka-p

2023/06/16 01:34 編集

@Hayato1201 なるほど、doSomthingの中では変更前のhogeを参照したいということですね。 watchは値の変更を検知するためのAPIのため、hogeの変更が発生する要素のイベントを監視して `handleChange` などのハンドラーで処理する形はいかがでしょうか? ``` <script setup> import { ref } from "vue"; const hoge = ref(1); const doSomthing = () => { // この時点でhogeは変更前の値 console.log("doSomthing", hoge.value); return Promise.resolve("success"); }; const handleChange = async (event) => { const result = await doSomthing(); if (result) { // この時点でhogeは変更後の値 hoge.value = event.target.value; } console.log("handleChange", event.target.value); }; </script> <template> <p> // v-modelではなく:value, +@input or @changeのように参照とハンドラーを分ける // @refs: https://ja.vuejs.org/guide/components/v-model.html#component-v-model <input :value="hoge" @input="handleChange" /> </p> </template> ``` https://codesandbox.io/s/vue-3-composition-api-demo-forked-sllvsz?file=/src/components/Test.vue
Hayato1201

2023/06/16 01:57

ご回答ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問