在vue3.0中,setup函数中的变量必须return出来才能给template使用,3.2中使用setup语法糖无需return变量就可以在template中使用了,而且引入的组件可以直接使用,无需再通过components进行注册。setup 语法糖中可直接使用 await,不需要写 async , setup 会自动变成 async setup
父子组件传值props,子组件给父组件传值emit
父组件
<script setup> import HelloWorld from "./components/HelloWorld.vue" import {ref} from "vue" const msg=ref("父组件传值") let message=ref("") const go=(val)=>{ message.value=val } </script> <template> <HelloWorld :msg="msg" @event="go"></HelloWorld> {{message}} </template>
子组件
<script setup> import {ref} from "vue" const msg=ref("父组件传值") const emit=defineEmits(["event"]) const btn=()=>{ emit("event","子组件的值") } </script> <template> <h>{{msg}}</h><br> <h>我是子组件</h><br> <button @click="btn">子组件传值</button> </template>
provide 和 inject 祖孙传值
父组件
<script setup> import HelloWorld from "./components/HelloWorld.vue" import {ref} from "vue" import {provide} from "vue" const name=ref("张飞") provide("provideData",{ name }) </script> <template> <HelloWorld ></HelloWorld> </template>
子组件
<script setup> import {inject} from "vue" const provideData=inject("provideData") </script> <template> <h>{{provideData.name}}</h><br> </template>
toRefs的使用
只能搭配Reactive,不能搭配Ref
<script setup> import HelloWorld from "./components/HelloWorld.vue" import {ref,reactive,toRefs} from "vue" const state=reactive({ username:"root" }) const {username}=toRefs(state) const change=()=>{ username.value="" } </script> <template> {{username}}<br> <button @click="change">改变</button> </template>
Watch函数(这个函数代码为了省事引用某博文)
watch( ()=>message.value, (val,preVal)=>{ //val为修改后的值,preVal为修改前的值 console.log("message",val,preVal) }, { //如果加了这个参数,值为true的话,就消除了惰性,watch会在创建后立即执行一次 //那么首次执行,val为默认值,preVal为undefined immediate:true, //这个参数代表监听对象时,可以监听深度嵌套的对象属性 //比如message是一个对象的话,可以监听到message.a.b.c,也就是message下的所有属性 deep:true, } )
watch( ()=>[message.value,count.value], ([messageVal,messagePreVal],[countVal,countPreVal])=>{ //监听多个源用数组传入 console.log("messageVal,messagePreVal",messageVal,messagePreVal) console.log("countVal,countPreVal",countVal,countPreVal) }, )