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

/ 3评论 / 210阅读 / 1点赞

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. אם מעולם לא שילבתם נערות ליווי בנסיעות העסקים שלכם, כדאי שתנסו.
    נערות ליווי ברמת גן עושות סקס מכל הלב ואתם מרגישים את זה.
    הנערות ליווי ברמת גן ידועה כיפה ומטופחת במיוחד.
    הנערות של אילת ילמדו אתכם כמה דברים
    חדשים. הנערות יודעות איך לגרום לגבר
    להרגיש נחשק ומיוחד כראוי למי שמגיע לחופשה באילת.
    נערות ליווי באילת יודעות איך לפנק גבר.
    איך לבחור נערות ליווי באילת?
    איפה מוצאים נערות ליווי עם תמונות אמיתיות נערות
    ליווי אילת, כשאתם צריכים לממש את
    הבילוי המעצים הזה כל מה שאתם צריכים זה פורטל אחד שיודע ויכול
    לקחת אתכם כמה שיותר רחוק. מענג, מרתק, זה מביא את הדבר האמיתי
    בדיוק לאן שאתם צריכים וזה מפגשים להוטים ושווים עם נשים
    טוטאליות שיודעות ויכולות לתת את המענה המושלם לבילויים של פעם אחת בחיים.
    נערות ליווי אילת, הדבר המושלם ביותר
    מתחיל כאן ועכשיו עם נערות שוות במיוחד שיודעות ויכולות לקחת
    את רף ההנאות שלכם למקומות הנחשקים ביותר.
    הבחורה עם החזה הכי ענק בצפון!
    • נראות הבחורה – לרוב מחפשי השירות תהיה העדפה למאפיינים חיצוניים מסוימים
    והחדשות הטובות הן שבאתרי אינטרנט ייעודיים ניתן למצוא תיאורים לגבי
    המראה החיצוני ולעיתים גם תמונות אמתיות של נערות הליווי.
    כמובן שיש לוודא האם הבחורה רלוונטית לצפון, דרום או מרכז
    הארץ אך נערות ליווי באשקלון בבאר
    שבע הן איכותיות בדיוק כמו נערות ליווי באשקלון בתל-אביב צפון ושאר הארץ.

  2. הדבר המדהים ביותר שיכול לקרות לכל אדם זה הרגע הזה שהוא מוצא את מי שהוא רוצה
    להיות איתה בפרטיות, מבלי שאף
    אחד יידע והכול בזכות דירות דיסקרטיות ראשון לציון.
    בקרו עוד היום בפורטל הבית שלנו ובואו להתרגש ולקבל את הנשים שמחכות לכם 24/7 סביב השעון וכן, התענוג הזה כולל גם שבתות וחגים.

    בקרו בפורטל הבית סקס אדיר תחת
    הקטגוריה הלוהטת של דירות דיסקרטיות באזור המגורים שלכם וצאו אל דרך רצופת הנאות.
    דירות דיסקרטיות מפוזרות בכל מיני אזורים בארץ ותוכלו למצוא דירות דיסקרטיות במרכז ואפילו
    דירות דיסקרטיות בראשון לציון.
    הוא הסכים למחיר שנקבה, ביקש ממנה
    שתשלוט בו אותו לילה והגיע לכתובת
    של אחת מאותן דירות דיסקרטיות
    שאהבה. איך בוחרים דירות דיסקרטיות
    בראשון לציון? כל מה שאתם צריכים זה דירות דיסקרטיות איכותיות שנרתמו לרצונות שלכם ויכולים
    לתת את המענה הנכון. דירות דיסקרטיות
    ראשון לציון אומתו על כל המשתמע מכך ועדיין תמיד תוכלו להתקשר ולעשות תיאום ציפיות בכדי לוודא שאתם
    מקבלים דירה פרטית שנראית
    בדיוק כמו בתמונה. כל המידע בסקס אדיר מאומת על
    כל המשתמע מכך, כן, זה לא מקרי, הפורטל עובד
    קשה בכדי למצוא ולהביא לכם מודעות מאומתות בכל התחומים.
    מהיום אין צורך לצאת מגדרכם בכדי לבלות שעות פרטיות עם מי שרק מתחשק לכם.

  3. A motivating discussion is definitely worth comment. Theres no doubt that that you should write more on this issue, it may not be a taboo subject but usually folks dont talk about these subjects. To the next! Kind regards!!

发表回复

您的电子邮箱地址不会被公开。