J'essaie d'accéder à un enfant spécifique par son nom. En ce moment, à cause de l'endroit où se trouve l'enfant, j'appelle l'enfant par ceci:
this.$root.$children[0]
Ce qui n’est pas grave tant que cet enfant est toujours [0]
, mais ce serait bien de pouvoir faire quelque chose comme:
this.$root.$children['detail']
Je continue de penser que $refs
est peut-être la solution à mon problème, mais je ne peux jamais trouver un moyen de m'aider.
Des idées?
Est-ce que cet enfant dont vous parlez est vraiment un enfant du composant auquel vous voulez y accéder? Dans ce cas, v-ref
est bien la réponse:
// in the code of the parent component, access the referenced child component like this:
this.$refs.detailsChild
<!-- Template of the parent component, assuming your child Component is called Details -->
<details v-ref:details-child></details>
documentation API pertinente: http://vuejs.org/api/#v-ref
Vous pouvez utiliser cette propriété:
this.$root.$children[0].$options.name
Par exemple:
this.$root.$children.find(child => { return child.$options.name === "name"; });
Tout est à peu près pareil, mais dans Vue 2, vous devez utiliser: <details ref="details-child"></details>
au lieu de v-ref.
Il vous suffit ensuite d'utiliser this.$refs.details-child;
pour pouvoir accéder à ses propriétés.
this.$root.$children[0].constructor.name
Vous n'avez pas nécessairement besoin de $refs
; en fait, ils ne sont parfois pas réalisables si vous avez des composants profondément imbriqués. J'ai trouvé ce Q & A plusieurs fois lors de mes recherches, mais j'ai finalement décidé de mettre en œuvre ma propre solution, car je rencontre assez souvent cette situation. Ne rechignez pas à la vieille école pour les boucles, elles sont nécessaires pour plusieurs raisons. Pour l'une d'entre elles, je teste pour x<descendants.length
(plutôt que de définir quelque chose comme len=descendants.length
dès le départ et d'effectuer des tests contre celle-ci) à chaque itération. m en poussant sur la pile dans la seconde pour la boucle.
Tout d'abord, l'utilisation:
let unPersonalizable = matchingDescendants(this, /a.checkimprintfiinformation$/, {first: true});
La mise en oeuvre:
function matchingDescendants(vm, matcher, options) {
let descendants = vm.$children;
let descendant;
let returnFirst = (options || {}).first;
let matches = [];
for (let x=0; x<descendants.length; x++) {
descendant = descendants[x];
if (matcher.test(descendant.$vnode.tag)) {
if (returnFirst) {
return descendant;
}
else {
matches.Push(descendant);
}
}
for (let y=0, len = descendant.$children.length; y<len; y++) {
descendants.Push(descendant.$children[y]);
}
}
return matches.length === 0 ? false : matches;
}