在使用VCA方式编写Vue代码是,大部分逻辑都是被setup(){}包裹起来,且最后使用的时候需要return{}出去。比较繁琐,实际上Vue提供了setup语法糖,可以简化这些操作。

1 不再需要export default 与 return

不使用语法糖写法

<template>
    <div @click="handelClick">app-{{ msg }}</div>
</template>
<script>
import { ref } from 'vue'
export default {
    setup() {
        const msg = ref('hello')
        const handelClick = () => { console.log(msg.value) }
        return {
            msg, handelClick
        }
    }
}
</script>

使用setup语法糖

<template>
    <div @click="handelClick">app-{{msg}}</div>
</template>
<script setup>
import { ref } from 'vue'
const msg=ref('hello')
const handelClick=()=>{console.log(msg.value)}
</script>

Vue学习笔记:setup语法糖_setup

2 组件引入不需要component

不使用语法糖写法

<template>
    <div>
    app-{{ msg }}
    <ConA/>
    </div>
</template>
<script>
import ConA from './ConA.vue'
import { ref }  from 'vue'
export default{
    components:{
        ConA
    },
    setup() {
        const msg = ref('hello')
    }
}
</script>

使用setup语法糖写法

直接import相应的模块即可,不需要使用componts声明引入。

<template>
    <div>
        app-{{ msg }}
        <ConA />
    </div>
</template>
<script setup>
import ConA from './ConA.vue'
import { ref } from 'vue'

const msg = ref('hello')

</script>

props写法差异

针对子组件传递props

<template>
<div> {{ title }} </div>
</template>
<script>
export default{
    props:{
        title:{
            type:String,
        }
    },
}</script>

使用语法糖写法

引入了defineProps方法

<template>
    <div> {{ title }} </div>
</template>
<script setup>
import { defineProps } from 'vue';
const props = defineProps({
    title: { type: String }
})
</script>

emit写法

在此示例中,子节组件绑定两个事件home mine,点击后回传字符串信息给根节点

引入了defineEmits。这个方法以数组形式接受从父组件传递过的事件,然后通过emit方法针对不同时间进行处理。

App.vue

<template>
    <div>
        app-{{ msg }}
        <ConA title="ConA" @home="handelClick" @mine="handelClick"/>
    </div>
</template>
<script setup>
import ConA from './ConA.vue'
import { ref } from 'vue'

const msg = ref('hello')
const handelClick=(value)=>{console.log(value)}
</script>

ConA.vue

<template>
    <div>
        <button @click="handleHome">首页</button>
         {{ title }}
        <button @click="handleMine">我的</button>

        </div>
</template>
<script setup>
import { defineProps, defineEmits } from 'vue';
const props = defineProps({
    title: { type: String }
})
const emit = defineEmits(['home','mine'])
const handleHome = ()=> {
    emit('home','Home')
}
const handleMine = ()=> {
    emit('mine','mine')
}
</script>

动态组件

通过 Vue 的 <component> 元素和特殊的 is attribute 实现的:

<!-- currentTab 改变时组件也改变 -->

<component :is="tabs[currentTab]"></component>

在上面的例子中,被传给 :is 的值可以是以下几种:

  • 被注册的组件名
  • 导入的组件对象

<component :is="..."> 来在多个组件间作切换时,被切换掉的组件会被卸载。可通过 <KeepAlive> 组件强制被切换掉的组件仍然保持“存活”的状态。

<template>
    <button v-for="(value, key) in tabs" :key="key" @click="handleClick(key)">{{ key }} </button>
    <component :is="tabs[currentTab]"></component>
</template>
<script setup>
import ConA from './ConA.vue'
import ConB from './ConB.vue'
import ConC from './ConC.vue'
import ConD from './ConD.vue'
import { ref } from 'vue'

const tabs = {
    ConA,
    ConB,
    ConC,
    ConD
}
const currentTab = ref('ConA')
const handleClick = (key) => {
    console.log(key)
    currentTab.value = key
}

</script>