115 votes

Utilisation de $ refs dans une propriété calculée

Comment accéder à $refs calculé à l'intérieur? Il est toujours indéfini la première fois que la propriété calculée est exécutée.

168voto

Eric Guan Points 7114

En répondant à ma propre question ici, je n’ai trouvé de réponse satisfaisante nulle part ailleurs. Parfois, il suffit d’avoir accès à un élément dom pour effectuer des calculs. Espérons que cela soit utile aux autres.

J'ai dû tromper Vue pour mettre à jour la propriété calculée une fois le composant monté.

 Vue.component('my-component', {
    data(){
        return {
            isMounted: false
        }
    },
    computed:{
        property(){
            if(!this.isMounted)
                return;
            // this.$refs is available
        }
    },
    mounted(){
        this.isMounted = true;
    }
})
 

27voto

Geoffroy Points 5173

Je pense qu'il est important de citer la Vue js guide:

$refs ne sont remplis après que le composant a été rendue, et ils ne sont pas réactifs. Il n'est là que comme une trappe d'évacuation directe de l'enfant de manipulation - vous devriez éviter d'accéder $refs de l'intérieur des modèles ou des propriétés calculées.

Il n'est donc pas quelque chose que vous êtes censé faire, mais vous pouvez toujours pirater votre chemin autour de lui.

18voto

Facyo Kouch Points 430

Si vous avez besoin des $refs après un v-if vous pouvez utiliser le crochet updated() .

 <div v-if="myProp"></div>


updated() {
    if (!this.myProp) return;
    /// this.$refs is available
},
 

4voto

Rodrigo Rodrigues Points 306

Pour les autres utilisateurs comme moi qui n'ont besoin que de transmettre certaines données à un accessoire, j'ai utilisé data au lieu de computed

 Vue.component('my-component', {
    data(){
        return {
            myProp: null
        }
    },    
    mounted(){
        this.myProp= 'hello'    
        //$refs is available              
        // this.myProp is reactive, bind will work to property
    }
})
 

1voto

Overdozed Points 11

Utilisez la liaison de propriété si vous le souhaitez. : prop désactivé est réactif dans ce cas

 <button :disabled="$refs.email ? $refs.email.$v.$invalid : true">Login</button>
 

Mais pour vérifier deux champs, je n'ai trouvé aucun autre moyen comme méthode factice:

 <button
    :disabled="$refs.password ? checkIsValid($refs.email.$v.$invalid, $refs.password.$v.$invalid) : true">
            {{data.submitButton.value}}
</button>

methods: {
   checkIsValid(email, password) {
      return email || password;
   }
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X