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

/ 4,036评论 / 25369阅读 / 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. Hi to every one, the contents present at this site are
    genuinely awesome for people experience, well, keep
    up the nice work fellows.

  2. AllenTal说道:

    trouver un mГ©dicament en pharmacie: kamagra gel – pharmacie en ligne

  3. Robertrib说道:

    SildГ©nafil Teva 100 mg acheter: Viagra generique en pharmacie – Viagra sans ordonnance livraison 48h

  4. IgnacioGinia说道:

    SildГ©nafil 100 mg sans ordonnance: Viagra sans ordonnance 24h – Le gГ©nГ©rique de Viagra

  5. IgnacioGinia说道:

    п»їViagra sans ordonnance 24h: viagra sans ordonnance – Meilleur Viagra sans ordonnance 24h

  6. AllenTal说道:

    pharmacies en ligne certifiГ©es: Pharmacies en ligne certifiees – Pharmacie Internationale en ligne

  7. Robertrib说道:

    Pharmacie Internationale en ligne: Levitra pharmacie en ligne – pharmacie en ligne sans ordonnance

  8. AllenTal说道:

    pharmacie en ligne france livraison internationale: acheter kamagra site fiable – Pharmacie en ligne livraison Europe

  9. AllenTal说道:

    pharmacie en ligne france livraison internationale: Medicaments en ligne livres en 24h – pharmacie en ligne

  10. Robertrib说道:

    Viagra pas cher livraison rapide france: Viagra vente libre pays – Viagra vente libre pays

  11. AllenTal说道:

    pharmacies en ligne certifiГ©es: cialis prix – Pharmacie en ligne livraison Europe

  12. AllenTal说道:

    SildГ©nafil 100 mg sans ordonnance: Meilleur Viagra sans ordonnance 24h – Le gГ©nГ©rique de Viagra

  13. museumbola.top说道:

    museumbolaJelajahi dulu, jangan terkecoh dengan aplikasi seharga $49 yang menawarkan ratusan di
    bulan awal, Apakah menurut Anda mungkin Anda bisa menghasilkan ribuan dolar dalam beberapa minggu atau bulan tanpa memerlukan keahlian sebelumnya?
    Saya kira demikian, asalkan seseorang memenangkan lotre dengan cara yang dapat dimengerti.
    Ada berbagai program afiliasi yang berbeda di luar sana di web
    yang memberikan banyak manfaat berbeda bagi pemasar afiliasi.
    Tidak sebagian besar program afiliasi dapat dipercaya, meskipun setiap program
    mengklaim itu yang terbaik dan menawarkan alternatif terbaik agar Anda dapat berafiliasi.
    Ketika memilih program pendamping perusahaan patungan,
    sejumlah isu harus dipertimbangkan. Kami merinci beberapa elemen penting
    untuk dipertimbangkan di bawah ini. Setiap program afiliasi web tentunya memiliki banyak produk
    untuk dipasarkan. Setiap barang dagangan dikirimkan dengan banyak cara lain. Beberapa mungkin memerlukan persediaan fisik atau beberapa barang dagangan elektronik yang memerlukan pengunduhan cepat setelah
    transaksi online. Program afiliasi yang baik harus menyediakan banyak pilihan produk kepada afiliasi di luar sana.
    Program afiliasi apa pun yang hanya memiliki sedikit variasi produk bahkan tidak boleh dianggap.

  14. AllenTal说道:

    pharmacie en ligne sans ordonnance: kamagra pas cher – pharmacie en ligne france fiable

  15. IgnacioGinia说道:

    vente de mГ©dicament en ligne: cialis prix – pharmacie en ligne france livraison internationale

  16. AllenTal说道:

    pharmacie en ligne france livraison internationale: Levitra 20mg prix en pharmacie – Achat mГ©dicament en ligne fiable

  17. Georgesuima说道:

    pharmacies en ligne certifiГ©es: Pharmacies en ligne certifiees – п»їpharmacie en ligne france

  18. Georgesuima说道:

    Viagra 100 mg sans ordonnance: viagra en ligne – Le gГ©nГ©rique de Viagra

  19. AllenTal说道:

    Viagra femme sans ordonnance 24h: Acheter du Viagra sans ordonnance – Viagra sans ordonnance livraison 48h

  20. AllenTal说道:

    Viagra pas cher inde: Viagra generique en pharmacie – Viagra sans ordonnance 24h Amazon

  21. IgnacioGinia说道:

    pharmacie en ligne france livraison internationale: Levitra pharmacie en ligne – pharmacie en ligne fiable

  22. AllenTal说道:

    п»їpharmacie en ligne france: cialis sans ordonnance – Pharmacie sans ordonnance

  23. AllenTal说道:

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

  24. AllenTal说道:

    pharmacie en ligne france livraison belgique: kamagra livraison 24h – trouver un mГ©dicament en pharmacie

  25. Edwardcit说道:

    pharmacie en ligne france livraison belgique: cialis prix – pharmacie en ligne france pas cher

  26. Edwardcit说道:

    Viagra sans ordonnance 24h Amazon: Acheter du Viagra sans ordonnance – Viagra femme ou trouver

  27. AllenTal说道:

    Quand une femme prend du Viagra homme: Viagra generique en pharmacie – Prix du Viagra en pharmacie en France

  28. AllenTal说道:

    pharmacies en ligne certifiГ©es: Cialis sans ordonnance 24h – pharmacie en ligne sans ordonnance

  29. AllenTal说道:

    SildГ©nafil 100mg pharmacie en ligne: viagra en ligne – Acheter viagra en ligne livraison 24h

  30. IgnacioGinia说道:

    pharmacie en ligne france livraison belgique: Levitra acheter – pharmacie en ligne

  31. Edwardcit说道:

    pharmacie en ligne livraison europe: Pharmacies en ligne certifiees – pharmacie en ligne france pas cher

  32. AllenTal说道:

    Pharmacie sans ordonnance: Levitra pharmacie en ligne – п»їpharmacie en ligne france

  33. Edwardcit说道:

    Viagra prix pharmacie paris: Meilleur Viagra sans ordonnance 24h – Viagra 100 mg sans ordonnance

  34. AllenTal说道:

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

  35. AllenTal说道:

    pharmacie en ligne sans ordonnance: cialis generique – pharmacie en ligne

  36. AllenTal说道:

    Pharmacie Internationale en ligne: Pharmacies en ligne certifiees – pharmacie en ligne avec ordonnance

  37. AllenTal说道:

    vente de mГ©dicament en ligne: pharmacie en ligne france livraison belgique – Pharmacie Internationale en ligne

  38. AllenTal说道:

    Viagra pas cher paris: Meilleur Viagra sans ordonnance 24h – Viagra sans ordonnance 24h

  39. AllenTal说道:

    Viagra sans ordonnance livraison 48h: Viagra homme sans prescription – SildГ©nafil 100mg pharmacie en ligne

  40. Edwardcit说道:

    pharmacie en ligne fiable: Levitra pharmacie en ligne – acheter mГ©dicament en ligne sans ordonnance

  41. IgnacioGinia说道:

    Sildenafil teva 100 mg sans ordonnance: viagra en ligne – Viagra pas cher paris

  42. IgnacioGinia说道:

    trouver un mГ©dicament en pharmacie: kamagra pas cher – Pharmacie Internationale en ligne

  43. AllenTal说道:

    pharmacie en ligne france pas cher: levitra generique – acheter mГ©dicament en ligne sans ordonnance

  44. Edwardcit说道:

    Viagra homme prix en pharmacie sans ordonnance: viagra sans ordonnance – Meilleur Viagra sans ordonnance 24h

  45. AllenTal说道:

    Viagra homme sans ordonnance belgique: viagra sans ordonnance – SildГ©nafil 100 mg sans ordonnance

  46. AllenTal说道:

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

  47. AllenTal说道:

    vente de mГ©dicament en ligne: Acheter Cialis – pharmacie en ligne france fiable

  48. AllenTal说道:

    Achat mГ©dicament en ligne fiable: pharmacie en ligne sans ordonnance – trouver un mГ©dicament en pharmacie

  49. IgnacioGinia说道:

    acheter mГ©dicament en ligne sans ordonnance: pharmacies en ligne certifiГ©es – pharmacie en ligne avec ordonnance

  50. IgnacioGinia说道:

    Viagra Pfizer sans ordonnance: Viagra generique en pharmacie – Viagra pas cher paris

发表回复

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