正常开发大家使用vue3一般都会使用setup语法糖,那么setup语法糖到底做了什么,和setup函数有什么区别 首先分别用setup语法糖和setup函数各写一个功能一样的组件
组件A setup语法糖实现
js
<template>
<div>
<p>setup语法糖</p>
<p>当前计数: {{ count }}</p>
<el-button type="primary" @click="increment">增加</el-button>
<el-button type="danger" @click="decrement">减少</el-button>
</div>
</template>
<script setup lang="ts">
//写个累加器
import {ref} from "vue";
const count = ref(0)
const increment = () => {
count.value++;
};
// 定义减少函数
const decrement = () => {
count.value--;
};
</script>
<style scoped lang="scss">
</style>
组件B setup函数实现
xml
<template>
<div>
<p>setup函数</p>
<p>当前计数: {{ count }}</p>
<el-button type="primary" @click="increment">增加</el-button>
<el-button type="danger" @click="decrement">减少</el-button>
</div>
</template>
<script>
import { ref } from 'vue';
export default {
setup() {
// 创建一个响应式计数器变量
const count = ref(0);
// 定义增加函数
const increment = () => {
count.value++;
};
// 定义减少函数
const decrement = () => {
count.value--;
};
// 返回响应式变量和函数
return {
count,
increment,
decrement
};
}
};
</script>
<style>
/* 这里可以添加样式 */
</style>
然后分别引用组件A和B
xml
<template>
<A ref="refsetup"></A>
<B ref="refscriptsetup"></B>
</template>
<script setup lang="ts">
import A from './A.vue';
import B from './B.vue';
const refsetup = ref(null)
const refscriptsetup = ref(null)
import {ref,onMounted} from "vue";
onMounted(()=>{
console.log(refsetup);
console.log(refscriptsetup);
})
</script>
<style scoped lang="scss">
</style>
效果如下
代码可以看到我们分别打印了组件A和B的ref 打印结果如下
很容易发现setup语法糖的ref并没有什么东西 ,通过查看查看编译后的结果我们发现,setup函数编译的结果是原封不动的,返回什么,编译后还是返回什么
而setup语法糖呢 编译后多了个expose
这个是vue3新增的一个api 作用就是可以指定想要暴露的对象 不写就默认暴露全部 如果只希望暴露指定属性可以用 defineExpose
编译后
这样就不存在在外部可以使用ref来改变内部数据的可能,也可以通过暴露子组件内部方法,父组件可以直接调用