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

/ 112评论 / 2974阅读 / 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. יומיקו נערת ליווי סינית באילתיומיקו נערת הליווי סינית היחידה בישראל, אסיה הגיעה לאילת?
    אריקה הרוסיה נערת VIP בכל אזור המרכז.
    במוסד, ממש כל אזור רווי קסם ומסתורין.
    כל מי שיבחר מעסה לפי טעמו באתר שלנו, ימצא בחורה מכושפת ואווירה של פרטיות ישראלית.
    אם החלטתם למצוא לכם בחורה ללילה או אפילו רק
    לשעה אחת כדי לקבל תענוג חושני, כדאי לכם לעיין באתר שירותי ליווי של אנג’לינה.
    שירותי ליווי בירושלים מדהימים, והנקודה הכי חשוב
    שמדאיגה המון לקוחות לפני ביצוע ההזמנה – תמונות אמתיות נערות ליווי.
    עיסויים בירושלים יכולים להינתן לגברים ולנשים, גם לכאלו הדבקים באורח החיים המסורתי.
    עיסוי מפנק יכול להינתן לכם מגבר או מאישה.
    עיסוי מפנק אינו נחלתם של אנשים חילוניים בלבד.
    מחפש עיסוי איכותי? פינוק אמיתי אצלנו תקבל את הטיפול הטוב ביותר!
    צרו קשר עוד היום עם המטפלים שבאתר
    והזמינו עיסוי מקצועי איכותי! עיסוי איכותי יכול לרפא כל חלקיק בגוף, להרגעת מערכת העצבים.
    מנגד, עיסוי בירושלים המתבצע בבית
    הפרטי שלכם מגלם בתוכו שלל יתרונות.

    מנגד, כל עוד תקבלו עיסוי בירושלים בלבד לאורך כ-45 דקות ועד שעה,
    המחיר שתצטרכו לשלם יהיה נוח הרבה
    יותר ויהפוך את חווית העיסוי לנגישה גם לכם!

    Feel free to surf to my web-site דירה דסקרטית בבאר שבע

  2. totosite说道:

    Your article has answered the question I was wondering about! I would like to write a thesis on this subject, but I would like you to give your opinion once 😀 totosite

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

    באתר שמחים להעמיד לרשותכם מגוון רחב של דירות
    דיסקרטיות מאובזרות אליהן ניתן
    להזמין עיסוי אירוטי בירושלים.

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

    Here is my page :: https://tkescorts.com/

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

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

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

    Look into my website … https://sexfinder.co.il/

  5. bitcoincasino说道:

    I’m writing on this topic these days, bitcoincasino, but I have stopped writing because there is no reference material. Then I accidentally found your article. I can refer to a variety of materials, so I think the work I was preparing will work! Thank you for your efforts.

  6. Authelm说道:

    Everyone is excited cialis prescription 26 Others have found a similar association with imatinib in patients with chronic myeloid leukemia

  7. son说道:

    И вот тут важно, как и в любой критической ситуации, сохранять спокойствие и собственными силами произвести спасательную операцию. Специально для этого мы собрали большое количество лайфхаков (от простейших до профессиональных), которые помогут реанимировать высохшую подводку и вернуть ее в строй за считанные минуты. Я не мастер в рисовании стрелок, поэтому особо не экспериментирую. Этим Карандашом я крашу внутреннее верхнее веко по линии ресниц. Так мне кажется взгляд более выразительным, а ресницы гуще. Карандаш хороший, на нижнем веке не отпечатывается, держится хорошо, не мягкий, но наносится хорошо, ничего не царапает. Но цена конечно дороговата для карандаша. Наведите камеру, чтобы скачать приложение Не понравился данный карандаш, возможно потому, что обычно пользуюсь гелевыми подводками. В данном случае с этим карандашом, он делал не чёткую линию, для узких стрелок он вообще абсолютно не подходит, создаёт эФфект “размазанных ” глаз. Не купила бы полную версию.
    http://www.kyungheehp.co.kr/bbs/board.php?bo_table=free&wr_id=86272
    Такое косметическое средство очень популярно среди молодых девушек. Компания Faberlic выпустила активатор роста внешне похожий на тушь для ресниц. Он работает точно так же, как и средства, описанные выше, но более дешевый (в сравнении с другими средствами из статьи). Загрузка файла Глазные капли для роста ресниц отзывы получают практически ежедневно. Это связано с их высокой эффективностью и значительным числом преимуществ, в сравнении с другими способами ускорения роста ресниц. Касторовое масло — натуральное растительное средство. Это бюджетное лекарство для бровей, поврежденных косметическими процедурами, и спасение от выпадения волосков. Касторка — народное средство, которым пользовались красавицы несколько столетий назад. Если вы возьмете за правило пользоваться пилингом для кожи головы раз в неделю, первые результаты увидите уже через месяц: рост волос ускорится.

  8. opifs说道:

    BBQPapers is the best term paper writing service you can find and another highly expert company famous for its proficient writers. Only Master’s and Ph.D. specialists can apply for the team. Perfect writing skills, as well as knowledge of academic standards, is a must. Students choose this service because they know that there will be no problem with accurate citations, flawless formatting, and absolute satisfaction with academic requirements. Many companies that provide research paper writing help offer high-quality services. But the rates for research papers can vary greatly between each other, so it’s hard to say whether it’s worth using a particular platform for writing a research paper. To solve this question, you need to look through the ready-made writing assignments and compare whether they match the stated cost in terms of quality. High rates are not guaranteeing you will have the best research paper. Some companies have set rates that are too excessive.
    https://affinity-space.com/community/account/9838dclxviii527/
    Discuss how their academic and/or professional background has prepared them to do well in the MA program A compelling personal statement, however, can help bring your application to the top of the admissions pile. Below, we’ve outlined what you need to know about crafting a personal statement to make your application shine. Let us have a look at the meanings of a statement of purpose vs personal statement, their differences and similarities, ending with an overview of which is the best choice for you. Stay tuned.  Typical file types for a Statement of Purpose are .doc or .docx. There is a downside to Word files being editable, and there are sometimes conflicts among the different Word versions (2010 vs 2016. vs Office365). One benefit of Word files is that anyone can view them.

发表回复

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