検索
ホームページウェブフロントエンドVue.jsVue の watch と watchEffect の違いを説明した記事

はじめに

watch 関数と watchEffect 関数はどちらもリスナーです。書き方と使用法にいくつかの違いがあります。これらは同じ関数の 2 つの異なる形式ですが、最下層は同じです。 [関連する推奨事項: vue.js ビデオ チュートリアル ]

watch と watchEffect の比較

watch

  • watch依存データを明示的に指定します。依存データが更新されると、はコールバック関数を実行します。
  • は、ある程度の遅延があります。最初のページ表示時には実行されません。ただし、データが変更された場合にのみ実行されます ( immediate: true を設定すると、非遅延状態になる可能性があり、ページは最初にロードされたときに実行されます)
  • ref
  • 監視対象の属性と監視対象のコールバックの両方を指定する必要があります
##watchEffect

  • watchEffectデータ更新時に依存関係データを自動的に収集自身を再実行

  • 即時慣性はありません。ページが初めて読み込まれるときに実行されます

  • #元の値は取得できません。変更された値のみ
  • ##どの属性を監視するかを指定する必要はありません。監視コールバックで使用される属性が監視されます
  • watch 関数
watch 関数には 2 つの落とし穴があります。

reactive で定義された応答データの監視 (reactive は配列または配列の応答のみを定義できるため、データはオブジェクトです)オブジェクト タイプ): oldValue を正しく取得できず、詳細な監視が強制的にオンになり、詳細な構成は有効になりません。
  • reactive で定義された応答データ内の属性を監視し、その属性がオブジェクトである場合、詳細設定が有効になります。
  • #watch 関数の具体的な使用法は、詳細なコメントとともに次のコードに反映されています。
<template>
    <div>
        <h2 id="当前求和为-sum">当前求和为:{{sum}}</h2>
        <button @click="sum++">点我+1</button>
        <hr>
        <h2 id="当前的信息为-msg-nbsp">当前的信息为:{{msg}} </h2>
        <!-- 点击button拼接! -->
        <button @click="msg+=&#39;!&#39;">修改数据</button>
        <hr>
        <h2 id="姓名-person-name">姓名:{{person.name}}</h2>
        <h2 id="年龄-person-age">年龄:{{person.age}}</h2>
        <h2 id="薪资-person-job-j-salary">薪资:{{person.job.j1.salary}}</h2>
        <button @click="person.name+=&#39;~&#39;"> 修改姓名</button>
        <button @click="person.age++"> 增长年龄</button>
        <button @click="person.job.j1.salary++"> 增长薪资</button>
    </div>
</template>

