Vue3学习笔记

24 篇文章 0 订阅
20 篇文章 0 订阅

1.setup,ref,reactive

<template>
  <div>
    <h1>{{name}}</h1>
    <h1>{{price}}</h1>
    <h1>{{info.player}}</h1>
    <h1>{{info.director}}</h1>
    <h1>{{info.a.b.c}}</h1>
    <h1>{{arr}}</h1>
    <button @click="changeName">按钮</button>
  </div>
</template>

<script>

import { reactive, ref } from "vue"

export default {
  setup(props,context) {
    let name=ref("十面埋伏")
    let price =ref(37)

    let info=reactive({
      player : '刘德华',
      director : '张艺谋',
      a : {
        b : {
          c : "ccc"
        }
      }
    })

    let arr=reactive(["ET外星人","拯救大兵瑞恩","辛德勒名单"])

    function changeName(){
      name.value="天下无贼"
      price.value=58
      info.player="金城武"
      info.a.b.c="dddd"
      arr[0]="敦刻尔克"
      info.value.director="徐克"
      console.log(name,price,info,arr);
    }

    return {name,price,changeName,info,arr}
  }
}
</script>

2.computed

<template>
  <div class="con">
    <input v-model="info.player" />
    <input v-model="info.director">
    <input v-model="info.fullName">
    <h3>全名{{ info.fullName }}</h3>
  </div>
</template>

import { reactive, ref,computed } from "vue"

 setup(props,context) {

    let info=reactive({
      player : '刘德华',
      director : '张艺谋',
    })

    //简写形式
    // info.fullName=computed(()=>{
    //   return info.player+"="+info.director
    // })

    //全写形式
    info.fullName=computed({
      get(){
        return info.player+"="+info.director
      },
      set(value){
        const arr=value.split("=")
        info.player =arr[0]
        info.director =arr[1]
      }
    })


    return {info}
  }

3.watch

import { reactive, ref,computed,watch } from "vue"
export default {
  setup(props,context) {
    let sum=ref(0)
    let msg=ref("")
    const obj=reactive({
      name : '无间道',
      player : '刘德华',
      a : {
        b : {
          c :"yyyy"
        }
      }
    })
    
    //监视单个数据
    watch(msg,(nv,ov)=>{
      console.log(nv,ov,"====");
    },{immediate : true})

    //监视多个数据
    watch([sum,msg],(nv,ov)=>{
      console.log(nv,ov,"----");
    },{immediate : true})

    //监视reactive的对象无法获取oldValue
    //此时深度监听无效,默认开启深度监听
    watch(obj,(n,o)=>{
      console.log(n,o,"<<<<");
    })

    //通过函数形式监听对象里面的单个属性
    watch(()=>obj.name,(n,o)=>{
      console.log(n,o,"****");
    })

    //通过函数形式监听对象里面的多个属性,此情况能监听到旧数据
    watch([()=>obj.name,()=>obj.player],(n,o)=>{
      console.log(n,o,"++++");
    })

    //通过函数形式监听对象里面的对象,此时深度监听有效
    watch(()=>obj.a,(n,o)=>{
      console.log(n,o,">>>>");
    },{deep:true})

    return {sum,msg,obj}
  }
}

4.watchEffect

回调内的属性发生变化则触发监听,默认深度监听,与computed不同的是,computed更注重结果,所以必须返回值,但是watchEffect更注重过程,可以监听多个数据的变化进行回调操作,不需要写返回值。

setup(props,context) {
    let sum=ref(0)
    let msg=ref("")
    const obj=reactive({
      name : '无间道',
      player : '刘德华',
      a : {
        b : {
          c :"yyyy"
        }
      }
    })

    watchEffect(()=>{
      const x=sum.value
      const x2=obj.name
      const x3=obj.a.b.c
      console.log(x,x2,x3);
    })

    return {sum,msg,obj}
  }

5.组合式api生命周期

import { onBeforeMount,onBeforeUnmount,onBeforeUpdate,onMounted,onUnmounted,onUpdated } from 'vue'
export default {
  setup(props,context){
    function buy(){
     context.emit("buy",111)
    }

    onBeforeMount(()=>{
      console.log("----onBeforeMount----")
    })

    onMounted(()=>{
      console.log("----onMounted----")
    })

    onBeforeUpdate(()=>{
      console.log("----onBeforeUpdate----")
    })

    onUpdated(()=>{
      console.log("----onUpdate----")
    })

    onBeforeUnmount(()=>{
      console.log("----onBeforeUnmount----")
    })

    onUnmounted(()=>{
      console.log("----onUnmounted----")
    })

    return {buy}
  },
}

6.自定义hooks,类似于vue2的mixins

// 路径src/hooks/usePoint.js
import { reactive,onBeforeUnmount,onMounted } from 'vue'
export default function(){
    const point=reactive({
        x : 0,
        y : 0
      })
      function savePoint(e){
          console.log(e);
          point.x=e.x
          point.y=e.y
      }
  
      onMounted(()=>{
        console.log("----onMounted----")
        window.addEventListener("click",savePoint)
      })
  
      onBeforeUnmount(()=>{
        console.log("----onBeforeUnmount----")
        window.removeEventListener("click",savePoint)
      })

      return point
}

