更新 Vue setup 最终定稿了。
https://github.com/vuejs/rfcs/pull/227#issuecomment-870105222

image.png

本文尝试用最新的 vue@^3.2.0-beta.7 版本来讨论新时代的 setup和新的 refsugar。

setup

定稿内容,请看下面这个demo:

  1. <script setup>
  2. import Foo from './foo.vue';
  3. import { ref } from 'vue';
  4. const count = ref(0);
  5. const props = defineProps({foo: String})
  6. const emits = defineEmits(['e1'])
  7. const inc = () => { count++ }
  8. </script>

这种写法,消失了 defineComponent,完全变成扁平了。

请注意:

  • 需要手动书写 setup 开启
  • 引入 *.vue 时候,因为没有defineComponent 了,可以直接注册组件
  • 声明了 count 不管你用不用,组件内可用,更符合直觉:作用域
  • 一些内置的命令,可以不导入,比如 withDefaults defineProps defineEmits defineExpose 这几个api,可以不导入,直接使用
  • 如果lint报错,按照下面的说明来修改
  • 其他细节忽略。
  • props/emits 不能从外部导入类型。

这样自定义name

  1. <script>
  2. // 单独命令导入 import {named} from './x.vue'
  3. export const named = 1;
  4. export default{
  5. name:'',
  6. inheritAttrs: false
  7. }
  8. </script>
  9. <script setup>
  10. </script>

eslint 配置修改如下,就是添加全局类型,让lint不报错。

  1. var config = {
  2. globals: {
  3. defineProps: 'readonly',
  4. defineEmits: 'readonly',
  5. defineExpose: 'readonly',
  6. withDefaults: 'readonly',
  7. $ref: 'readonly',
  8. $computed: 'readonly'
  9. }
  10. }

ref sugar

别急着反驳,原来使用标签语法糖的提案label sugar已经被放弃了。如果你之前尝试过 ref: a=1 可以考虑迁移了。

现在有新的ref sugar https://github.com/vuejs/rfcs/discussions/369

  1. <script setup>
  2. let count = $ref(1);
  3. function inc(){count++}
  4. // 注意,还是正常使用 computed
  5. const r = computed(()=> count*2)
  6. </script>

注意:

  • 我们启用了 setup
  • 我们直接使用了 $ref ,因为它默认内置(宏),不需要显示引入
  • 我们后续要修改值,使用let替代 const
  • 用起来和普通变量一样
  • 编译之后,还是编译成普通的 cosnt count = ref(1),不要有压力。
  • 为了更容易,引入了 $computed,这样让计算属性也可以减少 .value

限制:

  • vue3.2+
  • 手动开启
  • 不适用嵌套函数作用域??
  • 在sfc之外用不了,只能在 setup 里,这可能会导致碎片化。这也是有争议的部分。