<script>
import {ref,reactive,watch,watchEffect} from &#39;vue&#39;
export default {
   name:&#39;demo&#39;,
   setup(){
       //数据
       let sum = ref(0)
       let msg = ref(&#39;hello&#39;)
       let person = reactive({
           name:&#39;zhangsan&#39;,
           age:&#39;18&#39;,
           job:{
               j1:{
                   salary:20
               }
           }
       })
       //监视(三个参数,第一个是监视的对象,第二个是监视的回调函数,第三个是监视的配置)

       //情况一:监视ref所定义的一个响应式数据
       watch(sum,(newValue,oldValue)=>{
           console.log(&#39;sum的值变化了&#39;,newValue,oldValue)
       },{immediate:true,deep:true})
       //immediate的值为true时表示非惰性的立即执行的(默认情况下是false)
       //deep深层次触发(此处设置deep无意义)

       //情况二:监视ref所定义的多个响应式数据,写成数组的形式

       watch([sum,msg],(newValue,oldValue)=>{
           console.log(&#39;sum或者msg变了&#39;,newValue,oldValue)
       })

       //情况三:监视reactive所定义的响应式数据
                //若监视的是reactive定义的响应式数据,则无法正确获得oldValue
                //若监视的是reactive定义的响应式数据,则watch会强制开启深度监视

        //我们发现改变person的任意一个属性都会被监视到
        watch(person,(newValue,oldValue)=>{
            console.log(&#39;person改变了&#39;,newValue,oldValue)
        }) 
        
        //我们尝试设置deep:false,关闭深度监听(目的:改变job的值不会被watch监听到)
        //但是我们发现deep:false并没有生效,原因是此时watch监视的是reactive定义的响应式对象,默认强制开启了深度监听
        watch(person,(newValue,oldValue)=>{
            console.log(&#39;person改变了&#39;,newValue,oldValue)
        },{deep:false}) 
        


      //情况四:监视reactive所定义的响应式数据中的某个属性
       watch(()=>person.name,(newValue,oldValue)=>{
            console.log(&#39;person的job改变了&#39;,newValue,oldValue)
        })
         watch(()=>person.age,(newValue,oldValue)=>{
            console.log(&#39;person的job改变了&#39;,newValue,oldValue)
        })
        watch(()=>person.job,(newValue,oldValue)=>{
            console.log(&#39;person的job改变了&#39;,newValue,oldValue)
        })
        //从上边我们发现改变name,age都会触发监听,但是改变job不会
        //这是因为name和age属性的值只是一个简单的基本类型数据,
        //而job属性的值是一个对象,比较深,想要监视到,就要开启深度监视,程序如下:
        watch(()=>person.job,(newValue,oldValue)=>{
            console.log(&#39;person的job改变了&#39;,newValue,oldValue)
        },{deep:true})//此时job改变,会被监视到,此处的deep配置生效
        //需要和情况三进行区分,此处watch监视的是reactive所定义的对象中的某个属性,而情况三watch监视的是reactive所定义的对象

      //情况五:监视reactive所定义的响应式数据中的某些属性,写成数组的形式
        watch([()=>person.name,()=>person.age],(newValue,oldValue)=>{
            console.log(&#39;person的name或age改变了&#39;,newValue,oldValue)
        })

       //返回一个对象(常用)
       return{
           sum,
           msg,
           person
       }
   }
}
</script>

監視キャンセル監視

const stop1 = watch(
  [() => nameObj.name, () => nameObj.name],
  ([curName, curEng], [prevName, curEng]) => {
    console.log(curName, curEng, "----", prevName, curEng);
    setTimeout(() => {
      stop();
    }, 5000);
  });

watchEffect 関数の詳細な分析

関数の使用法は、詳細なコメントとともに次のコードに示されています。

#
<template>
    <div>
        <h2 id="当前求和为-sum">当前求和为:{{sum}}</h2>
        <button @click="sum++">点我+1</button>
        <hr>
        <h2 id="当前的信息为-msg-nbsp">当前的信息为:{{msg}} </h2>
        <!-- 点击button拼接! -->
        <button @click="msg+=&#39;!&#39;">修改数据</button>
        <hr>
        <h2 id="姓名-person-name">姓名:{{person.name}}</h2>
        <h2 id="年龄-person-age">年龄:{{person.age}}</h2>
        <h2 id="薪资-person-job-j-salary">薪资:{{person.job.j1.salary}}</h2>
        <button @click="person.name+=&#39;~&#39;"> 修改姓名</button>
        <button @click="person.age++"> 增长年龄</button>
        <button @click="person.job.j1.salary++"> 增长薪资</button>
    </div>
</template>

<script>
import {ref,reactive,watch,watchEffect} from &#39;vue&#39;
export default {
   name:&#39;demo&#39;,
   setup(){
       //数据
       let sum = ref(0)
       let msg = ref(&#39;hello&#39;)
       let person = reactive({
           name:&#39;zhangsan&#39;,
           age:&#39;18&#39;,
           job:{
               j1:{
                   salary:20
               }
           }
       })
//watchEffect函数内部所指定的回调中用到的数据只要发生变化,就会重新执行回调
//只有一个参数,就是回调
    watchEffect(()=>{
        const x1 = sum.value//因为sum是ref定义的响应式数据,需要使用.value调用
        const x2 = person.age
        console.log(&#39;watchEffect配置的回调执行了&#39;)
    })
           return{
           sum,
           msg,
           person
       }
   }
}
</script>

watchEffect キャンセル監視

const stop = watchEffect(() => {
  console.log(nameObj.name);
  setTimeout(() => {
    stop();
  }, 5000);});
watchEffect と computed

watchEffect は computed に少し似ています:

ただし、computed は計算された値に焦点を当てます。 (コールバック関数の戻り値)なので、戻り値を記述する必要があります。

  • そして、watchEffect は処理 (コールバック関数の関数本体) に重点を置くため、戻り値を記述する必要がありません。

  • computed は、値が使用されていない場合には呼び出されませんが、watchEffect は常に 1 回呼び出されます。

  • 例:

    <template>
        <div>
            <h2 id="当前求和为-sum">当前求和为:{{sum}}</h2>
            <button @click="sum++">点我+1</button>
            <hr>
            <h2 id="当前的信息为-msg-nbsp">当前的信息为:{{msg}} </h2>
            <!-- 点击button拼接! -->
            <button @click="msg+=&#39;!&#39;">修改数据</button>
            <hr>
            <h2 id="姓名-person-name">姓名:{{person.name}}</h2>
            <h2 id="年龄-person-age">年龄:{{person.age}}</h2>
            <h2 id="薪资-person-job-j-salary">薪资:{{person.job.j1.salary}}</h2>
            <button @click="person.name+=&#39;~&#39;"> 修改姓名</button>
            <button @click="person.age++"> 增长年龄</button>
            <button @click="person.job.j1.salary++"> 增长薪资</button>
        </div>
    </template>
    
    <script>
    import {ref,reactive,watch,watchEffect, computed} from &#39;vue&#39;
    export default {
       name:&#39;demo&#39;,
       setup(){
           //数据
           let sum = ref(0)
           let msg = ref(&#39;hello&#39;)
           let person = reactive({
               name:&#39;zhangsan&#39;,
               age:&#39;18&#39;,
               job:{
                   j1:{
                       salary:20
                   }
               }
           })
           let person1 = reactive({
               firstName:&#39;张&#39;,
               lastName:&#39;三&#39;
           })
           //computed
           //计算属性——简写(没有考虑计算属性被修改的情况)
           person1.fullName = computed(()=>{
               //必须含有返回值
               return person1.firstName+&#39;-&#39;+person1.lastName
           })
    
           //计算属性——完整写法(考虑读和写)
           person1.fullName = computed({
               //必须含有返回值
               get(){
                   return person1.firstName+&#39;-&#39;+person1.lastName
               },
               set(value){
                   const nameArr = value.split(&#39;-&#39;)
                   person1.firstName = nameArr[0]
                   person1.lastName = nameArr[1]
               }
           })
           //watchEffect
            //可以不写给返回值
            watchEffect(()=>{
                const x1 = sum.value//因为sum是ref定义的响应式数据,需要使用.value调用
                const x2 = person.age
                console.log(&#39;watchEffect配置的回调执行了&#39;)
            })
             return{
               sum,
               msg,
               person,
               person1
           }
       }
    }
    </script>

以上がVue の watch と watchEffect の違いを説明した記事の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事はcsdnで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。
vue.js vs.バックエンドフレームワーク:区別を明確にしますvue.js vs.バックエンドフレームワーク:区別を明確にしますApr 25, 2025 am 12:05 AM

Vue.jsはフロントエンドフレームワークであり、バックエンドフレームワークはサーバー側のロジックを処理するために使用されます。 1)VUE.JSは、ユーザーインターフェイスの構築に焦点を当て、コンポーネントおよびレスポンシブデータバインディングを介して開発を簡素化します。 2)ExpressやDjangoなどのバックエンドフレームワークは、HTTPリクエスト、データベース操作、ビジネスロジックを処理し、サーバーで実行します。

vue.jsとフロントエンドスタック:接続の理解vue.jsとフロントエンドスタック:接続の理解Apr 24, 2025 am 12:19 AM

VUE.JSは、開発効率とユーザーエクスペリエンスを向上させるために、フロントエンドテクノロジースタックと密接に統合されています。 1)建設ツール:Webpackおよびロールアップと統合して、モジュール開発を実現します。 2)国家管理:VUEXと統合して、複雑なアプリケーションステータスを管理します。 3)ルーティング:Vuerouterと統合して、単一ページのアプリケーションルーティングを実現します。 4)CSSプリプロセッサ:SASSをサポートし、スタイル開発効率を改善するために少なくなります。

Netflix:React(またはその他のフレームワーク)の使用の調査Netflix:React(またはその他のフレームワーク)の使用の調査Apr 23, 2025 am 12:02 AM

Netflixは、Reactのコンポーネント設計と仮想DOMメカニズムが複雑なインターフェイスと頻繁な更新を効率的に処理できるため、ユーザーインターフェイスを構築するためにReactを選択しました。 1)コンポーネントベースの設計により、Netflixはインターフェイスを管理可能なウィジェットに分解し、開発効率とコード保守性を向上させることができます。 2)仮想DOMメカニズムは、DOM操作を最小化することにより、Netflixユーザーインターフェイスの滑らかさと高性能を保証します。

vue.jsとフロントエンド:フレームワークに深く飛び込むvue.jsとフロントエンド:フレームワークに深く飛び込むApr 22, 2025 am 12:04 AM

Vue.jsは、使いやすく強力なため、開発者に愛されています。 1)そのレスポンシブデータバインディングシステムは、ビューを自動的に更新します。 2)コンポーネントシステムは、コードの再利用性と保守性を向上させます。 3)コンピューティングプロパティとリスナーは、コードの読みやすさとパフォーマンスを向上させます。 4)Vuedevtoolsの使用とコンソールエラーのチェックは、一般的なデバッグ手法です。 5)パフォーマンスの最適化には、主要な属性、計算された属性、およびキープアライブコンポーネントの使用が含まれます。 6)ベストプラクティスには、クリアコンポーネントの命名、単一ファイルコンポーネントの使用、ライフサイクルフックの合理的な使用が含まれます。

フロントエンドのvue.jsの力:主要な機能と利点フロントエンドのvue.jsの力:主要な機能と利点Apr 21, 2025 am 12:07 AM

Vue.jsは、効率的で保守可能なフロントエンドアプリケーションを構築するのに適した進歩的なJavaScriptフレームワークです。その主な機能には、1。レスポンシブデータバインディング、2。コンポーネント開発、3。仮想DOM。これらの機能を通じて、VUE.JSは開発プロセスを簡素化し、アプリケーションのパフォーマンスと保守性を向上させ、最新のWeb開発で非常に人気を博しています。

Vue.jsはReactよりも優れていますか?Vue.jsはReactよりも優れていますか?Apr 20, 2025 am 12:05 AM

Vue.jsとReactにはそれぞれ独自の利点と欠点があり、選択はプロジェクトの要件とチームの条件に依存します。 1)Vue.jsは、シンプルで使いやすいため、小さなプロジェクトや初心者に適しています。 2)Reactは、その豊富な生態系とコンポーネント設計のため、大規模なプロジェクトと複雑なUIに適しています。

