Table of Contents
1. computed
2. watch
How to write vu2
当前求和为:{{ sum }}
Vue3 writes like this
信息为:{{ msg }}
姓名:{{ person.name }}
年龄:{{ person.age }}
薪资:{{ person.job.j1.salary }}K
3. The routine of watchEffect
Home Web Front-end Vue.js How to use computed, watch, watchEffect in Vue3

How to use computed, watch, watchEffect in Vue3

May 12, 2023 pm 08:04 PM
vue3 computed watch

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>
Copy after login

2. watch

  • 1. It is consistent with the watch configuration function in Vue2.x

  • 2. Two small "pits":

    • When monitoring the responsive data defined by reactive: oldValue cannot be obtained correctly, and deep monitoring is forced to open (deep configuration fails)

    • When monitoring an attribute in the reactive data defined by reactive: the deep configuration is valid

How to write vu2

<template>
  <h3 id="当前求和为-nbsp-sum-nbsp">当前求和为:{{ 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>
Copy after login

Vue3 writes like this

1. Situation 1: Monitor a responsive data defined by ref

<template>
  <h3 id="当前求和为-nbsp-sum-nbsp">当前求和为:{{ 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>
Copy after login

How to use computed, watch, watchEffect in Vue3

watch can also pass a configuration item, including immediate and other configurations:

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

2. Situation 2: When multiple information needs to be monitored at the same time

<template>
  <h3 id="当前求和为-nbsp-sum-nbsp">当前求和为:{{ sum }}</h3>
  <button @click="sum++">点我sum++</button>
  <hr/>
  <h3 id="信息为-nbsp-msg-nbsp">信息为:{{ 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>
Copy after login

3. Case 3: Monitor a responsive data defined by reactive

<template>
  <h3 id="姓名-nbsp-person-name-nbsp">姓名:{{ person.name }}</h3>
  <h3 id="年龄-nbsp-person-age-nbsp">年龄:{{ person.age }}</h3>
  <h3 id="薪资-nbsp-person-job-j-salary-nbsp-K">薪资:{{ 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>
Copy after login

4. Case 4: Monitor a certain attribute of a responsive data defined by reactive

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

How to use computed, watch, watchEffect in Vue3

5. Scenario 5: Monitor some attributes of a responsive data defined by reactive

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

How to use computed, watch, watchEffect in Vue3

6. In special circumstances, to monitor an object attribute in the object, start deep:true

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

7. Monitor the object defined by ref Response data requires .value or deep:true

	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})
Copy after login

3. The routine of watchEffect

watch is: specify both the monitored attributes and The routine of monitoring callback

watchEffect is: you don’t need to specify which property to monitor, which property is used in the monitoring callback, then monitor which property

watchEffect is a bit like computed:

. But computed focuses on the calculated value (the return value of the callback function), so the return value

must be written. And watchEffect pays more attention to the process (the function body of the callback function), so there is no need to write the return value

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

For example, use the above example:

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>
Copy after login

Finally, we use watch and watchEffect to implement the name example

<template>
  姓:<input v-model="person.firstName">
  名:<input  v-model="person.lastName">
  <span>全名:{{fullName}}</span>
  <span>全名:<input v-model="fullName"></span>
</template>
<script lang="ts">
import {defineComponent, reactive, ref,watch,watchEffect} from &#39;vue&#39;;
export default defineComponent({
  setup(){
    let person = reactive({
      firstName:"张",
      lastName:"三"
    });

    const fullName = ref(&#39;&#39;);

    watch(person,({firstName,lastName})=>{
      fullName.value = firstName+"-"+lastName
    },{immediate:true})

    //不用使用immediate,默认执行一次
    /*watchEffect(()=>{
      fullName.value = person.firstName+"-"+person.lastName
    })*/

    watchEffect(()=>{
      const name = fullName.value.split(&#39;-&#39;);
      person.firstName = name[0];
      person.lastName = name[1];
    })
    return{
      person,
      fullName
    }
  }
});
</script>
<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>
Copy after login

The above is the detailed content of How to use computed, watch, watchEffect in Vue3. For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

Users encounter rare glitches: Samsung Watch smartwatches suddenly experience white screen issues Users encounter rare glitches: Samsung Watch smartwatches suddenly experience white screen issues Apr 03, 2024 am 08:13 AM

You may have encountered the problem of green lines appearing on the screen of your smartphone. Even if you have never seen it, you must have seen related pictures on the Internet. So, have you ever encountered a situation where the smart watch screen turns white? On April 2, CNMO learned from foreign media that a Reddit user shared a picture on the social platform, showing the screen of the Samsung Watch series smart watches turning white. The user wrote: "I was charging when I left, and when I came back, it was like this. I tried to restart, but the screen was still like this during the restart process." Samsung Watch smart watch screen turned white. The Reddit user did not specify the smart watch. Specific model. However, judging from the picture, it should be Samsung Watch5. Previously, another Reddit user also reported

vue3+vite: How to solve the error when using require to dynamically import images in src vue3+vite: How to solve the error when using require to dynamically import images in src May 21, 2023 pm 03:16 PM

vue3+vite:src uses require to dynamically import images and error reports and solutions. vue3+vite dynamically imports multiple images. If vue3 is using typescript development, require will introduce image errors. requireisnotdefined cannot be used like vue2 such as imgUrl:require(' .../assets/test.png') is imported because typescript does not support require, so import is used. Here is how to solve it: use awaitimport

How to refresh partial content of the page in Vue3 How to refresh partial content of the page in Vue3 May 26, 2023 pm 05:31 PM

To achieve partial refresh of the page, we only need to implement the re-rendering of the local component (dom). In Vue, the easiest way to achieve this effect is to use the v-if directive. In Vue2, in addition to using the v-if instruction to re-render the local dom, we can also create a new blank component. When we need to refresh the local page, jump to this blank component page, and then jump back in the beforeRouteEnter guard in the blank component. original page. As shown in the figure below, how to click the refresh button in Vue3.X to reload the DOM within the red box and display the corresponding loading status. Since the guard in the component in the scriptsetup syntax in Vue3.X only has o

How to select an avatar and crop it in Vue3 How to select an avatar and crop it in Vue3 May 29, 2023 am 10:22 AM

The final effect is to install the VueCropper component yarnaddvue-cropper@next. The above installation value is for Vue3. If it is Vue2 or you want to use other methods to reference, please visit its official npm address: official tutorial. It is also very simple to reference and use it in a component. You only need to introduce the corresponding component and its style file. I do not reference it globally here, but only introduce import{userInfoByRequest}from'../js/api' in my component file. import{VueCropper}from'vue-cropper&

How to use vue3+ts+axios+pinia to achieve senseless refresh How to use vue3+ts+axios+pinia to achieve senseless refresh May 25, 2023 pm 03:37 PM

vue3+ts+axios+pinia realizes senseless refresh 1. First download aiXos and pinianpmipinia in the project--savenpminstallaxios--save2. Encapsulate axios request-----Download js-cookienpmiJS-cookie-s//Introduce aixosimporttype{AxiosRequestConfig ,AxiosResponse}from"axios";importaxiosfrom'axios';import{ElMess

How to use defineCustomElement to define components in Vue3 How to use defineCustomElement to define components in Vue3 May 28, 2023 am 11:29 AM

Using Vue to build custom elements WebComponents is a collective name for a set of web native APIs that allow developers to create reusable custom elements (customelements). The main benefit of custom elements is that they can be used with any framework, even without one. They are ideal when you are targeting end users who may be using a different front-end technology stack, or when you want to decouple the final application from the implementation details of the components it uses. Vue and WebComponents are complementary technologies, and Vue provides excellent support for using and creating custom elements. You can integrate custom elements into existing Vue applications, or use Vue to build

What is the method of encapsulating Axios requests in vue3 and using it in components? What is the method of encapsulating Axios requests in vue3 and using it in components? May 21, 2023 am 10:49 AM

1. Create a folder to store the encapsulated js. I created it in src/request/axios.js. 2. The encapsulation code is as follows. Copy the following code directly into request.js to encapsulate get and post requests. What you need to configure yourself is: Change your request address, whether the tokenKey is token, and change it to the local token name you save. You can read the comments in the code, which is easy to understand. /**axios encapsulation*request interception, corresponding interception, and error unified processing*/importaxiosfrom'axios';importQSfrom'qs&#39

How to use Vue3 and Element Plus to implement automatic import How to use Vue3 and Element Plus to implement automatic import May 22, 2023 pm 04:58 PM

1 Introduction 1.1 Purpose ElementPlus uses on-demand introduction to greatly reduce the size of the packaged file. 1.2 The final effect is to automatically generate the components.d.ts file and introduce it into the file. The ElementPlus component automatically generates the components.d.ts file and introduce it into the file. ElementPlusAPI2 Preparation Install ElementPlus#Choose a package manager you like#NPM$npminstallelement-plus--save#Yarn$yarnaddelement-plus#pnpm$pnpminstallelement-plus3 Press

See all articles