Maison > interface Web > Questions et réponses frontales > Que signifie $refs dans vue ?

Que signifie $refs dans vue ?

青灯夜游
Libérer: 2022-12-14 19:27:12
original
2505 Les gens l'ont consulté

Dans vue, $refs est un objet qui contient tous les éléments DOM et instances de composants enregistrés avec l'attribut ref. ref est utilisé pour enregistrer les informations de référence pour les éléments ou les sous-composants. Les informations de référence seront enregistrées sur l'objet "$refs" du composant parent si elles sont utilisées sur un élément DOM normal, la référence pointe vers l'élément DOM si elle est utilisée. sur un sous-composant, la référence pointe vers l'instance du composant.

Que signifie $refs dans vue ?

L'environnement d'exploitation de ce tutoriel : système windows7, version vue3, ordinateur DELL G3.

$refs dans Vue

$refs est un objet qui contient tous les éléments DOM et instances de composants enregistrés avec l'attribut ref.

Description

ref est utilisée pour enregistrer les informations de référence pour les éléments ou les sous-composants. Les informations de référence seront enregistrées sur l'objet $refs du composant parent

  • Si elles sont utilisées sur un élément DOM normal, le. la référence pointe vers Il s'agit d'un élément DOM ;

  • Si elle est utilisée sur un composant enfant, la référence pointe vers l'instance du composant

De plus, lorsque v-for est utilisé sur un élément ou un composant, les informations de référence ; sera un tableau contenant le nœud DOM ou l'instance de composant. [Recommandations associées : tutoriel vidéo vuejs, développement web front-end]

<!DOCTYPE html>
<html>
<head>
    <title>Vue</title>
</head>
<body>
    <div id="app">
        <div ref="node">Node</div>
        <layout-div ref="layout"></layout-div>
        <div v-for="i in 3" :key="i" ref="nodearr">{{i}}</div>
    </div>
</body>
<script src="https://cdn.bootcss.com/vue/2.4.2/vue.js"></script>
<script type="text/javascript">
    Vue.component("layout-div", {
      data: function(){
          return {
            count: 0
          }
      },
      template: `<div>
                    <div>{{count}}</div>
                </div>`
    })
 
    var vm = new Vue({
        el: &#39;#app&#39;,
        mounted: function(){
            console.log(this.$refs.node); // <div>Node</div> // DOM元素
            console.log(this.$refs.layout); // VueComponent {_uid: 1, ...} // 组件实例
            console.log(this.$refs.nodearr); // (3) [div, div, div] // DOM元素数组
        }
    })
</script>
</html>
Copier après la connexion

Étant donné que la référence elle-même est créée en tant que résultat du rendu, elle n'est pas accessible lors du rendu initial car elle n'existe pas encore, et $refs n'existe pas encore. Il n'est pas réactif, vous ne devez donc pas essayer de l'utiliser pour la liaison de données dans les modèles. Lors de l'initialisation de l'accès à ref, il doit être appelé dans la méthode montée de son cycle de vie. L'opération de rappel doit être passée dans la méthode $nextTick. Pour obtenir des éléments ou des instances, il n'est généralement pas recommandé d'utiliser directement les éléments du DOM. Essayez d'utiliser la liaison de données pour laisser le ViewModel de MVVM exploiter le DOM.

<!DOCTYPE html>
<html>
<head>
    <title>Vue</title>
</head>
<body>
    <div id="app"></div>
</body>
<script src="https://cdn.bootcss.com/vue/2.4.2/vue.js"></script>
<script type="text/javascript">
 
    var vm = new Vue({
        el: &#39;#app&#39;,
        data: function(){
            return {
                msg: 0
            }
        },
        template:  `<div>
                       <div ref="node">{{msg}}</div>
                       <button @click="updateMsg">button</button>
                    </div>`,
        beforeMount: function(){
            console.log(this.$refs.node); // undefined
        },
        mounted: function(){
            console.log(this.$refs.node); // <div>0</div>
        },
        methods: {
            updateMsg: function(){
                this.msg = 1;
                console.log(this.$refs.node.innerHTML); // 0
                this.$nextTick(() => {
                    console.log(this.$refs.node.innerHTML); // 1
                })
            }
        }
    })
