Vue | Vue中 ref 的用法及演示

这篇文章主要介绍了Vue中ref的用法及演示,ref被用来给元素或子组件注册引用信息。引用信息会被注册在父组件上的$refs对象上,下面来看看文章的详细内容,需要的朋友可以参考一下。

ref 定义:被用来给元素或子组件注册引用信息。引用信息会被注册在父组件上的$refs对象上。

  • 如果是在普通的dom元素上使用,引用指向的就是dom元素;
  • 如果用在子组件上,引用指向的就是组件实例。

举例:

组件1:

<template>
  <div>我是{ {name}}</div>
</template>

<script>
  export default {
    name: "Cpn1",

    data() {
      return {
        name: "组件1",
      };
    },
  };
</script>

组件2:

<template>
  <div>我是{ {name}}</div>
</template>

<script>
  export default {
    name: "Cpn2",

    data() {
      return {
        name: "组件2",
      };
    },
  };
</script>

App.vue

<template>
  <div id="app">
    <cpn-1 ref="c1"></cpn-1>
    <cpn-2 ref="c2"></cpn-2>
    <button @click="showDom">按钮</button>
    <h2 ref="title">我是标题</h2>
    <input type="text" ref="input" value="123" />
  </div>
</template>

<script>
  import Cpn1 from "./components/Cpn1.vue";
  import Cpn2 from "./components/Cpn2.vue";

  export default {
    components: {
      Cpn1,
      Cpn2,
    },
    name: "App",
    methods: {
      showDom() {
        console.log(this.$refs.c1);
        console.log(this.$refs.c2.$data.name);
        console.log(this.$refs.title);
        console.log(this.$refs.input.value);

        // 获取一个真实的dom对象并修改值
        var title = this.$refs.title;
        title.innerText = "helloWord";
      },
    },
  };
</script>

执行上面的程序,点击页面上的《按钮》,效果如下:

同时看控制台:

可以看到当 ref 对象用在普通元素上时获取到的是普通DOM元素,当 ref 用在子组件上时,引用指向组件实例。

根据实际需要,可以通过 ref 给元素或者子组件注册引用信息,在需要用到的时候我们可以通过 $refs 获取真实的DOM元素或者组件实例进行我们想要的操作。


参考资料

Vue | Vue中 ref 的用法小结_儒雅的烤地瓜的优快云博客

Vue | vue中 $refs 的三种用法解读_儒雅的烤地瓜的优快云博客

Vue | vue中$refs的用法及作用详解_儒雅的烤地瓜的优快云博客

Vue中ref、reactive、toRef、toRefs、$refs的基本用法总结_vue.js_脚本之家

### Vue 3 中使用 `ref` 获取 DOM 元素 在 Vue 3 中,`ref` 是一种用于创建对 DOM 元素或子组件实例的引用的方法。这使得可以直接访问这些元素并对其进行操作。 #### 基本用法 为了定义一个可以绑定到 HTML 或自定义组件上的响应式引用,需调用 `ref()` 函数并将返回的结果分配给模板中的某个属性。当页面加载完成之后,在 JavaScript 部分可以通过 `.value` 属性读取实际的对象[^1]。 ```javascript import { ref, onMounted } from 'vue'; export default { setup() { const myElement = ref(null); onMounted(() => { console.log(myElement.value); // 输出真实的DOM节点 }); return { myElement, }; }, }; ``` 此代码片段展示了如何声明名为 `myElement` 的引用变量,并将其初始化为 `null`。一旦组件挂载完毕,则会打印出关联的真实 DOM 节点[^2]。 #### 结合 `<script setup>` 语法糖简化写法 对于采用 Composition API 和 `<script setup>` 语法糖的新项目而言,上述过程变得更加简洁明了: ```html <template> <div ref="show">这是一个 div</div> </template> <script setup> import { ref, onMounted } from 'vue'; const show = ref(null); onMounted(() => { console.log('show---', show.value); // 打印真实DOM节点 }); </script> ``` 这段例子中,直接利用 `<script setup>` 来设置好所有的逻辑部分;而在模板里只需要简单地加上 `ref="someName"` 即可建立联系。 #### 利用 `nextTick` 处理异步更新场景 有时可能希望等待某些更改被应用后再去处理相应的 DOM 变化。此时就可以借助于 `nextTick` 方法来实现这一点。下面的例子修改了一个列表项的内容作为演示[^4]: ```html <template> <ul> <li v-for="(item, index) in items" :key="index" ref="domH2">{{ item }}</li> </ul> </ul> <button @click="changeItem">Change Item</button> </template> <script setup> import { ref, nextTick } from 'vue'; const items = ['Alice', 'Bob']; const domH2 = ref([]); function changeItem() { items[2] = '上杉绘梨衣!'; nextTick(() => { const domList = unref(domH2); if (domList && domList.length > 2) { domList[2].innerHTML = '上杉绘梨衣!'; } }); } </script> ``` 在这个案例里面,点击按钮触发函数改变数组第三位成员的名字,接着通过 `nextTick` 确保视图已经同步最新状态后才执行后续针对特定位置元素的操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

儒雅的烤地瓜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值