惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
Schneier on Security
Hugging Face - Blog
Hugging Face - Blog
V
Visual Studio Blog
博客园 - Franky
酷 壳 – CoolShell
酷 壳 – CoolShell
Last Week in AI
Last Week in AI
博客园 - 叶小钗
博客园_首页
阮一峰的网络日志
阮一峰的网络日志
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Application and Cybersecurity Blog
Application and Cybersecurity Blog
TaoSecurity Blog
TaoSecurity Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
J
Java Code Geeks
爱范儿
爱范儿
宝玉的分享
宝玉的分享
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
量子位
N
News and Events Feed by Topic
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Recent Commits to openclaw:main
Recent Commits to openclaw:main
SecWiki News
SecWiki News
MyScale Blog
MyScale Blog
AI
AI
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
博客园 - 【当耐特】
Security Archives - TechRepublic
Security Archives - TechRepublic
F
Fortinet All Blogs
V2EX - 技术
V2EX - 技术
T
Troy Hunt's Blog
有赞技术团队
有赞技术团队
W
WeLiveSecurity
Project Zero
Project Zero
T
Tor Project blog
Help Net Security
Help Net Security
L
LINUX DO - 最新话题
IT之家
IT之家
The Hacker News
The Hacker News
腾讯CDC
Schneier on Security
Schneier on Security
N
News and Events Feed by Topic
C
Cisco Blogs
博客园 - 聂微东
Webroot Blog
Webroot Blog
Forbes - Security
Forbes - Security
M
MIT News - Artificial intelligence
C
Cyber Attacks, Cyber Crime and Cyber Security
雷峰网
雷峰网
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
A
About on SuperTechFans

Vue.js

AI 特效 shadcn-vue-admin 已升级至 vite8 - V2EX 我真的要放弃 Vue,改用 React 了 - V2EX 请问 vue3 的 onclick 和 @click 有什么区别 - V2EX 求推荐美观、功能全的 vue AI chat 组件 - V2EX [求助贴] 有没有推荐的 vue3 页面设计器 大屏设计器(源码可以拿来二开的 开源 or 收费) - V2EX 有没有大佬在正式项目里使用 rolldown 了 - V2EX Vue 的 reactive 会有人专门用吗? - V2EX 大佬们,想在 vue 中集成一个 excel,有什么方案? - V2EX vue3 无法手动控制 keepalive 的缓存| fork 了独立的 keep-alive 组件|支持手动删除缓存或者添加缓存 - V2EX WebStorm 写 个 v-for, cpu 就狂飙 - V2EX Nuxt UI 4 可以免费用 Pro 了 - V2EX Vue2 除了 ele-table-editor,还有没有其他“子表单(inline-formset)”的组件? - V2EX 请问 vue 的 defineEmits 类型如何使用动态键名 - V2EX VUE 开发求助 - V2EX 屎代码靠我自己骂已经不解气了,佬们来看个笑话 - V2EX 我的 mp4 播放不出来! - V2EX 有一个 8K 行的 VUE 代码文件用什么 AI 可以解耦 - V2EX 求助 Vue 大佬,为什么使用 reactive 数据没有双向绑定? - V2EX uniapp 求助 - V2EX Vue3 编写的最佳实践是怎样的? - V2EX 开发一款轻便简洁的论坛程序 - V2EX VueConf 2025 所有演讲嘉宾及日程已确定, 7 月 12 日,深圳见! - V2EX vue3+ELInput 无法输入的问题 - V2EX 想问一下 pinia 持久化到 localStorage 如何实现有效期 - V2EX 有什么适用于 Vue/Nuxt 的表单/问卷/试卷+设计器库么 - V2EX vue_cli 用到 env 环境变量值特殊字符处理 - V2EX 统计基于 vue 的汽水音乐电脑版用了哪些开源组件 - V2EX ant-design-vue 好像不怎么维护了, vue 有什么比较靠谱的 ui 组件库吗 - V2EX 关于二次封装 element-plus 组件库主题问题 - V2EX 🎉 VueConf 2025 来啦, 7 月 12 日,深圳见! - V2EX vue 怎么 5 个月不更新了 - V2EX 前端 props 单向数据流 vs 状态管理流 你更能接受哪种代码 - V2EX WSL2 + System Proxy 后, vite 启动的项目,随机一部分网络请求变得巨慢,求指导。 - V2EX vue vite 打包 白屏问题 - V2EX 外行搞前端构建环境真的很头疼,有谁能帮忙搞定这个 Nuxt3 开源项目的构建?有偿。 - V2EX vue 指令更新问题 - V2EX 为什么 vue 的 nuxt.js 不跟进 nextjs 的 app route 目录结构 - V2EX 使用 Ant design X vue 组件库怎么解决无法正确展示 MarkDown 格式字符串的问题? - V2EX shadcn, shadcnvue 全是基于 tailwindcss 的,没有基于 unocss 的嘛? - V2EX vue3 的 template typescript 支持稀烂,退坑 - V2EX 组件持久化的问题请教 - V2EX Vue3 tsx 应该用 props 还是 emit 传递事件? - V2EX 话说我怎么就懵逼了呢? Vue3 的泛型组件 generic="T"? - V2EX 请教 Vue3 + typescript 最佳实践问题 - V2EX vue3 纯前端如何生成 icns 格式图片? - V2EX 你们写 vue 一定是按照 vue 的脚手架的目录结构来写吗? - V2EX 大佬们, vue3 新人求教,就没有办法对 ref 包装的 obj 进行解构吗 - V2EX vue3 中 v-show 分页问题 - V2EX el-table 使用 expand 展开倒数第二行时,最下面一行会错乱,我把第一列的数据进行了合并,求问大家怎么解决呀?
用 reactive 來實現 oo 對象的封裝 - V2EX
mizuhashi · 2025-11-14 · via Vue.js

