Vue3学习

本文详细介绍了Vue3中的组件生命周期,包括beforeMount、mounted等关键阶段,并探讨了ref和reactive在状态管理中的应用。同时,解释了watch和watchEffect的区别和使用场景,如数据监听、深度监听以及它们在处理响应式数据时的注意事项。
摘要由CSDN通过智能技术生成

 vue3中的生命周期:

setup 开始创建组件前

onBeforeMount 组件挂载到页面之前执行

onMounted 组件挂载到页面之后执行

onBeforeUpdate 组件更新之前

onUpdated 组件更新之后

onBeforeUnmount(): 组件卸载之前执行的函数;

onUnmounted(): 组件卸载完成后执行的函数;

<template>
  <button @click="increment">
    {{ state }}
  </button>

  <button @click="increment1">
    {{ state1.count }}
  </button>

  姓:<input v-model="Person.X"><br>
  名:<input v-model="Person.M"><br>
  双向响应:<input v-model="Person.AXM">

 <h2>年龄:{{Person.age}}</h2>
 <button @click="Person.age++">+1</button>
</template>

<script setup>
//钩子函数steup
//reactive、ref函数
//计算属性 computed

import { reactive ,ref ,computed ,watch ,watchEffect } from 'vue'

const state = ref(0)
const state1 = reactive({ count: 0 })

function increment() {
  state.value++
}
function increment1() {
  state1.count++
}

const Person=reactive({X:'张',M:'三'})
Person.AXM=computed({
  get(){
    return Person.X+'-'+Person.M
  },
  set(value){
    const arr=value.split('-')
    Person.X=arr[0]
    Person.M=arr[1]
  }
})

//computed(回调函数)
const mytext = ref('')
const computedSum = computed(() => mytext.value.substring(0, 1).toUpperCase() + 
  mytext.value.substring(1))
  // 注意mytext.value

</script>

监听watch和watchEffect

(1) watch
  • 第一次页面展示的时候不会执行,数据变化的时候才会执行,只有设置了初始化监听才会监听(immediate: true)
  • 参数可以拿到当前值和原始值
  • 可以侦听多个数据的变化,用一个侦听器承载
(2)watchEffect
  • 页面的首次加载就会执行。
  • 自动检测内部代码,代码中有依赖 便会执行
  • 不需要传递要侦听的内容,会自动感知代码依赖,不需要传递很多参数,只要传递一个回调函数
  • 不能获取之前数据的值 只能获取当前值
  • 一些异步的操作放在这里会更加合适

(3)watch函数有两个小坑

  • 监视reactive定义的响应式数据(该数据为一个对象,因为reactive只能定义数组或对象类型的响应式)时:oldValue无法正确获取,会强制开启深度监视,deep配置不生效。
  • 监视reactive定义的响应式数据中的某个属性时,且该属性是一个对象,那么此时deep配置生效。
import {ref,reactive,watch,watchEffect} from 'vue'
export default {
   name:'demo',
   setup(){
       //数据
       let sum = ref(0)
       let msg = ref('hello')
       let person = reactive({
           name:'zhangsan',
           age:'18',
           job:{
               j1:{
                   salary:20
               }
           }
       })
       //监视(三个参数,第一个是监视的对象,第二个是监视的回调函数,第三个是监视的配置)

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

       //情况二:监视ref所定义的多个响应式数据,写成数组的形式
       watch([sum,msg],(newValue,oldValue)=>{
           console.log('sum或者msg变了',newValue,oldValue)
       })

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

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


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

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


        //watchEffect函数内部所指定的回调中用到的数据只要发生变化,就会重新执行回调
        //只有一个参数,就是回调
        watchEffect(()=>{
            const x1 = sum.value//因为sum是ref定义的响应式数据,需要使用.value调用
            const x2 = person.age
            console.log('watchEffect配置的回调执行了')
        })

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

ref嵌套在reactive

<template>
  <div class="home">
    home-{{count}}--{{state.count}}
    <button @click="add">click</button>
  </div>
</template>
<script>
import { reactive, ref } from 'vue'
export default {
  name: 'Home',
  setup () {
    const count = ref(0)
    const state = reactive({
      count
    })
    const add = () => {
      state.count++
      //state.count 跟ref count 都会更新
    }

    return {
      state,
      add,
      count
    }
  }
}
</script>

 ref访问dom或者组件

<input type="text" ref="myinput"/>
//js
const myinput = ref(null)
console.log(myinput.value.value)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值