Vue3中setup语法糖

92 阅读2分钟

1.动态组件

由于组件被引用为变量而不是作为字符串键来注册的,在<script setup>中要使用动态组件的时候,就应该使用动态的:is来绑定

  1. 以前单组件用:is直接绑定注册的字符串,现在:is绑定变量名 2.以前多组件用::is绑定数组中每一项的字符串,现在:is绑定对象中属性对应组件变量
<template>
	<Tabs v-model:active="active">
	  <Tab title="优惠券" name="couponTab" />
	  <Tab title="拼团" name="groupingTab" />
	</Tabs>
	<component :is="tabValue[active]" />
    或者
    <component :is="couponTab" />
</template>

<script setup lang="ts" name="Marketing">
  import couponTab from "./coupon/index.vue";
  import groupingTab from "./grouping/index.vue";

  const tabValue = { couponTab, groupingTab };
  let active = ref<string>("couponTab");
</script>

2.defineProps 组件传参

父组件传参:

<template>
  <div class="home">
    <test-com :info="msg" time="42分钟"></test-com>
  </div>
</template>
 
<script setup>
    import TestCom from "../components/TestCom.vue"
    let msg='消息'
</script>

子组件接收参数:

<template>
  <div>{{ info }}</div>
</template>

<script setup>
//defineProps是不需要导入的
//import {defineProps} from 'vue'

 const props = defineProps({
    info:{
        type:String,
        default:'我是默认值'
    },
    time:{
        type:Number,
        default:20
    },
})

const { time } = props;
</script>

3.defineEmits 组件抛出事件

父组件:

<template>
  <div class="home">
    <test-com @myAdd="myAddHander" @myDel='myDelHander'></test-com>
  </div>
</template>
 
<script setup>
    import TestCom from "../components/TestCom.vue"
    let myAddHander=(mess)=>{
      console.log('新增==>',mess);
    }
    let myDelHander=(mess)=>{
      console.log('删除==>', mess);
    }
</script>

子组件:

<template>
 <div>
    <button @click="hander1Click">新增</button>
    <button @click="hander2Click">删除</button>
  </div>
</template>
 
<script setup>
//defineEmits是不需要导入的
 //import {defineEmits} from 'vue'

 //  使用defineEmits创建名称,接收一个数组(注册父级回调事件 --> myAdd、myDel)
 let myemit=defineEmits(['myAdd','myDel'])
 
 let hander1Click = ()=>{
     myemit('myAdd','新增的数据')
 }
 let hander2Click = ()=>{
     myemit('myDel','删除的数据')
 }
</script>

4.await的支持

setup 语法糖中可直接使用 await,不需要写 async , setup 会自动变成 async setup

<script setup>
  import Api from '../api/Api'
  const data = await Api.getData()
  console.log(data)
</script>

5.defineExpose获取子组件中的属性值

子组件:

<script setup>
    import { reactive, ref,defineExpose } from "vue";
    let sex=ref('男')
    let info=reactive({
        like:'喜欢李',
        age:27
    })
    // 将组件中的属性暴露出去,这样父组件可以获取
    defineExpose({
        sex,
        info
    })
</script>

父组件:

<template>
  <div class="home">
    <test-com ref="testcomRef"></test-com>
    <button @click="getSonHander">获取子组件中的数据</button>
  </div>
</template>
 
<script setup>
    import TestCom from "../components/TestCom.vue"
    import {ref} from 'vue'
    const testcomRef = ref()
    const getSonHander=()=>{
      console.log('获取子组件中的性别', testcomRef.value.sex );
      console.log('获取子组件中的其他信息', testcomRef.value.info );
    }
</script>

6.style v-bind(我们可以在style中去使用变量)

style v-bind将span变成红色

<template>
  <span> 有开始循环了-开端 </span>  
</template>
<script setup>
  import { reactive } from 'vue'
  const state = reactive({
    color: 'red'
  })
</script>
<style scoped>
  span {
    /* 使用v-bind绑定state中的变量 */
    color: v-bind('state.color');
  }  
</style>
复制代码

7.watch的使用

<script setup>
    import {
      reactive,
      watch,
    } from 'vue'
     //数据
     let sum = ref(0)
     let msg = ref('你好啊')
     let person = reactive({
                    name:'张三',
                    age:18,
                    job:{
                      j1:{
                        salary:20
                      }
                    }
                  })
    // 两种监听格式
    watch([sum,msg],(newValue,oldValue)=>{
            console.log('sum或msg变了',newValue,oldValue)
          },{immediate:true})

     watch(()=>person.job,(newValue,oldValue)=>{
        console.log('person的job变化了',newValue,oldValue)
     },{deep:true}) 

</script>

8、computed计算属性的使用

<script setup>
    import {
      reactive,
      computed,
    } from 'vue'

    //数据
    let person = reactive({
       firstName:'小',
       lastName:'叮当'
     })
    // 计算属性简写
    person.fullName = computed(()=>{
        return person.firstName + '-' + person.lastName
      }) 
    // 完整写法
    person.fullName = computed({
      get(){
        return person.firstName + '-' + person.lastName
      },
      set(value){
        const nameArr = value.split('-')
        person.firstName = nameArr[0]
        person.lastName = nameArr[1]
      }
    })
</script>