Vue3 setup 写法最佳实践

Vue3 setup 写法最佳实践

为什么一定要用SFC而不用 组合式API setup()?

两种方式最终都能满足我们搭建组件的需求,但经过实践setup() 形式的组件往往要比SFC 形式的组件多出很多代码且不易维护,下面我会阐述出案例以证实结论

我们先来看 组合式 setup()

<template>
  <Select v-model:value="selectValue" />
</template>
<script lang="ts">
import { ref } from 'vue'
import { getBusinessByProject } from '@/api/versionControl/business'
import { KeyItem, RES_CODE } from '@/type'
import { Key } from 'ant-design-vue/es/_util/type'
import { SelectValue } from 'ant-design-vue/lib/select'
 
export default {
  props: {
    value: {
      type: String,
      default: '',
    },
  },
  emits: ['eventBusinessChange'],
  setup() {
    const options = ref<KeyItem[]>([])
    const selectValue = ref<SelectValue>(undefined)
    const loading = ref(false)
 
    const getData = async (key: Key): Promise<void> => {
      try {
        loading.value = true
        const res = await getBusinessByProject({ project: key })
        loading.value = false
        const { status, data } = res || {}
        if (status !== RES_CODE.SUCCESS) return
        options.value = data || []
      } catch (error) {
        loading.value = false
        console.error('getData->', error)
      }
    }
 
    // 返回值会暴露给模板和其他的选项式 API 钩子
    return {
      selectValue,
      getData,
      options,
    }
  },
  mounted() {
    console.log(this.getData) // 0
  },
}
</script>

看完上述代码给我感受:

1.类型声明过于繁琐

2.emits 声明只能 声明函数,而不能具体到具体到函数入参与返回值

3.通过return的方式将所有变量和函数都暴露出去了,这样的方式每声明一个变量或者函数模版渲染中所需,都需要暴露出去,如果是一个复杂且状态较多的组件,这样的方式就会变得难以维护

4.return 所暴露出去的函数与变量再父组件往往不需要那么多,对于一个刚入门vue3同学,这样的方式可能会导致大量无用的变量暴露而这些变量其实是无用的,久而久之代码就会变得难以维护…

看完了 组合式 setup 我们再来看看SFC setup

<template>
  <Select
    v-model:value="selectValue"
  />
</template>
<script lang="ts" setup>
import { ref } from "vue";
import { Select } from "ant-design-vue";
 
 
interface MyProps {
  data?: ApiQoData;
  needAssert?: boolean;
}
 
const props = withDefaults(defineProps<MyProps>(), {
  needAssert: () => true,
  data: () => {
    return {} as ApiQoData;
  },
});
 
interface MyEmit {
  (e: "eventBusinessChange", key: Key, option: KeyItem): void;
}
 
const emit = defineEmits<MyEmit>();
const options = ref<KeyItem[]>([]);
const selectValue = ref<SelectValue>(undefined);
const loading = ref(false);
 
 
const getData = async (key: Key): Promise<void> => {
  try {
    loading.value = true;
    const res = await api({ project: key });
    loading.value = false;
    const { status, data } = res || {};
    if (status !== RES_CODE.SUCCESS) return;
    options.value = data || [];
  } catch (error) {
    loading.value = false;
    console.error("getData->", error);
  }
};
 
 
defineExpose({
  getData
});
</script>

SFC形式的setup给我们的感觉 模块化更清晰,类型声明更清晰,暴露变量函数也会更简单易维护,这样的方式也更加靠近函数式编程

Vue3 官方也给出了很好建议与阐述

<script setup> 是在单文件组件 (SFC) 中使用组合式 API 的编译时语法糖。当同时使用 SFC 与组合式 API 时该语法是默认推荐。相比于普通的

更少的样板内容,更简洁的代码。
能够使用纯 TypeScript 声明 props 和自定义事件。
更好的运行时性能 (其模板会被编译成同一作用域内的渲染函数,避免了渲染上下文代理对象)。
更好的 IDE 类型推导性能 (减少了语言服务器从代码中抽取类型的工作)。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue3中的setup语法糖是为了替代Vue2中的选项式API。通过在组件的script标签中添加一个名为setup的函数,我们可以实现类似于Vue2中的data、methods等选项的功能。 在使用setup语法糖时,我们需要注意以下几点: 1. setup函数接收两个参数,第一个参数是一个包含了一些属性和方法的上下文对象,可以通过解构赋值的方式来获取其中的属性和方法。第二个参数是一个上下文对象,其中包含有关组件的一些信息。 2. setup函数应该返回一个对象,这个对象中包含了我们希望在模板中使用的变量和方法。 3. 在setup函数中返回的对象中,可以使用Vue提供的一些响应式函数来创建响应式数据,比如ref、reactive等。同时,也可以将普通函数作为方法返回,这样可以在模板中直接调用。 4. 如果我们希望在模板中使用props属性,可以直接在setup函数的参数列表中添加props属性,Vue会自动将其注入到上下文对象中。 提到了Vue3.0和Vue3.2在使用setup语法糖时的一些差异。在Vue3.0中,变量必须通过return语句返回,才能在模板中使用;而在Vue3.2中,只需要在setup函数中定义变量,无需return,模板中即可直接使用。 提到了使用tinyMCE的demo,setup语法糖的写法。根据提供的信息,我们可以尝试以下写法: ```javascript import { ref } from 'vue'; import { createApp } from 'vue'; import Editor from 'tinymce'; const setup = () => { const content = ref(''); // 在这里可以进行一些初始化的操作 Editor.init({ selector: 'textarea', setup: function (editor) { editor.on('change', function () { content.value = editor.getContent(); }); }, }); return { content, }; }; createApp({ setup, }).mount('#app'); ``` 提到了第一种写法,即将变量和方法都定义在一个对象内,并使用toRefs函数将对象中的响应式数据转换为普通的响应式引用。这样可以使得在模板中使用对象内的属性和方法更加方便。 总结一下,Vue3中的setup语法糖是一个用于替代选项式API的函数,通过在组件的script标签中添加setup函数,我们可以实现类似于Vue2中的data、methods等选项的功能。在setup函数中,我们可以定义响应式的数据和方法,并将其返回给模板使用。根据不同的Vue版本,使用setup语法糖时的写法可能会有所差异。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值