[vue3]组件操作Dom元素,多个同名ref时的解决方法,返回了proxy对象时的使用

/ 3,657评论 / 21452阅读 / 5点赞

1. 原生js中我们会使用document.getElementsByClassName(),document.getElementById()等获取dom元素,但在vue中,更推荐使用ref获取。

2. 不同文件的ref相互独立,即使同名也不会互相影响而导致获取错误。一个组件被多次引用后同时存在多个实例时,每个实例的ref也是互相独立的。这一点显然比getElementById()要好很多。

3. 标签的ref属性值在每一个vue文件中需要是唯一的,否则可能在获取时发生与预期不同的效果。显然使用v-for时如果单项带有ref就需要我们解决这个问题。

使用ref绑定Dom元素

<template>
    <span id="myspanid" ref="mySpanRef">hello coolight</span>
</template>

获取

获取的方式很多,这里介绍其中的几种,以及提及一些document的方法和注意事项

祖传getElementById()

<script setup>
import { onMounted } from "vue";

let span_id = document.getElementById("myspanid");
console.log("setup: span_id = ", span_id);

onMounted(() => {
    console.log("onMounted: span_id = ", span_id);
    span_id = document.getElementById("myspanid");
    console.log("onMounted: span_id = ", span_id);
})
</script>

<template>
    <span id="myspanid" ref="mySpanRef">hello coolight</span>
</template>

ref(null)

<script setup>
import { ref,onMounted, getCurrentInstance } from "vue";

let mySpanRef = ref(null);
console.log("setup: mySpanRef = ", mySpanRef);
console.log("setup: mySpanRef.value = ", mySpanRef.value);

onMounted(() => {
    console.log("读取setup获取的mySpanRef:");
    console.log("onMounted: mySpanRef = ", mySpanRef);
    console.log("onMounted: mySpanRef.value = ", mySpanRef.value);
    mySpanRef = ref(null);
    console.log("读取onMounted获取的mySpanRef:");
    console.log("onMounted: mySpanRef = ", mySpanRef);
    console.log("onMounted: mySpanRef.value = ", mySpanRef.value);
})
</script>

<template>
    <span ref="mySpanRef">hello coolight</span>
</template>
<script setup>
import { ref, onMounted } from "vue";

const mySpanRef = ref(null);

onMounted(() => {
    console.log(mySpanRef);
    console.log(mySpanRef.clientWidth);
    console.log(mySpanRef.value.clientWidth);
})
</script>

<template>
    <span ref="mySpanRef">hello coolight</span>
</template>

$refs.refName

<script setup>
import { onMounted, getCurrentInstance } from "vue";

let mySpan;

onMounted(() => {
    let { $refs } = (getCurrentInstance()).proxy;
    mySpan = $refs.mySpanRef;
    console.log("onMounted: mySpan = ", mySpan);
})
</script>

<template>
    <span ref="mySpanRef">hello coolight</span>
</template>

$refs[refName]

<script setup>
import { onMounted, getCurrentInstance } from "vue";

let mySpan;

onMounted(() => {
    let { $refs } = (getCurrentInstance()).proxy;
    let name = "mySpanRef";
    mySpan = $refs[name]; 
    //mySpan = $refs['mySpanRef'];      //这个也是可以的
    console.log("onMounted: mySpan = ", mySpan);
})
</script>

<template>
    <span ref="mySpanRef">hello coolight</span>
</template>

多个同名ref的解决方法

上面我们都是把ref当成id一样使用,但在v-for后产生的列表项可能遇到ref重复,下面我们聊聊如何解决这个问题

<script setup>
import { ref, onMounted, getCurrentInstance } from "vue";

let mySpanRef = ref(null);

onMounted(() => {
    console.log("ref(null) = ", mySpanRef.value);
    let { $refs } = (getCurrentInstance()).proxy;
    mySpanRef = $refs.mySpanRef;
    console.log("$refs.mySpanRef = ", mySpanRef);
    mySpanRef = $refs['mySpanRef'];
    console.log("$refs['mySpanRef'] = ", mySpanRef);
})
</script>

