传统的setup函数写:

这是最基础的写法,需要在setup函数中定义响应式数据和方法,并通过return将这些数据和方法暴露给模板。例如:

  1. import { ref } from 'vue';
  2. export default {
  3. setup() {
  4. // 创建一个初始值为0的响应式数据
  5. const count = ref(0);
  6. console.log(count.value); // 输出:0
  7. // 修改响应式数据的值
  8. count.value = 10;
  9. console.log(count.value); // 输出:10
  10. // 定义一个方法来增加count的值
  11. const increment = () => {
  12. count.value++;
  13. };
  14. return { count, increment };
  15. }
  16. }

ml-search[script setup]语法:

这是Vue 3.2引入的新特性,旨在进一步简化代码。在<script setup>标签中,你可以直接声明变量和方法,无需通过setup函数返回。例如:

  1. <script setup>
  2. import { ref } from 'vue';
  3. const count = ref(0);
  4. const increment = () => {
  5. count.value++;
  6. };
  7. </script>

使用<script setup>可以显著减少代码量,并且使得代码更加简洁和易于阅读。

结合:ml-search[reactive]和toRefs使用:

这种方式适用于更复杂的场景,可以通过reactive创建响应式对象,并通过toRefs将其转换为可访问的属性。例如:

  1. import { reactive, toRefs } from 'vue';
  2. export default {
  3. setup() {
  4. const state = reactive({ count: 0 });
  5. const { count } = t increment };
  6. }
  7. }

Setup 上下文

传入 setup 函数的第二个参数是一个 Setup 上下文对象。上下文对象暴露了其他一些在 setup 中可能会用到的值:

  1. import { computed, reactive, ref, onMounted, watch } from 'vue'
  2. export default {
  3. setup(props, context) {
  4. // 透传 Attributes(非响应式的对象,等价于 $attrs)
  5. console.log(context.attrs)
  6. // 插槽(非响应式的对象,等价于 $slots)
  7. console.log(context.slots)
  8. // 触发事件(函数,等价于 $emit)
  9. console.log(context.emit)
  10. // 暴露公共属性(函数)
  11. console.log(context.expose)
  12. }
  13. }

该上下文对象是非响应式的,可以安全地解构:

  1. export default {
  2. setup(props, { attrs, slots, emit, expose }) {
  3. ...
  4. }
  5. }

attrs 和 slots 都是有状态的对象,它们总是会随着组件自身的更新而更新。这意味着你应当避免解构它们,并始终通过 attrs.x 或 slots.x 的形式使用其中的属性。此外还需注意,和 props 不同,attrs 和 slots 的属性都不是响应式的。如果你想要基于 attrs 或 slots 的改变来执行副作用,那么你应该在 onBeforeUpdate 生命周期钩子中编写相关逻辑。

参考:

https://blog.csdn.net/fuhanghang/article/details/140316762