//组件内调用
import usePoint from "@/hooks/usePoint"
export default {
  setup(props,context){
    const point=usePoint()
    return {point}
  }
}

7.toRef与toRefs

toRef将响应式对象内的属性交给外部使用并不丢失响应式,toRefs将响应式对象内的属性全部交给外部使用并不丢失响应式,对象内的对象转换成proxy代理对象

setup(props,context) {
    const data=reactive({
      name : '无间道',
      player : '刘德华',
      a : {
        b : {
          c :"yyyy"
        }
      }
    })

    return {
      name : toRef(data,"name"),
      player : toRef(data,"player"),
      c : toRef(data.a.b,"c"),
      data
    }

    //return {
      //...toRefs(data),
      //data
    //}
  }

8.reactive与shallowReactive

reactive处理深层次的响应式,shallowReactive无法处理对象嵌套对象的响应式,即只处理浅层次的响应式.

9.ref与shallowRef

ref处理深层次的对象的响应式,shallowRef不处理对象数据的响应式

10.readonly与shallowReadonly

readonly:让一个响应式数据变成只读,并且是深层次只读。

shallowReadonly:让一个响应式数据变成只读,但是是浅层次只读。

以上开发用到几率不大。

11.toRaw与markRaw

toRaw:将reactive的对象转换成原始对象;

markRaw:将reactive对象的某一部分属性转换成非响应式的数据,且无法再变成响应式对象.

12.customRef自定义Ref

自定义响应式数据,可以用于防抖与节流

setup(props) {
    const movie=reactive({
      name : '当幸福来敲门',
      price : 35,
      year : 2002
    })

    function myRef(value,layer){
      return customRef((track,trigger)=>{
        let timer
        return{
          get(){
            console.log("读取数据");
            track() //追踪value值
            return value
          },
          set(newV){
            console.log("修改数据");
            value=newV
            clearTimeout(timer)
            timer=setTimeout(()=>{
              trigger() //触发修改
            },layer)
          }
        }
      })
    }
    const mName=myRef("肖申克的救赎",500)
    
    return {
      movie,
      mName
    }
  }

13.provide与inject祖组件与后代组件通信

祖组件

<template>
  <div>
    <h1>祖组件</h1>
    <h1>{{movie.price}}</h1>
    <h1>{{movie.year}}</h1>
    <About></About>
  </div>
</template>

<script>

import { reactive, ref,customRef,provide } from "vue"

import About from "./views/About.vue"

export default {
  components : {
    About,
  },
  setup(props) {
    const movie=reactive({
      name : '当幸福来敲门',
      price : 35,
      year : 2002
    })

    provide("movie",movie)
    return {
      movie,
    }
  }
}
</script>

子组件

import {inject} from "vue"
setup(props,context){
    const movie=inject("movie")
    return {movie}
}

孙组件

import {inject} from "vue"
export default {
  name: 'Home',
  setup(props) {
    const movie=inject("movie")
    console.log("孙组件",movie);
    return {
       movie
    }
  }
}

14.isReactive,isRef,isReadonly, isProxy

import { reactive, ref,customRef,provide, readonly, isReactive,isRef,isReadonly, isProxy } from "vue"

const movie=reactive({
      name : '当幸福来敲门',
      price : 35,
      year : 2002
})
const s=ref(0)
const movie2=readonly(movie)
console.log(isRef(s));
console.log(isReactive(movie));
console.log(isReadonly(movie2));
console.log(isProxy(movie2));

15.teleport组件,将组件移位到想要的位置

<teleport to='body' >
     <div v-if="isShow" class="mask">
           <div class="con" >
               <button @click="isShow=false">点击关闭</button>
           </div>
     </div>
</teleport>

16.异步组件与Suspense实现组件懒加载

父组件

<template>
  <div class="grandPa">
    <h1>祖组件</h1>
    <Suspense>
      <template v-slot:default>
          <About></About> 
      </template>
      <template v-slot:fallback>
          <h3>稍等。。。。</h3>
      </template>
    </Suspense>
  </div>
</template>

<script>

import {defineAsyncComponent } from "vue"
const About=defineAsyncComponent(()=>import("./views/About.vue"))

export default {
  components : {
    About
  },
  setup(props) {
    return {}
  }
}
</script>

子组件

<template>
  <div class="about">
    <h2>子组件</h2>
    <h3>{{s}}</h3>
  </div>
</template>

<script>
import { ref } from 'vue'
export default {
  async setup(props,context){

    const p=new Promise((resolve,reject)=>{
      setTimeout(()=>{
        const s=ref(0)
        resolve(s)
      },2000)
    })

    return await p
  }
}
</script>

17.其他修改

Vue.config.xxx=>app.config.xxx
Vue.component=>app.component
Vue.directive=>app.directive
Vue.mixin=>app.mixin
Vue.use=>app.use
Vue.prototype=>app.config.globalProperties

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

y_w_x_k

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值