最近you发布了vue的function rfc 引发了很多的争论

  • 介绍了 Vue 3 里基于函数的 API。
  • 许多我们正在使用的特性都会被弃用,诸如 data、computed、methods、watch、mixin、extends 和生命周期函数。Vue 组件主要由一个叫做 setup() 的函数构成,这个函数会返回所有的 method、计算属性和监听器。
  • 如果你想继续使用旧版功能,Vue 会提供一个兼容版本。

function api https://github.com/vuejs/rfcs/blob/function-apis/active-rfcs/0000-function-api.md

image.png

function api

  1. import { state, computed } from "vue";
  2. export default {
  3. setup() {
  4. // Pet name
  5. const petNameState = state({ name: "", touched: false });
  6. const petNameComment = computed(() => {
  7. if (petNameState.touched) {
  8. return "Hello " + petNameState.name;
  9. }
  10. return null;
  11. });
  12. const onPetNameBlur = () => {
  13. petNameState.touched = true;
  14. };
  15. // Pet size
  16. const petSizeState = state({ size: "", touched: false });
  17. const petSizeComment = computed(() => {
  18. if (petSizeState.touched) {
  19. switch (this.petSize) {
  20. case "Small":
  21. return "I can barely see your pet!";
  22. case "Medium":
  23. return "Your pet is pretty average.";
  24. case "Large":
  25. return "Wow, your pet is huge!";
  26. default:
  27. return null;
  28. }
  29. }
  30. return null;
  31. });
  32. const onPetSizeChange = () => {
  33. petSizeState.touched = true;
  34. };
  35. // All properties we can bind to in our template
  36. return {
  37. petName: petNameState.name,
  38. petNameComment,
  39. onPetNameBlur,
  40. petSize: petSizeState.size,
  41. petSizeComment,
  42. onPetSizeChange
  43. };
  44. }
  45. };

就我看下来,感觉还蛮好的,比之前的写法简介了很多,相对于之前对象的键值对形式,显式的声明data computed methods 这些,简洁了很多,还有了命名空间。我喜欢易于理解的函数和组件。
**

完善的 Typescript 支持

新语法可以有完整的 Typescript 支持,这在 Vue 2.x 基于对象的语法中很难实现。

热心网友在reddit发的帖子

后来尤在hackernews上的回复

  • Vue 3.0 会有一个标准版本,包含新 API 和旧 API,同时会额外提供一个轻量版本,这个版本会删除一些旧 API,以使 Vue 更小更快。
  • 新的 API 完全是额外加到 Vue 2.x 里的,不会有任何 break change。