Vue3 开发新范式,不用`ref/reactive`,不用`ref.value`

2024-05-16 11:32:52 +08:00
 zhennann

什么是 Cabloy-Front ?

Cabloy-Front 是一款支持 IOC 容器的 Vue3 框架。不用ref/reactive,不用ref.value,不用pinia

与 UI 库的配合

Cabloy-Front 可以搭配任何 UI 库使用,并且内置了几款 UI 库的项目模版,便于开箱即用,包括:

特性

Cabloy-Front 为 Vue3 引入了以下鲜明特征:

动图演示

演示:不用ref/reactive,不用ref.value

1. 定义响应式状态

@Local()
export class MotherPageCounter extends BeanMotherPageBase {
  counter: number = 0;

  inrement() {
    this.counter++;
  }

  decrement() {
    this.counter--;
  }
}

2. 使用响应式状态

@Local()
export class RenderPageCounter extends BeanRenderBase {
  render() {
    return (
      <div>
        <div>counter(ref): {this.counter}</div>
        <button onClick={() => this.inrement()}>Inrement</button>
        <button onClick={() => this.decrement()}>Decrement</button>
      </div>
    );
  }
}

演示:依赖注入

1. 逻辑抽离

counter逻辑抽离出来,创建一个Counter Bean

@Local()
export class LocalCounter extends BeanBase {
  counter: number = 0;

  inrement() {
    this.counter++;
  }

  decrement() {
    this.counter--;
  }
}

2. 在组件中注入并使用

@Local()
export class MotherPageCounter extends BeanMotherPageBase {
  @Use()
  $$counter: LocalCounter;
}
@Local()
export class RenderPageCounter extends BeanRenderBase {
  render() {
    return (
      <div>
        <div>counter(ref): {this.$$counter.counter}</div>
        <button onClick={() => this.$$counter.inrement()}>Inrement</button>
        <button onClick={() => this.$$counter.decrement()}>Decrement</button>
      </div>
    );
  }
}

框架已开源: https://github.com/cabloy/cabloy-front

5352 次点击
所在节点    Node.js
57 条回复
sun2920989
2024-05-16 11:49:50 +08:00
按理说应该放到推广节点
sjhhjx0122
2024-05-16 11:52:50 +08:00
我也写过一个这方面的库,后来觉得只要提供依赖注入,其他还是标准 vue 的范式比较好
zhennann
2024-05-16 12:00:58 +08:00
@sjhhjx0122 思路是一致的。对于组件的类型导出,仍然延用 vue3 setup 的特性。依赖注入主要是面向业务层面。
Terry05
2024-05-16 13:37:56 +08:00
等等后续
ooo4
2024-05-16 14:00:23 +08:00
都这样了,那为什么不去用 ng
FrankFang128
2024-05-16 14:09:23 +08:00
extends 太多了,不喜欢
nulIptr
2024-05-16 15:29:23 +08:00
光看你截图这 class 写法,这 render 函数,有点像 react 。。。。
相当于整个把 vue 的范式都变了,新框架+1
ixoy
2024-05-16 15:37:24 +08:00
都魔改成这样了,直接 react 。Vue3 定义数据都搞这样。真无语。
zhennann
2024-05-16 15:37:51 +08:00
@linzhe141 ng 的 ioc 太繁琐了。cabloy-front 采用依赖注入和依赖查找相结合的方式,大量减少装饰器函数的使用,让代码更加简洁,再加上 vue3 的响应式和 tsx 的灵活性,整体效果比 ng 好太多。
zhennann
2024-05-16 15:41:38 +08:00
@FrankFang128 extends 某个基类,就可以通过`this.`直接使用大量常用的功能,减少 import 和 use 等导入代码。虽然使用了`this.`一样有类型校验,自动完成提示,也可以跟踪其源码出处
zhennann
2024-05-16 15:43:39 +08:00
@ixoy 这样就可以不再纠结使用 ref 还是 reactive ,不用担心失去响应式的烦恼,也不用再写大量 ref.value ,同时又能利用 vue3 的响应式
crocoBaby
2024-05-16 15:45:40 +08:00
不好用
Kalan
2024-05-16 15:47:55 +08:00
我决定命名为 veact ,谁赞成谁反对
timedivision
2024-05-16 15:51:08 +08:00
@Kalan revue 比较好
LandCruiser
2024-05-16 15:55:35 +08:00
我之前发过一个吐槽接收离职同事的项目代码的帖子,我接手的代码就有往这个方向封装的趋势,完全没必要,引入了一套有复杂度的东西,但是没解决任何问题。有自己喜欢的开发范式没问题,但好坏是客观的。
ref 和 react 的 useState 都是其各自的 api 而已,尤其是 vue 的 ref ,尽管 vue3 的 ref ,reactive 及其自动解包,解构等等有一系列问题,但不要再打这些东西的主意了。
weijancc
2024-05-16 16:07:56 +08:00
用 class 还是算了
Track13
2024-05-16 16:28:50 +08:00
vue3 的响应式和 tsx 的灵活性,要不试试看 solidjs
kneo
2024-05-16 16:43:45 +08:00
vue 定义了 ref 和 reactive 就是为了让你别自己写这些玩意。你自己把这些反模式包装了一下又塞回来,真是个小天才。
CHTuring
2024-05-16 16:59:43 +08:00
vue2 不支持 ts 拆 hack 的这种写法,被你又从 vue3 上加回来了,小天才。
zhudapaooo
2024-05-16 16:59:54 +08:00
四不像了

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

https://ex.noerr.eu.org/t/1041256

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

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

© 2021 V2EX