>  기사  >  웹 프론트엔드  >  Vue3에서 계산, 감시, watchEffect를 사용하는 방법

Vue3에서 계산, 감시, watchEffect를 사용하는 방법

王林
王林앞으로
2023-05-12 20:04:101444검색

1.computed

<template>
  姓:<input v-model="person.firstName"><br/><br/>
  名:<input  v-model="person.lastName"><br/><br/>
  <span>全名:{{person.fullname}}</span><br/><br/>
  <span>全名:<input v-model="person.fullname"></span>
</template>

<script>
import {reactive,computed} from &#39;vue&#39;
export default {
  name: &#39;HelloWorld&#39;,
  setup(){
    let person = reactive({
      firstName:"张",
      lastName:"三"
    })
    //computed简写形式,没考虑修改
    /*person.fullname = computed(()=>{
      return person.firstName+"-"+person.lastName;
    })*/
    person.fullname = computed({
      get(){
        return person.firstName+"-"+person.lastName;
      },
      set(value){
        const nameArr = value.split(&#39;-&#39;);
        person.firstName = nameArr[0];
        person.lastName = nameArr[1];
      }
    })
    return{
      person,
    }
  }
}
</script>

2.watch

  • 1. Vue2의 watch 구성 기능과 일치하는 경우: oldValue를 올바르게 얻을 수 없으면 심층 모니터링이 강제로 열립니다(심층 구성이 유효하지 않음)

  • 반응성: 심층 구성이 유효함

    • vu2가

      <template>
        <h3>当前求和为:{{ sum }}</h3>
        <button @click="sum++">点我sum++</button>
      </template>
      
      <script>
      import {ref} from &#39;vue&#39;
      
      export default {
        name: &#39;Demo&#39;,
        watch: {
          /*sum(oldValue,newValue){
            console.log("sum发生了变化",oldValue,newValue);
          }*/
          sum: {
            immediate: true,
            deep:true,
            handler(newValue,oldValue) {
              console.log("sum发生了变化", newValue, oldValue);
            }
          }
        },
        setup() {
          let sum = ref(0);
      
          return {
            sum,
          }
        }
      }
      </script>
    • Vue3에 기록된 특정 속성 모니터링
    • 1: ref
    <template>
      <h3>当前求和为:{{ sum }}</h3>
      <button @click="sum++">点我sum++</button>>
    </template>
    <script>
    import {ref, watch} from &#39;vue&#39;
    export default {
      name: &#39;Demo&#39;,
      setup() {
        let sum = ref(0);
        let msg = ref("你好啊");
        //情况一:监视ref所定义的一个响应式数据
        watch(sum, (newValue, oldValue) => {
          console.log("sum发生了变化", newValue, oldValue);
        })
    
        return {
          sum
        }
      }
    }
    </script>
    로 정의된 반응형 데이터 모니터링

watch 다음에서 구성 항목을 전달하고 즉시 구성 및 기타 구성을 전달할 수도 있습니다.

watch(sum, (newValue, oldValue) => {
      console.log("sum发生了变化", newValue, oldValue);
    },{immediate:true})

2 상황 2: 동시에 모니터링해야 하는 여러 정보가 있는 경우

Vue3에서 계산, 감시, watchEffect를 사용하는 방법

<template>
  <h3>当前求和为:{{ sum }}</h3>
  <button @click="sum++">点我sum++</button>
  <hr/>
  <h3>信息为:{{ msg }}</h3>
  <button @click="msg+=&#39;!&#39;">点我sum++</button>
</template>
<script>
import {ref, watch} from &#39;vue&#39;
export default {
  name: &#39;Demo&#39;,
  setup() {
    let sum = ref(0);
    let msg = ref("你好啊");

    //情况二:监视ref所定义的多个响应式数据
    watch([sum,msg],(newValue, oldValue) => {
      console.log("sum发生了变化", newValue, oldValue);
    })

    return {
      sum,
      msg
    }
  }
}
</script>

3. 사례 3: 반응성

<template>
  <h3>姓名:{{ person.name }}</h3>
  <h3>年龄:{{ person.age }}</h3>
  <h3>薪资:{{ person.job.j1.salary }}K</h3>
  <button @click="person.name+=&#39;~&#39;">修改姓名</button>
  <button @click="person.age++">修改年龄</button>
  <button @click="person.job.j1.salary++">涨薪</button>
</template>
<script>
import {reactive, watch} from &#39;vue&#39;

export default {
  name: &#39;Demo&#39;,
  setup() {
    let person = reactive({
      name: "张三",
      age: 18,
      job:{
        j1:{
          salary:20
        }
      }
    })
    //情况三:监视reactive所定义的一个响应式数据全部属性
    // 1\注意:无法正确获取oldvalue
    // 2\注意:强制开启了深度监视(deep配置无效)
    watch(person, (newValue, oldValue) => {
      console.log("person发生了变化", newValue, oldValue);
    })

    return {
      person
    }
  }
}
</script>

4. 사례 4: 반응성

5: 속성으로 정의된 반응성 데이터 모니터링 Reactive

//情况四:监视reactive所定义的一个响应式数据某个属性
    watch(()=>person.name, (newValue, oldValue) => {
      console.log("person的name发生了变化", newValue, oldValue);
    })

6. 특수 상황, 객체의 객체 속성을 모니터링하여 deep:trueVue3에서 계산, 감시, watchEffect를 사용하는 방법

//情况五:监视reactive所定义的一个响应式数据某个属性
    watch([()=>person.name,()=>person.age], (newValue, oldValue) => {
      console.log("person的name或age发生了变化", newValue, oldValue);
    })

을 시작하려면 ref로 정의된 객체 응답 데이터를 모니터링해야 합니다. .value 또는 deep:true

watch(()=>person.job, (newValue, oldValue) => {
	console.log("person的job发生了变化", newValue, oldValue);
},{deep:true})//由于监视的是reactive对象中的某个属性,deep奏效

3 watchEffectVue3에서 계산, 감시, watchEffect를 사용하는 방법

watch의 루틴은 둘 다 지정합니다. 속성을 모니터링할 때 모니터링되는 콜백

watchEffect도 지정해야 합니다. > 루틴은 다음과 같습니다. 모니터링할 속성, 모니터링되는 콜백에 사용되는 속성, 모니터링할 속성을 지정할 필요가 없습니다

watchEffect 계산과 비슷합니다. 코드>:

. 하지만 computed는 계산된 값(콜백 함수의 반환 값)에 중점을 두기 때문에 반환 값을 작성해야 합니다

. 그리고 watchEffect는 프로세스(콜백 함수의 함수 본문)에 더 많은 관심을 기울이기 때문에 반환 값을 작성할 필요가 없습니다.

	let person = ref({
      name: "张三",
      age: 18,
      job:{
        j1:{
          salary:20
        }
      }
    })
    watch(person.value, (newValue, oldValue) => {
      console.log("person的value发生了变化", newValue, oldValue);
    })
    或
    watch(person, (newValue, oldValue) => {
      console.log("person的value发生了变化", newValue, oldValue);
    },{deep:true})

예를 들어 위의 예를 사용하세요. watch 的套路是:既要指明监视的属性,也要指明监视的回调

watchEffect 的套路是:不用指明监视哪个属性,监视的回调中用到哪个属性,那就监视哪个属性

watchEffect有点像computed

。但computed注重的计算出来的值(回调函数的返回值),所以必须要写返回值

。而watchEffect

//watchEffect所指定的回调中用到的数据只要发生变化,则直接重新执行回调
watchEffect(()=>{
	const xl = sum.value
	const x2 = person.age
	console.log( "watchEffect配置的回调执行了")
})

마지막으로 watch 및 watchEffect를 사용하여 이름의 예를 구현합니다.

import {reactive,watchEffect} from &#39;vue&#39;
export default {
  name: &#39;Demo&#39;,
  setup() {
    let person = reactive({
      name: "张三",
      age: 18,
      job:{
        j1:{
          salary:20
        }
      }
    })
    watchEffect(()=>{
      const x1 = person.name;
      console.log("watchEffect所指定的回调执行了"+x1);
    })
    return {
      person
    }
  }
}
</script>

위 내용은 Vue3에서 계산, 감시, watchEffect를 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제