我不確定這是否是普遍的用法,但我發現 reactive 非常適合用來建立類似 OO 的封裝。

reactive會把 refs 展平,所以可以這麼寫:

function useClient() {
  const name = ref('Alice')
  const greeting = computed(() => `Hello ${name.value}`)

  function updateName(newName: string) {
    name.value = newName
  }

  return reactive({
    name,
    greeting,
    updateName
  })
}

在 component 裏:

const client = useClient()
client.greeting // => 'Hello Alice'

client.updateName('Bob')
client.greeting // => 'Hello Bob'

現在client管理它自己的狀態,其暴露的接口可以直接用在模板裏。

我們也可以組合這些對象和保留嚮應性:

function useOrder(client: ReturnType<typeof useClient>) {
  const createdBy = computed(() => `Created by ${client.name}`)

  // 你也可以在這裏調用 client.updateName

  return reactive({
    createdBy
  })
}

const client = useClient()
const order = useOrder(client)
order.createdBy // => 'Created by Alice'
client.updateName('Bob')
order.createdBy // => 'Created by Bob'

我覺得這是 vue 相對於其他庫特別的屬性,我只需要傳遞一個對象,而它擁有自己的狀態和方法。

在現實中,這些對象一般會基於後端數據,我們可以在後端數據的基礎上擴展狀態和方法。

async function useOrder(client: ReturnType<typeof useClient>) {
  const orderData = reactive(await fetchOrderData())

  const paid = ref(false)

  async function pay() {
    const res = await paymentAPI()
    paid.value = res.success
  }

  return reactive({
    ...toRefs(orderData), // 所有 orderData 的屬性會被暴露
    // 我們需要 toRefs 來保持嚮應性
    paid,
    pay
  })
}

現在給定一個 order ,我們可以直接在模板裏綁定order.paidorder.pay

本帖在 reddit 上的版本: https://www.reddit.com/r/vuejs/comments/1owezu4/reactive_as_an_object_encapsulation/