vue3 hooks 可以转为 esm 写法?

2023-12-18 13:47:46 +08:00
 chill777

之前的项目给别人写了,再拿过来的时候发现我的 hooks 被拆掉了。所以这种写法是可以的吗?

对方居然还说感觉这样更合理。。。

2942 次点击
所在节点    Vue.js
35 条回复
horizon
2023-12-18 13:54:34 +08:00
1. 什么叫 esm 写法?
2. 第二种相当于创建了一个 chartDataObj 的响应式对象 单例

看你们的需求。。
在没有更多背景的前提下,你的更好,没看到拆分的好处。但是单例的问题很大。
abelmakihara
2023-12-18 13:58:39 +08:00
这个图里好像看不出来什么
因为他把 onmount 和 useStoreStock 去掉了
如果没影响 那确实是没必要 hook 啊 一个方法就可以了
但是如果他这里去掉了 页面里加回来了那就看到底要抽象到什么程度了吧
wangtian2020
2023-12-18 14:01:27 +08:00
写了三年 vue 我没用过 hooks 和 mixin
Yumwey
2023-12-18 14:03:44 +08:00
esm 是写法吗?

这单纯就是写 vue 的把喜欢写 react 的代码改得更 vue 而已
abelmakihara
2023-12-18 14:04:07 +08:00
还有那个单例的到底需不需要单例
说到底还是要看需求 hook 没有更高级
不过估计大概率是你赢了
mxT52CRuqR6o5
2023-12-18 14:06:56 +08:00
reactive 这个 api 不算 hooks (那些 use 开头的才算),就是个单例
liuhuihao
2023-12-18 14:09:15 +08:00
左侧的是标准 hooks 写法,右侧是给拆成了一个一个 export 的 方法?右侧这个写法如果能实现功能的话我理解就是一个 utils 类似的东西,不是 hooks ,右侧这种写法 watch 、onMounted 咋写呢?感觉右侧这样限制很大,不是 hooks 写法了已经。很明显你的抽象方式是正确的
chill777
2023-12-18 14:11:45 +08:00
@abelmakihara
因为我这个 hooks ,有多个组件使用。还有生命周期 hook 和其他 hook 。抽成模块就没办法复用这些逻辑。
@horizon
esm:就是改成 import 和 export 写法。本来直接从 hooks 取值,就行。
我在想这种单例的写法,会有重复创建的问题吗?还有就是垃圾回收的的问题,如果我去其他使用这个变量的组件,变量会重新初始化吗?
chenliangngng
2023-12-18 14:12:37 +08:00
如果你是从 vue2 转到 vue3 ,那可能觉得第一种是对的

但是如果你 vue2 ,vue3 ,react 都写过,那就知道第二种才是那个合适的

为什么?
因为 hooks 存在的意义就是为了逻辑拆封,自定义的 hooks 应该额外定义。但是呢你现在展示的这个代码,拆封的太细了,拆到只剩 relative 是不应该的
chenliangngng
2023-12-18 14:13:37 +08:00
@chenliangngng relative => reactive
chenliangngng
2023-12-18 14:14:24 +08:00
@chenliangngng 拆封=>拆分
liuhuihao
2023-12-18 14:16:21 +08:00
@chill777 明显是你的写法更合理啊,我很好奇右侧那种写法 生命周期一类的咋写的,写在页面逻辑里吗?那还抽象个锤子。另外多个页面 import 的话,hooks 写法每次都是 return 一个新的对象,不会互相影响,右侧那种写法不就变成单例的了么,各个页面互相影响
liuhuihao
2023-12-18 14:18:14 +08:00
@chenliangngng #10 你再仔细看看 lz 的代码,并不是只拆分到 reactive ,他左侧整张图都是一个 hooks 只不过底部的 return 没有截上,我认为 lz 的写法是没有问题的,右侧的抽象反而是抽象了个寂寞
liuhuihao
2023-12-18 14:21:35 +08:00
我理解的 hooks 拆封
export default function (deps) {
const data = ref('')
const data2 = ref('')

const doSomeThing = ()=>{
XXX
}

watch(deps, XXX)

onMounted(()=>{
XXX
})

return {data,data2,doSomeThing}
}
abelmakihara
2023-12-18 14:22:56 +08:00
@chill777 就单论这个图片里的话
如果这个 obj 是单例的话 下面那个方法很明显也是获取 obj 的 我会扔到 store 里
如果不是单例的那就 hook
如果这个方法会有不同 hook 用? 还可以把这些方法单独抽个 service
--
当然不会初始化了 这就是全局通用的
Zzzz77
2023-12-18 14:23:13 +08:00
这有啥争议,左边对
Huelse
2023-12-18 14:38:24 +08:00
右边的问题很大,既不单例,也不 esm ,堪称屎山之基。
jspatrick
2023-12-18 15:20:36 +08:00
是 hooks 就该用闭包(左),不是 hooks 没理由用 reactive (右),也可能是我业务场景不够丰富,目前没遇到过右边这种情况
horizon
2023-12-18 15:41:15 +08:00
@chill777 #8
不会重复创建,不会回收,不会重新初始化。
所以右侧这个写法没法复用。。
a632079
2023-12-18 20:16:12 +08:00
1. 这和 esm 没关系。
2. Vue 里面的响应式包 `@vue/reactivity`,比如 reactive 啥的都可以脱离 setup 使用。所以他第二种做法是可以的。

P.S pinia 里面的 introduce 里面就有提到,为啥要用它,不用第二种(直接使用 reactive 做状态管理)。其中最大的优势就是 SSR 友好。https://pinia.vuejs.org/introduction.html#Why-should-I-use-Pinia-

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

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

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

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

© 2021 V2EX