<template>
    <div>
        <span ref="mySpanRef">hello coolight</span>
        <span ref="mySpanRef">hello 洛天依</span>
    </div>
</template>
<script setup>
import { onMounted, getCurrentInstance } from "vue";

let arr = ['coolight', '洛天依', 'enter', 'shift', 'ctrl', 'Alt', 'ESC'];

onMounted(() => {
    let { $refs } = (getCurrentInstance()).proxy;
    console.log($refs['myspan0']);
    console.log("for:");
    for(let i = arr.length; i-- > 0;) {
        console.log($refs['myspan'+ i][0]);
    }
})
</script>

<template>
    <div style="display:flex;flex-direction: column;">
        <span v-for="(item, index) in arr"
            :ref="'myspan' + index">{{index}}:{{item}}</span>
    </div>
</template>

其他问题

返回的是一个proxy对象

let { $refs } = (getCurrentInstance()).proxy;
let dom = $refs['myul'];    //proxy对象
dom.$el;                    //标签内容
dom.$el.clientWidth;        //通过$el即可同getElementById()获取到的标签一样操作
  1. AllenTal说道:

    acheter mГ©dicament en ligne sans ordonnance: Levitra 20mg prix en pharmacie – pharmacie en ligne france livraison internationale

  2. AllenTal说道:

    Pharmacie sans ordonnance: levitra en ligne – pharmacie en ligne livraison europe

  3. Aurora CO说道:

    What’s up colleagues, how is the whole thing,
    and what you wish for to say regarding this post, in my view its truly awesome in support of me.

  4. AllenTal说道:

    pharmacie en ligne avec ordonnance: Medicaments en ligne livres en 24h – pharmacie en ligne fiable

  5. AllenTal说道:

    п»їpharmacie en ligne france: Pharmacies en ligne certifiees – pharmacie en ligne france livraison internationale

  6. AllenTal说道:

    pharmacies en ligne certifiГ©es: Acheter Cialis 20 mg pas cher – pharmacie en ligne france livraison internationale

  7. AllenTal说道:

    Achat mГ©dicament en ligne fiable: Cialis sans ordonnance 24h – Achat mГ©dicament en ligne fiable

  8. IgnacioGinia说道:

    Achat mГ©dicament en ligne fiable: kamagra oral jelly – pharmacie en ligne livraison europe

  9. IgnacioGinia说道:

    vente de mГ©dicament en ligne: kamagra en ligne – Pharmacie Internationale en ligne

  10. AllenTal说道:

    Viagra Pfizer sans ordonnance: Viagra sans ordonnance 24h – SildГ©nafil 100 mg sans ordonnance

  11. AllenTal说道:

    pharmacie en ligne sans ordonnance: acheter kamagra site fiable – pharmacie en ligne avec ordonnance

  12. RobertDer说道:

    https://kamagraenligne.shop/# vente de médicament en ligne

  13. AllenTal说道:

    Pharmacie en ligne livraison Europe: achat kamagra – vente de mГ©dicament en ligne

  14. AllenTal说道:

    pharmacie en ligne france pas cher: pharmacie en ligne pas cher – Pharmacie sans ordonnance

  15. RobertDer说道:

    https://kamagraenligne.com/# acheter médicament en ligne sans ordonnance

  16. AllenTal说道:

    п»їpharmacie en ligne france: cialis generique – pharmacie en ligne france fiable

  17. AllenTal说道:

    Pharmacie sans ordonnance: cialis prix – pharmacie en ligne france pas cher

  18. IgnacioGinia说道:

    pharmacie en ligne france livraison internationale: pharmacie en ligne sans ordonnance – pharmacie en ligne france livraison belgique

  19. IgnacioGinia说道:

    pharmacie en ligne france pas cher: pharmacie en ligne avec ordonnance – п»їpharmacie en ligne france

  20. AllenTal说道:

    vente de mГ©dicament en ligne: pharmacie en ligne livraison europe – pharmacie en ligne france pas cher

  21. AllenTal说道:

    Achat mГ©dicament en ligne fiable: achat kamagra – acheter mГ©dicament en ligne sans ordonnance

  22. I all the time used to study paragraph in news papers but now as
    I am a user of net so from now I am using net for articles or reviews, thanks
    to web.

  23. AllenTal说道:

    pharmacie en ligne fiable: cialis generique – Achat mГ©dicament en ligne fiable

  24. XRumer23jatup说道:

    Hello!

    This post was created with XRumer 23 StrongAI.

    Good luck 🙂

  25. AllenTal说道:

    Pharmacie en ligne livraison Europe: levitra en ligne – pharmacie en ligne sans ordonnance

  26. AllenTal说道:

    vente de mГ©dicament en ligne: п»їpharmacie en ligne france – pharmacie en ligne sans ordonnance

  27. IgnacioGinia说道:

    pharmacie en ligne france pas cher: pharmacie en ligne – Achat mГ©dicament en ligne fiable

  28. XRumer23jatup说道:

    Hello.

    This post was created with XRumer 23 StrongAI.

    Good luck 🙂

  29. IgnacioGinia说道:

    pharmacie en ligne france fiable: Medicaments en ligne livres en 24h – pharmacie en ligne pas cher

  30. Edwardcit说道:

    Pharmacie en ligne livraison Europe: levitra generique – п»їpharmacie en ligne france

  31. AllenTal说道:

    Pharmacie sans ordonnance: pharmacie en ligne france fiable – pharmacie en ligne avec ordonnance

  32. Edwardcit说道:

    pharmacie en ligne pas cher: Levitra pharmacie en ligne – Pharmacie sans ordonnance

  33. RobertDer说道:

    https://viaenligne.shop/# Viagra homme sans ordonnance belgique

  34. AllenTal说道:

    Pharmacie en ligne livraison Europe: pharmacie en ligne – pharmacie en ligne france fiable

  35. Edwardcit说道:

    pharmacie en ligne: kamagra en ligne – Pharmacie en ligne livraison Europe

  36. RobertDer说道:

    http://phenligne.com/# Pharmacie en ligne livraison Europe

  37. AllenTal说道:

    Quand une femme prend du Viagra homme: Viagra sans ordonnance 24h – Viagra homme prix en pharmacie sans ordonnance

  38. Edwardcit说道:

    п»їpharmacie en ligne france: levitra generique prix en pharmacie – Pharmacie sans ordonnance

  39. Keithhak说道:

    Acheter viagra en ligne livraison 24h Viagra homme sans prescription Viagra gГ©nГ©rique sans ordonnance en pharmacie

  40. Edwardcit说道:

    trouver un mГ©dicament en pharmacie: kamagra 100mg prix – pharmacie en ligne france fiable

  41. AllenTal说道:

    pharmacie en ligne pas cher: Levitra sans ordonnance 24h – pharmacie en ligne

  42. IgnacioGinia说道:

    pharmacie en ligne pas cher: pharmacie en ligne pas cher – Achat mГ©dicament en ligne fiable

  43. Keithhak说道:

    pharmacie en ligne france livraison belgique pharmacie en ligne pas cher trouver un mГ©dicament en pharmacie

  44. IgnacioGinia说道:

    vente de mГ©dicament en ligne: Levitra 20mg prix en pharmacie – pharmacie en ligne france fiable

  45. IgnacioelOrb说道:

    Pharmacie Internationale en ligne: Acheter Cialis 20 mg pas cher – pharmacie en ligne

  46. Edwardcit说道:

    pharmacie en ligne france livraison internationale: п»їpharmacie en ligne france – Achat mГ©dicament en ligne fiable

  47. AllenTal说道:

    Viagra sans ordonnance livraison 24h: Viagra sans ordonnance 24h – Viagra sans ordonnance 24h suisse

  48. IgnacioelOrb说道:

    vente de mГ©dicament en ligne: cialis sans ordonnance – Pharmacie Internationale en ligne

  49. Edwardcit说道:

    Viagra femme ou trouver: Acheter du Viagra sans ordonnance – Viagra homme sans ordonnance belgique

  50. Your style is so unique compared to other people I
    have read stuff from. Many thanks for posting when you have the opportunity, Guess I’ll
    just bookmark this page.

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注