</script>
</html>
Copier après la connexion

Utilisation de base de $refs dans VUE

ref a trois utilisations :

 1. ref est ajouté aux éléments ordinaires, obtenus par this.$refs (valeur de référence) C'est un. dom element

  2. Ajoutez une référence au sous-composant, utilisez this.$refs (valeur de référence) pour obtenir l'instance du composant , et vous pourrez utiliser toutes les méthodes du composant . Lorsque vous utilisez la méthode, vous pouvez l'utiliser directement this.$refs.(ref value).method().

  3. Comment utiliser v-for et ref pour obtenir un ensemble de tableaux ou de nœuds dom

Pièges à noter :

1 Si vous souhaitez ajouter différentes références via la traversée v-for, n'oubliez pas. pour ajouter ::号,即 :ref =某变量 ;
这点和其他属性一样,如果是固定值就不需要加 :号,如果是变量记得加 :号。(加冒号的,说明后面的是一个变量或者表达式;没加冒号的后面就是对应的字符串常量(String))

2、通过 :ref =某变量 添加ref(即加了:号) ,如果想获取该ref时需要加 [0],如this.$refs[refsArrayItem] [0];如果不是:ref =某变量的方式而是 ref =某字符串时则不需要加,如this.$refs[refsArrayItem]。 nombre, c'est-à-dire :ref = une variable

;
C'est la même chose que les autres attributs s'il s'agit d'une valeur fixe. , il n'est pas nécessaire d'ajouter le signe

:</ code><img alt="" class="has" src="https://img.php.cn/upload/article/000/000/024/0ccbe7fd762ab3db91a6278d0769ee7f-0.png"/>, s'il s'agit d'une variable, pensez à ajouter le signe </p><code>:

. (Avec un deux-points, cela signifie que ce qui suit est une variable ou une expression ; s'il n'y a pas de deux-points, cela signifie la constante de chaîne correspondante (String)) 2 Ajoutez via :ref = une variable</code. ></span> ref (c'est-à-dire ajouter <span style="color:#f33b45;"><code>: numéro), si vous souhaitez obtenir la référence, vous devez ajouter [0], tel que this.$refs[refsArrayItem ] [0]; Si ce n'est pas le cas :ref = une certaine variable mais

ref = une certaine chaîne

, alors il n'est pas nécessaire d'ajouter, comme this.$refs[refsArrayItem].

1.

ref doit être

une fois le rendu dom terminé. Lorsque vous l'utilisez, assurez-vous que le dom a été rendu. Par exemple, appelez

dans le cycle de vie

Mounted(){} hook, ou

appelez

dans this.$nextTick(()=>{}).

2. Si ref est bouclé et

a plusieurs noms en double, alors la valeur de ref sera un tableau

À ce stade, pour obtenir une seule référence, il vous suffit de boucler.

Exemple 1 :

Ajouter un attribut ref🎜
<div id="app">
    <h1 ref="h1Ele">这是H1</h1>
    <hello ref="ho"></hello>
 
    <button @click="getref">获取H1元素</button>
</div>
Copier après la connexion
🎜Obtenir tous les composants ou éléments enregistrés avec ref🎜
methods: {
        getref() {
          // 表示从 $refs对象 中, 获取 ref 属性值为: h1ele DOM元素或组件
           console.log(this.$refs.h1Ele.innerText);
           this.$refs.h1ele.style.color = &#39;red&#39;;// 修改html样式
 
          console.log(this.$refs.ho.msg);// 获取组件数据
          console.log(this.$refs.ho.test);// 获取组件的方法
        }
      }
Copier après la connexion
🎜🎜Exemple 2 :🎜🎜🎜Code Vue : 🎜
 <!-- 列表部分 -->
                <el-table @sort-change="sortChange" ref="multipleSelection" border :data="valueDryGoodTableData" style="width: 100%">
                    <el-table-column align="left" prop="title" label="标题" min-width="80%" sortable="custom">
                        <template slot-scope="scope">
                            <a target="_blank" :class="scope.row.titleClicked?&#39;titleClicked&#39;:&#39;&#39;" class="hoverHand bluetext" v-html="scope.row.title" @click="titleClick(scope.row.articleUrl,scope.$index)">
                            </a>
                        </template>
                    </el-table-column>
                    <el-table-column align="left" prop="releaseTime" label="发布日期" min-width="11%" sortable="custom"></el-table-column>
                    <el-table-column align="center" label="操作" min-width="9%">
                        <template slot-scope="scope">
                            <span class="operatoryTools">
                                <i title="取消收藏" v-if="scope.row.isFavour" @click="favoriteOperating(scope.row.id, scope.$index)" class="hoverHand iconStyle el-icon-star-on"></i>
                                <i title="收藏" v-else @click="favoriteOperating(scope.row.id, scope.$index)" class="hoverHand iconStyle el-icon-star-off"></i>
                                <i title="分享" @click.stop="showShareOperation(scope.$index)" class="shareTarg iconfont">&#xe678;</i>
                                <div class="share" v-if="scope.row.showShare">
                                    <img class="hoverHand shareItem" title="分享到微博" @click="shareItem(&#39;sina&#39;,$event);" src="@/images/WEIBO.png">
                                    <img class="hoverHand shareItem" title="分享到微信" @click.stop="shareItem(&#39;wx&#39;,$event);" src="@/images/WEIXIN.png">
                                    <img class="hoverHand shareItem" title="分享到QQ" @click="shareItem(&#39;qq&#39;,$event);" src="@/images/QQ.png">
                                </div>
                                <div v-show="scope.row.erweimaShare" class="erweima_share"></div>
                                <div v-show="scope.row.erweimaShare1" class="erweima_share1"></div>
                            </span>
                        </template>
                    </el-table-column>
                </el-table>
Copier après la connexion
🎜Code JS : 🎜
//点击清空条件,调用该方法
emptyAndSearch(){//清空条件方法
			//清空树选中状态
			this.clearTreeNodeCheck([&#39;tree&#39;]);
			//清除排序
			this.$refs.multipleSelection.clearSort();
			//设置分页参数
			this.queryParam = {
				startRow : 1,
                pageSize : 20,
                condition:{
                }
			}
			//分页查询调用
			this.confirmSearch(&#39;statistics&#39;);
			//设置清空条件为false
			this.$store.commit(&#39;valueDryGoodDatas/SET_CLEAR_ALL&#39;,false);
		}
Copier après la connexion
🎜🎜Exemple 3 : 🎜 🎜🎜Code Vue : 🎜
 <el-form-item
                          ref="goodPicInfoFormpicUrl"
                          :label="$t(&#39;许可证证照&#39;)"
                          class="is-required"
                          prop="picUrl">
                          <el-upload
                            :show-file-list="false"
                            :http-request="uploadImg"
                            :data="certImgform"
                            action=""
                            class="avatar-uploader">
                            <img
                              v-if="queryFrom.picUrl"
                              :src="queryFrom.picUrl"
                              class="avatar">
                            <i
                              v-else
                              class="el-icon-plus avatar-uploader-icon"/>
                          </el-upload>
                          <el-button
                            type="primary"
                            plain
                            size="mini"
                            @click="viewPcPic(queryFrom.picUrl)">{{ $t(&#39;查看&#39;) }}</el-button>
                        </el-form-item>
Copier après la connexion
🎜Code JS : 🎜
      //获取元素清除验证
              this.$refs.goodPicInfoFormpicUrl.clearValidate()
Copier après la connexion
🎜 De manière générale, si vous souhaitez obtenir la boîte INPUT, récupérez d'abord l'élément DOM, vous avez besoin de document.querySelector ("".input1") pour obtenir le nœud dom, et puis obtenez la valeur input1. 🎜

Mais après la liaison avec ref, nous n'avons plus besoin d'obtenir le nœud dom. Nous pouvons directement lier input1 à l'entrée ci-dessus, puis l'appeler dans $refs.

Ensuite, appelez-le comme ceci en javascript : this.$refs.input1 Cela peut réduire la consommation d'obtention de nœuds dom

(Partage de vidéos d'apprentissage : Tutoriel d'introduction à vuejs, Vidéo de programmation de base)

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal