Vue 3.0 组合式API 模板引用

本节代码示例使用单文件组件的语法

本指南假定你已经阅读了组合式 API 简介响应性基础。如果你不熟悉组合式 API,请先阅读此文章。

在使用组合式 API 时,响应式引用模板引用的概念是统一的。为了获得对模板内元素或组件实例的引用,我们可以像往常一样声明 ref 并从 setup() 返回:

<template> 
  <div ref="root">This is a root element</div>
</template>


<script>
  import { ref, onMounted } from 'vue'


  export default {
    setup() {
      const root = ref(null)


      onMounted(() => {
        // DOM元素将在初始渲染后分配给ref
        console.log(root.value) // <div>这是根元素</div>
      })


      return {
        root
      }
    }
  }
</script>

这里我们在渲染上下文中暴露 root,并通过 ref="root",将其绑定到 div 作为其 ref。在虚拟 DOM 补丁算法中,如果 VNode 的 ref 键对应于渲染上下文中的 ref,则 VNode 的相应元素或组件实例将被分配给该 ref 的值。这是在虚拟 DOM 挂载/打补丁过程中执行的,因此模板引用只会在初始渲染之后获得赋值。

作为模板使用的 ref 的行为与任何其他 ref 一样:它们是响应式的,可以传递到 (或从中返回) 复合函数中。

#JSX 中的用法

export default {
  setup() {
    const root = ref(null)


    return () =>
      h('div', {
        ref: root
      })


    // with JSX
    return () => <div ref={root} />
  }
}

#v-for 中的用法

组合式 API 模板引用在 v-for 内部使用时没有特殊处理。相反,请使用函数引用执行自定义处理:

<template>
  <div v-for="(item, i) in list" :ref="el => { if (el) divs[i] = el }">
    {{ item }}
  </div>
</template>


<script>
  import { ref, reactive, onBeforeUpdate } from 'vue'


  export default {
    setup() {
      const list = reactive([1, 2, 3])
      const divs = ref([])


      // 确保在每次更新之前重置ref
      onBeforeUpdate(() => {
        divs.value = []
      })


      return {
        list,
        divs
      }
    }
  }
</script>
目录

Vue.js 3.0 教程基础

Vue 3.0 安装
Vue 3.0 介绍
Vue 3.0 应用&组件实例
Vue 3.0 模板语法
Vue 3.0 Data Property和方法
Vue 3.0 计算属性和侦听器
Vue 3.0 Class与Style绑定
Vue 3.0 条件渲染
Vue 3.0 列表渲染
Vue 3.0 事件处理
Vue 3.0 表单输入绑定
Vue 3.0 组件基础

Vue.js 3.0 深入组件

Vue 3.0 组件注册
Vue 3.0 Props
Vue 3.0 非Prop的Attribute
Vue 3.0 自定义事件
Vue 3.0 插槽
Vue 3.0 提供/注入
Vue 3.0 动态组件&异步组件
Vue 3.0 模板引用
Vue 3.0 处理边界情况

Vue.js 3.0 过渡&动画

Vue 3.0 过渡&动画概述
Vue 3.0 进入过渡&离开过渡
Vue 3.0 列表过渡
Vue 3.0 状态过渡

Vue.js 3.0 可复用&组合

Vue 3.0 混入
Vue 3.0 自定义指令
Vue 3.0 Teleport
Vue 3.0 渲染函数
Vue 3.0 插件
Vue3 组合式函数

Vue.js 3.0 高阶指南

Vue 3.0 响应性 深入响应性原理
Vue 3.0 响应性 基础
Vue 3.0 响应式 计算和侦听
Vue 3.0 组合式API 介绍
Vue 3.0 组合式API Setup
Vue 3.0 组合式API 生命周期钩子
Vue 3.0 组合式API 提供/注入
Vue 3.0 组合式API 模板引用
Vue 3.0 渲染机制和优化
Vue2中的更改检测警告

Vue.js 3.0 工具

Vue 3.0 单文件组件
Vue 3.0 测试
Vue 3.0 TypeScript支持
Vue 3.0 Mobile

Vue.js 3.0 规模化

Vue 3.0 路由
Vue 3.0 状态管理
Vue 3.0 服务端渲染

Vue.js 3.0 无障碍

Vue 3.0 基础
Vue 3.0 语义学
Vue 3.0 标准
Vue 3.0 资源

Vue.js 3.0 从Vue2迁移

Vue 3.0 介绍
Vue 3.0 v-for中的Ref数组
Vue 3.0 异步组件
Vue 3.0 attribute强制行为
Vue 3.0 自定义指令
Vue 3.0 自定义元素交互
Vue 3.0 Data选项
Vue 3.0 事件API
Vue 3.0 过滤器
Vue 3.0 片段
Vue 3.0 函数式组件
Vue 3.0 全局API
Vue 3.0 全局API Treeshaking
Vue 3.0 内联模板 Attribute
Vue 3.0 key attribute
Vue 3.0 按键修饰符
Vue 3.0 在prop的默认函数中访问this
Vue 3.0 渲染函数API
Vue 3.0 Slot统一
Vue 3.0 过渡的class名更改
Vue 3.0 v-model
Vue 3.0 v-if与v-for的优先级对比
Vue 3.0 v-bind合并行为

Vue.js 3.0 贡献文档

Vue 3.0文档编写指南
Vue 3.0文档风格指南
Vue 3.0 翻译

Vue.js 3.0 API参考

Vue 3.0 应用配置
Vue 3.0 应用API
Vue 3.0 全局API
Vue 3.0 选项 Data
Vue 3.0 选项 DOM
Vue 3.0 选项 生命周期钩子
Vue 3.0 选项/资源
Vue 3.0 选项 组合
Vue 3.0 选项 杂项
Vue 3.0 实例property
Vue 3.0 实例方法
Vue 3.0 指令
Vue 3.0 特殊指令
Vue 3.0 内置组件
Vue 3.0 响应性基础 API
Vue 3.0 响应性API Refs
Vue 3.0 响应性API Computed与watch
Vue 3.0 组合式API

Vue.js 3.0 风格指南

Vue 3.0 风格指南

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }