Skip to content

Commit c5dd319

Browse files
committed
docs: Update usage of useTemplateRef() in composition API guide
1 parent 754e37c commit c5dd319

File tree

1 file changed

+77
-2
lines changed

1 file changed

+77
-2
lines changed

src/guide/essentials/template-refs.md

Lines changed: 77 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,31 @@ Vue の宣言型レンダリングモデルは、直接的な DOM 操作のほ
1212

1313
<div class="composition-api">
1414

15-
Composition API で参照を取得するには、以下のようにテンプレートの ref 属性の値と一致する名前の ref を宣言します:
15+
Composition API で参照を取得するには、[`useTemplateRef()`](/api/composition-api-helpers#usetemplateref) ヘルパー <sup class="vt-badge" data-text="3.5+" /> を使用できます:
16+
17+
```vue
18+
<script setup>
19+
import { useTemplateRef, onMounted } from 'vue'
20+
21+
// 最初の引数は、テンプレートの ref の値に一致させる必要があります。
22+
const input = useTemplateRef('my-input')
23+
24+
onMounted(() => {
25+
input.value.focus()
26+
})
27+
</script>
28+
29+
<template>
30+
<input ref="my-input" />
31+
</template>
32+
```
33+
34+
TypeScript を使用する場合、Vue の IDE サポートと `vue-tsc` は、一致する `ref` 属性が使用されている要素やコンポーネントに基づいて、`inputRef.value` の型を自動的に推論します。
35+
36+
<details>
37+
<summary>3.5 以前の使用方法</summary>
38+
39+
`useTemplateRef()` が導入されていなかった 3.5 以前のバージョンでは、テンプレート内の `ref` 属性の値と同じ名前で `ref` を宣言する必要がありました:
1640

1741
```vue
1842
<script setup>
@@ -46,6 +70,8 @@ export default {
4670
}
4771
```
4872

73+
</details>
74+
4975
</div>
5076
<div class="options-api">
5177

@@ -95,6 +121,33 @@ watchEffect(() => {
95121

96122
`v-for` の中で `ref` を使用すると、対応する参照には配列値が格納されます。そしてこの配列値には、マウント後の要素が代入されます:
97123

124+
```vue
125+
<script setup>
126+
import { ref, useTemplateRef, onMounted } from 'vue'
127+
128+
const list = ref([
129+
/* ... */
130+
])
131+
132+
const itemRefs = useTemplateRef('items')
133+
134+
onMounted(() => console.log(itemRefs.value))
135+
</script>
136+
137+
<template>
138+
<ul>
139+
<li v-for="item in list" ref="items">
140+
{{ item }}
141+
</li>
142+
</ul>
143+
</template>
144+
```
145+
146+
[Playground で試す](https://play.vuejs.org/#eNp9UsluwjAQ/ZWRLwQpDepyQoDUIg6t1EWUW91DFAZq6tiWF4oU5d87dtgqVRyyzLw3b+aN3bB7Y4ptQDZkI1dZYTw49MFMuBK10dZDAxZXOQSHC6yNLD3OY6zVsw7K4xJaWFldQ49UelxxVWnlPEhBr3GszT6uc7jJ4fazf4KFx5p0HFH+Kme9CLle4h6bZFkfxhNouAIoJVqfHQSKbSkDFnVpMhEpovC481NNVcr3SaWlZzTovJErCqgydaMIYBRk+tKfFLC9Wmk75iyqg1DJBWfRxT7pONvTAZom2YC23QsMpOg0B0l0NDh2YjnzjpyvxLrYOK1o3ckLZ5WujSBHr8YL2gxnw85lxEop9c9TynkbMD/kqy+svv/Jb9wu5jh7s+jQbpGzI+ZLu0byEuHZ+wvt6Ays9TJIYl8A5+i0DHHGjvYQ1JLGPuOlaR/TpRFqvXCzHR2BO5iKg0Zmm/ic0W2ZXrB+Gve2uEt1dJKs/QXbwePE)
147+
148+
<details>
149+
<summary>3.5 以前の使用方法</summary>
150+
98151
```vue
99152
<script setup>
100153
import { ref, onMounted } from 'vue'
@@ -117,7 +170,7 @@ onMounted(() => console.log(itemRefs.value))
117170
</template>
118171
```
119172

120-
[Playground で試す](https://play.vuejs.org/#eNpFjs1qwzAQhF9l0CU2uDZtb8UOlJ576bXqwaQyCGRJyCsTEHr3rGwnOehnd2e+nSQ+vW/XqMSH6JdL0J6wKIr+LK2evQuEhKCmBs5+u2hJ/SNjCm7GiV0naaW9OLsQjOZrKNrq97XBW4P3v/o51qTmHzUtd8k+e0CrqsZwRpIWGI0KVN0N7TqaqNp59JUuEt2SutKXY5elmimZT9/t2Tk1F+z0ZiTFFdBHs738Mxrry+TCIEWhQ9sttRQl0tEsK6U4HEBKW3LkfDA6o3dst3H77rFM5BtTfm/P)
173+
</details>
121174

122175
</div>
123176
<div class="options-api">
@@ -173,6 +226,26 @@ export default {
173226

174227
<div class="composition-api">
175228

229+
```vue
230+
<script setup>
231+
import { useTemplateRef, onMounted } from 'vue'
232+
import Child from './Child.vue'
233+
234+
const childRef = useTemplateRef('child')
235+
236+
onMounted(() => {
237+
// child.value は <Child /> のインスタンスを保持します。
238+
})
239+
</script>
240+
241+
<template>
242+
<Child ref="child" />
243+
</template>
244+
```
245+
246+
<details>
247+
<summary>3.5 以前の使用方法</summary>
248+
176249
```vue
177250
<script setup>
178251
import { ref, onMounted } from 'vue'
@@ -190,6 +263,8 @@ onMounted(() => {
190263
</template>
191264
```
192265

266+
</details>
267+
193268
</div>
194269
<div class="options-api">
195270

0 commit comments

Comments
 (0)