찾다
웹 프론트엔드View.jsVue에서 watch와 watchEffect의 차이점을 설명하는 기사

머리말

watch 함수와 watchEffect 함수는 모두 작성 및 사용법에 약간의 차이가 있습니다. 동일한 기능의 두 가지 다른 형태이지만 하단 레이어는 동일합니다. [관련 추천 : vue.js 영상 튜토리얼]

watch와 watchEffect의 비교

watch

  • watch 종속 데이터를 명시적으로 지정하고 종속 데이터가 업데이트될 때watch显式指定依赖数据,依赖数据更新时执行回调函数
  • 具有一定的惰性lazy 第一次页面展示的时候不会执行,只有数据变化的时候才会执行(设置immediate: true时可以变为非惰性,页面首次加载就会执行)
  • 监视ref定义的响应式数据时可以获取到原值
  • 既要指明监视的属性,也要指明监视的回调

watchEffect

  • watchEffect콜백 함수 실행

    어느 정도 게으른 부분이 있습니다. 페이지가 처음 표시될 때는 실행되지 않습니다. 데이터가 변경될 때만 실행됩니다(immediate를 설정하면 게으르지 않게 설정할 수 있습니다). true이며, 페이지가 처음 로드될 때 실행됩니다.)
  • ref

  • 에서 정의한 반응형 데이터를 모니터링할 때 원래 값을 얻을 수 있습니다. 모니터링되는 속성과 모니터링되는 콜백
  • watchEffect
  • watchEffect 자동 수집 종속 데이터, 종속 데이터가 업데이트되면

    자체적으로 재실행

즉시 실행됩니다. 관성이 없습니다.

  • 원래 값을 얻을 수 없고 변경된 값만 얻을 수 있습니다.

  • 모니터링할 속성을 지정할 필요는 없으며, 페이지에서 어떤 속성이 사용되는지 모니터링하기만 하면 됩니다. 콜백 모니터링

watch 함수에 대한 심층 분석

watch 함수에는 두 가지 함정이 있습니다.

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>

watch 취소 모니터링
  • 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와 계산

watchEffect와 계산은 약간 비슷합니다.

🎜🎜🎜그러나 계산은 계산된 값에 중점을 둡니다(반환은 콜백 함수의 값)이므로 반환 값을 작성해야 합니다. 🎜🎜🎜🎜그리고 watchEffect는 프로세스(콜백 함수의 함수 본문)에 더 많은 관심을 기울이기 때문에 반환 값을 작성할 필요가 없습니다. 🎜🎜🎜🎜computed는 값이 사용되지 않으면 호출되지 않지만 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, 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명
이 기사는 csdn에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제
프론트 엔드의 vue.js : 실제 응용 프로그램 및 예제프론트 엔드의 vue.js : 실제 응용 프로그램 및 예제Apr 11, 2025 am 12:12 AM

vue.js는 복잡한 사용자 인터페이스를 구축하는 데 적합한 점진적인 JavaScript 프레임 워크입니다. 1) 핵심 개념에는 반응 형 데이터, 구성 요소화 및 가상 DOM이 포함됩니다. 2) 실제 응용 분야에서는 TODO 응용 프로그램을 구축하고 Vuerouter를 통합하여 시연 할 수 있습니다. 3) 디버깅 할 때 VuedeVtools 및 Console.log를 사용하는 것이 좋습니다. 4) 성능 최적화는 V-IF/V- 쇼, 목록 렌더링 최적화, 구성 요소의 비동기로드 등을 통해 달성 할 수 있습니다.

vue.js and React : 주요 차이점 이해vue.js and React : 주요 차이점 이해Apr 10, 2025 am 09:26 AM

