2021 年到了, Vue 3 准备好了吗?

2021-03-07 21:45:49 +08:00
 nanmu42

分享新写的文章,欢迎各位一起交流。:)

Vue 3 生产可用了吗?好用吗?和 Vue 2 相比变化大吗?我试着用 Vue 3 编写了一个项目,发现它挺香的。

4118 次点击
所在节点    分享创造
27 条回复
huijiewei
2021-03-07 21:47:39 +08:00
已经换 react 了 :)
nanmu42
2021-03-07 21:51:09 +08:00
哈哈哈,别这样嘛。
konakona
2021-03-07 22:02:54 +08:00
说实话我更喜欢 JSX=。= vue2 时代遗留下来的问题就是单个 vue 文件巨特么长,动不动上千行,受不了哇。
nanmu42
2021-03-07 22:10:12 +08:00
@konakona composition API 出来了,现在业务代码也可以复用了,可能可以让你感觉好一点。
shakukansp
2021-03-07 22:42:06 +08:00
此外,Composition API 也带来了新的易错点,如果你的 composable 中用到了 watch(),并且在同一个 view 中的 n 个组件都用了该 composable,那么 watch()及其回调会被调用 n 次,这往往不是你想要的效果。解决方案是为 composable 提供初始化参数。

你是认真的?
nanmu42
2021-03-07 22:48:45 +08:00
@shakukansp 认真,亲身经历。把 watch 写 composable 里很容易就中招了。
shakukansp
2021-03-07 22:51:56 +08:00
// useCount.ts
const useCount = () => {
const count = ref(0);

watch(count, () => {
console.log('count:', count.value);
});

return {
count
};
};

// helloWorld.vue
<template>

<button @click="count++">count is: {{ count }}</button>
<button @click="count2++">count is: {{ count2 }}</button>

</template>

<script lang="ts">
import { ref, defineComponent } from 'vue';
import { useCount } from "../compositions/count";

export default defineComponent({
name: 'HelloWorld',
props: {
msg: {
type: String,
required: true
}
},
setup: () => {
const { count } = useCount();
const { count: count2 } = useCount();
return { count, count2 };
}
});
</script>

你再试试?
nanmu42
2021-03-07 22:59:02 +08:00
我的情况是这样的,A 引用 B,B 引用 C,B 和 C 都在 setup 里 useX(),useX 里有 watch.
@shakukansp
shakukansp
2021-03-07 23:08:23 +08:00
@nanmu42 没道理,无论你怎么引用别的组件,每个 useCount 里面的 count 都是不一样的
nanmu42
2021-03-07 23:15:35 +08:00
@shakukansp 我理解 setup()也是一个生命周期钩子,组件 A 引用 B,B 引用 C,B, C 的 setup()都调用了 useX(), useX()中的 watch 会注册两次。这个和 count 是不是同一个关系不大。
Count 可以是同一个,只要它是包级别的(在函数外面),我用了 store,情况很类似。
shakukansp
2021-03-07 23:18:09 +08:00
@nanmu42
??? count 不是同一个 watch 的自然也不是同一个,就不可能触发多次回调
如果你这个 count 是 store 里拿出来的
那两个 watch 监听的是同一个 count 那自然会触发两次
nanmu42
2021-03-07 23:24:00 +08:00
@shakukansp 对,就是你说的后一种情况啦。
shakukansp
2021-03-07 23:32:54 +08:00
@nanmu42
感觉你是对 composition api 或者 react hooks 抽离出去的 useXXX 作用域理解有偏差
每次调用 useXXX, 那是生成一个新的函数作用域,里面的东西都是重新注册的
shakukansp
2021-03-07 23:36:56 +08:00
store 里的状态不是在这个作用域里声明的,函数内部自然可以调用它所处的作用域上一级的变量

相当于你在函数外面声明了一个变量
nanmu42
2021-03-08 07:51:30 +08:00
@shakukansp 在这个情况下 watch store 里的东西就容易重复 watch.
谢谢你帮我澄清了这个问题,我等会改改文章里的说法。
sam014
2021-03-08 09:40:29 +08:00
感觉 Composition API 写法特残疾,写不下去,开了一个新项目用的 vue3,不过还是 SFC 的写法,
其他项目考虑换 react,或许只有后管类的东西继续用 vue3 了( vue3 + SFC )
nanmu42
2021-03-08 09:46:32 +08:00
@sam014 方便分享下对 composition API 不满意的点吗?
gouflv
2021-03-08 09:48:38 +08:00
上周刚想尝试,发现用到的多数组件目前并没有跟进 vue3,所以又降回 2 了。而且官方没有迁移工具,所以整体看,升级并不乐观。ps:react 真香
ruoxie
2021-03-08 10:05:43 +08:00
composition api+tsx 就像再写 reat,现在完全用不来 template 的写法了,另外 template+ts 的写法是真的残疾
sunwang
2021-03-08 10:14:48 +08:00
@shakukansp use 了两次,生成两个不同的 watch 属于正常现象吧,你说的 "watch()及其回调会被调用 n 次,这往往不是你想要的效果"是啥意思,能详细的说说吗?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/759374

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX