1
1
# @vue/composition-api
2
2
3
- Vue 2 插件用于提供 Vue 3 中的 ** 组合式 API** .
3
+ 用于提供 ** 组合式 API** 的 Vue 2 插件 .
4
4
5
5
[ ![ npm] ( https://img.shields.io/npm/v/@vue/composition-api )] ( https://www.npmjs.com/package/@vue/composition-api )
6
6
[ ![ GitHub Workflow Status] ( https://img.shields.io/github/workflow/status/vuejs/composition-api/Build%20&%20Test )] ( https://github.com/vuejs/composition-api/actions?query=workflow%3A%22Build+%26+Test%22 )
7
7
8
8
[ English] ( ./README.md ) | 中文 ・ [ ** 组合式 API 文档** ] ( https://composition-api.vuejs.org/zh )
9
9
10
-
11
10
## 安装
12
11
13
12
### NPM
@@ -18,7 +17,7 @@ npm install @vue/composition-api
18
17
yarn add @vue/composition-api
19
18
```
20
19
21
- 在使用 ` @vue/composition-api ` 前,必须先先通过 ` Vue.use() ` 进行安装后方可使用使用新的 [ ** 组合式 API** ] ( https://composition-api.vuejs.org/zh ) 进行组件开发。
20
+ 在使用 ` @vue/composition-api ` 前,必须先通过 ` Vue.use() ` 进行安装。之后才可使用新的 [ ** 组合式 API** ] ( https://composition-api.vuejs.org/zh ) 进行组件开发。
22
21
23
22
``` js
24
23
import Vue from ' vue'
@@ -34,16 +33,17 @@ import { ref, reactive } from '@vue/composition-api'
34
33
35
34
> :bulb : 当迁移到 Vue 3 时,只需简单的将 ` @vue/composition-api ` 替换成 ` vue ` 即可。你现有的代码几乎无需进行额外的改动。
36
35
37
-
38
36
### CDN
39
37
40
38
在 Vue 之后引入 ` @vue/composition-api ` ,插件将会自动完成安装。
41
39
42
40
<!-- cdn-links-start-->
41
+
43
42
``` html
44
43
<script src =" https://cdn.jsdelivr.net/npm/vue@2.6" ></script >
45
44
<script src =" https://cdn.jsdelivr.net/npm/@vue/composition-api@1.0.0-beta.6" ></script >
46
45
```
46
+
47
47
<!-- cdn-links-end-->
48
48
49
49
` @vue/composition-api ` 将会暴露在全局变量 ` window.VueCompositionAPI ` 中。
@@ -56,7 +56,7 @@ const { ref, reactive } = VueCompositionAPI
56
56
57
57
> 本插件要求使用 TypeScript ** 3.5.1** 或以上版本
58
58
59
- 为了让 TypeScript 在 Vue 组件选项中正确地推导类型 ,我们必须使用 ` defineComponent ` 来定义组件:
59
+ 为了让 TypeScript 在 Vue 组件选项中正确地进行类型推导 ,我们必须使用 ` defineComponent ` 来定义组件:
60
60
61
61
``` ts
62
62
import { defineComponent } from ' @vue/composition-api'
@@ -72,7 +72,7 @@ export default defineComponent({
72
72
73
73
## SSR
74
74
75
- 尽管 Vue 3 暂时没有给出确定的 SSR 的 API,这个插件实现了 ` onServerPrefetch ` 生命周期钩子函数。这个钩子允许你使用在传统 API 中的 ` serverPrefetch ` 函数。
75
+ 尽管 Vue 3 暂时没有给出确定的 SSR 的 API,这个插件实现了 ` onServerPrefetch ` 生命周期钩子函数。这个钩子允许你使用传统 API 中的 ` serverPrefetch ` 函数。
76
76
77
77
``` js
78
78
import { onServerPrefetch } from ' @vue/composition-api'
@@ -86,22 +86,20 @@ export default {
86
86
})
87
87
88
88
return {
89
- result
89
+ result,
90
90
}
91
- }
91
+ },
92
92
}
93
93
```
94
94
95
95
## 限制
96
96
97
97
> :white_check_mark : 支持   ;  ;  ;  ; :x : 不支持
98
98
99
-
100
99
### ` Ref ` 自动展开 (unwrap)
101
100
102
101
数组索引属性无法进行自动展开:
103
102
104
-
105
103
<details >
106
104
<summary >
107
105
❌ <b >不要</b > 使用数组直接存取 <code >ref</code > 对象
@@ -121,19 +119,17 @@ state.list[1].value === 1 // true
121
119
122
120
</details >
123
121
124
-
125
122
<details >
126
123
<summary >
127
124
❌ <b >不要</b > 在数组中使用含有 <code >ref</code > 的普通对象
128
125
</summary >
129
126
130
-
131
127
``` js
132
128
const a = {
133
- count: ref (0 )
129
+ count: ref (0 ),
134
130
}
135
131
const b = reactive ({
136
- list: [a] // `a.count` 不会自动展开!!
132
+ list: [a], // `a.count` 不会自动展开!!
137
133
})
138
134
139
135
// `count` 不会自动展开, 须使用 `.value`
@@ -144,9 +140,9 @@ b.list[0].count.value === 0 // true
144
140
const b = reactive ({
145
141
list: [
146
142
{
147
- count: ref (0 ) // 不会自动展开!!
148
- }
149
- ]
143
+ count: ref (0 ), // 不会自动展开!!
144
+ },
145
+ ],
150
146
})
151
147
152
148
// `count` 不会自动展开, 须使用 `.value`
@@ -155,29 +151,28 @@ b.list[0].count.value === 0 // true
155
151
156
152
</details >
157
153
158
-
159
154
<details >
160
155
<summary >
161
156
✅ 在数组中,<b >应该</b > 总是将 <code >ref</code > 存放到 <code >reactive</code > 对象中
162
157
</summary >
163
158
164
159
``` js
165
160
const a = reactive ({
166
- count: ref (0 )
161
+ count: ref (0 ),
167
162
})
168
163
const b = reactive ({
169
- list: [a]
164
+ list: [a],
170
165
})
171
166
// 自动展开
172
167
b .list [0 ].count === 0 // true
173
168
174
169
b .list .push (
175
170
reactive ({
176
- count: ref (1 )
171
+ count: ref (1 ),
177
172
})
178
173
)
179
174
// 自动展开
180
- b .list [1 ].count === 1 ; // true
175
+ b .list [1 ].count === 1 // true
181
176
```
182
177
183
178
</details >
@@ -205,17 +200,15 @@ b.list[1].count === 1; // true
205
200
})
206
201
207
202
return {
208
- root
203
+ root,
209
204
}
210
- }
205
+ },
211
206
}
212
207
</script >
213
208
```
214
209
215
210
</details >
216
211
217
-
218
-
219
212
<details >
220
213
<summary >
221
214
✅ 字符串 ref && 从 <code >setup()</code > 返回 ref && 渲染函数 / JSX
@@ -232,25 +225,23 @@ export default {
232
225
})
233
226
234
227
return {
235
- root
228
+ root,
236
229
}
237
230
},
238
231
render () {
239
232
// 使用 JSX
240
233
return () => < div ref= " root" / >
241
- }
234
+ },
242
235
}
243
236
```
244
237
245
238
</details >
246
239
247
-
248
240
<details >
249
241
<summary >
250
242
❌ 函数 ref
251
243
</summary >
252
244
253
-
254
245
``` html
255
246
<template >
256
247
<div :ref =" el => root = el" ></div >
@@ -262,16 +253,15 @@ export default {
262
253
const root = ref (null )
263
254
264
255
return {
265
- root
256
+ root,
266
257
}
267
- }
258
+ },
268
259
}
269
260
</script >
270
261
```
271
262
272
263
</details >
273
264
274
-
275
265
<details >
276
266
<summary >
277
267
❌ 在 <code >setup()</code > 中的渲染函数 / JSX
@@ -289,7 +279,7 @@ export default {
289
279
290
280
// 使用 JSX
291
281
return () => < div ref= {root} / >
292
- }
282
+ },
293
283
}
294
284
```
295
285
@@ -300,7 +290,6 @@ export default {
300
290
⚠️ <code >$refs</code > 访问的变通方案
301
291
</summary >
302
292
303
-
304
293
> :warning : ** 警告** : ` SetupContext.refs ` 并不属于 ` Vue 3.0 ` 的一部分, ` @vue/composition-api ` 将其曝光在 ` SetupContext ` 中只是临时提供一种变通方案。
305
294
306
295
如果你依然选择在 ` setup() ` 中写 ` render ` 函数,那么你可以使用 ` SetupContext.refs ` 来访问模板引用,它等价于 Vue 2.x 中的 ` this.$refs ` :
@@ -311,7 +300,7 @@ export default {
311
300
const refs = setupContext .refs
312
301
onMounted (() => {
313
302
// 在初次渲染后 DOM 元素会被赋值给 ref
314
- console .log (refs .root ); // <div/>
303
+ console .log (refs .root ) // <div/>
315
304
})
316
305
317
306
return () =>
@@ -352,7 +341,6 @@ declare module '@vue/composition-api' {
352
341
353
342
</details >
354
343
355
-
356
344
### Watch
357
345
358
346
<details >
@@ -364,10 +352,11 @@ declare module '@vue/composition-api' {
364
352
watch (
365
353
() => {
366
354
/* ... */
367
- }, {
355
+ },
356
+ {
368
357
immediate: true ,
369
- onTrack () {}, // 不可用
370
- onTrigger () {}, // 不可用
358
+ onTrack () {}, // 不可用
359
+ onTrigger () {}, // 不可用
371
360
}
372
361
)
373
362
```
@@ -409,17 +398,16 @@ export default {
409
398
data () {
410
399
return {
411
400
// 在模版中会成为 { a: { value: 1 } }
412
- a: ref (1 )
401
+ a: ref (1 ),
413
402
}
414
- }
403
+ },
415
404
}
416
405
```
417
406
418
407
</details >
419
408
420
-
421
409
### 性能影响
422
410
423
- 用于 Vue 2 所提供的公共 API 的限制,` @vue/composition-api ` 不可避免地引入了额外的性能开销。在非极端情况下,这并不会对你造成影响 。
411
+ 由于 Vue 2 的公共 API 的限制,` @vue/composition-api ` 不可避免地引入了额外的性能开销。除非在极端情况下,否则这并不会对你造成影响 。
424
412
425
413
你可以查看这个 [ 跑分结果] ( https://antfu.github.io/vue-composition-api-benchmark-results/ ) 了解更多信息。
0 commit comments