vue.js는 중소형 프로젝트에 적합하지만 REACT는 크고 복잡한 응용 프로그램에 더 적합합니다. 1. Vue.js의 응답 형 시스템은 종속성 추적을 통해 DOM을 자동으로 업데이트하여 데이터 변경을 쉽게 관리 할 수 ​​있습니다. 2. 반응은 단방향 데이터 흐름을 채택하고 데이터 흐름에서 하위 구성 요소로 데이터가 흐르고 명확한 데이터 흐름과 곤란하기 쉬운 구조를 제공합니다.

vue.js vs. React : 프로젝트 별 고려 사항vue.js vs. React : 프로젝트 별 고려 사항Apr 09, 2025 am 12:01 AM

vue.js는 중소형 프로젝트 및 빠른 반복에 적합한 반면 React는 크고 복잡한 응용 프로그램에 적합합니다. 1) vue.js는 사용하기 쉽고 팀이 불충분하거나 프로젝트 규모가 작는 상황에 적합합니다. 2) React는 더 풍부한 생태계를 가지고 있으며 고성능 및 복잡한 기능적 요구가있는 프로젝트에 적합합니다.

태그를 vue로 점프하는 방법태그를 vue로 점프하는 방법Apr 08, 2025 am 09:24 AM

VUE에서 태그의 점프를 구현하는 방법에는 다음이 포함됩니다. HTML 템플릿의 A 태그를 사용하여 HREF 속성을 지정합니다. VUE 라우팅의 라우터 링크 구성 요소를 사용하십시오. javaScript 에서이. $ router.push () 메소드를 사용하십시오. 매개 변수는 쿼리 매개 변수를 통해 전달 될 수 있으며 동적 점프를 위해 라우터 옵션에서 경로가 구성됩니다.

VUE의 구성 요소 점프를 구현하는 방법VUE의 구성 요소 점프를 구현하는 방법Apr 08, 2025 am 09:21 AM

VUE에서 구성 요소 점프를 구현하는 방법은 다음과 같습니다. 라우터 링크 및 & lt; router-view & gt; 하이퍼 링크 점프를 수행하고 대상 경로로 속성을 지정합니다. & lt; router-view & gt; 현재 라우팅 된 렌더링 된 구성 요소를 표시하는 구성 요소. 프로그래밍 방식 탐색을 위해 router.push () 및 router.replace () 메소드를 사용하십시오. 전자는 역사를 구하고 후자는 기록을 떠나지 않고 현재 경로를 대체합니다.

Vue의 div로 점프하는 방법Vue의 div로 점프하는 방법Apr 08, 2025 am 09:18 AM

VUE에서 DIV 요소를 점프하는 두 가지 방법이 있습니다. VUE 라우터를 사용하고 라우터 링크 구성 요소를 추가하십시오. @Click 이벤트 리스너를 추가하고 이것을 호출하십시오. $ router.push () 메소드를 점프하십시오.

vue 점프로 값을 전송하는 방법vue 점프로 값을 전송하는 방법Apr 08, 2025 am 09:15 AM

VUE에서 데이터를 전달하는 두 가지 주요 방법이 있습니다 : Props : 일원 데이터 바인딩, 부모 구성 요소에서 자식 구성 요소로 데이터를 전달합니다. 이벤트 : 이벤트와 사용자 정의 이벤트를 사용하여 구성 요소간에 데이터를 전달합니다.

Vue의 소개 방법으로 점프하는 방법Vue의 소개 방법으로 점프하는 방법Apr 08, 2025 am 09:12 AM

vue.js는 점프하는 세 가지 방법을 제공합니다. 기본 JavaScript API : Window.location.href를 사용하여 점프하십시오. Vue 라우터 : & lt; router-link & gt를 사용하십시오. 태그 또는이. $ router.push () 메소드 점프. 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 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

MinGW - Windows용 미니멀리스트 GNU

MinGW - Windows용 미니멀리스트 GNU

이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.

PhpStorm 맥 버전

PhpStorm 맥 버전

최신(2018.2.1) 전문 PHP 통합 개발 도구

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

SublimeText3 영어 버전

SublimeText3 영어 버전

권장 사항: Win 버전, 코드 프롬프트 지원!

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경