Vue.jsの関数:フロントエンドでのユーザーエクスペリエンスの強化Vue.jsの関数:フロントエンドでのユーザーエクスペリエンスの強化Apr 19, 2025 am 12:13 AM

Vue.jsは複数の機能を介してユーザーエクスペリエンスを改善します。1。レスポンシブシステムは、リアルタイムデータフィードバックを実現します。 2。コンポーネント開発により、コードの再利用性が向上します。 3. Vuerouterはスムーズなナビゲーションを提供します。 4.動的データの結合および遷移アニメーションは、相互作用効果を強化します。 5.エラー処理メカニズムにより、ユーザーのフィードバックが保証されます。 6.パフォーマンスの最適化とベストプラクティスは、アプリケーションのパフォーマンスを改善します。

Vue.js:Web開発におけるその役割を定義しますVue.js:Web開発におけるその役割を定義しますApr 18, 2025 am 12:07 AM

Web開発におけるVue.jsの役割は、開発プロセスを簡素化し、効率を向上させるプログレッシブJavaScriptフレームワークとして機能することです。 1)開発者は、レスポンシブデータのバインディングとコンポーネント開発を通じてビジネスロジックに集中できるようになります。 2)VUE.JSの作業原則は、パフォーマンスを最適化するためにレスポンシブシステムと仮想DOMに依存しています。 3)実際のプロジェクトでは、VUEXを使用してグローバルな状態を管理し、データの応答性を最適化することが一般的な慣行です。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

SecLists

SecLists

SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

SublimeText3 英語版

SublimeText3 英語版

推奨: Win バージョン、コードプロンプトをサポート!

AtomエディタMac版ダウンロード

AtomエディタMac版ダウンロード

最も人気のあるオープンソースエディター

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境