2.6.10
https://codesandbox.io/s/vue-template-7hwty
$attrs
se o componente filho tiver qualquer prop com chave igual a attr.A função Render é chamada uma vez e $attrs
do componente não é alterado.
Render é chamado duas vezes e attrs
que tem a mesma chave de props
do componente filho é removido.
Eu criei no meu projeto o componente carregador personalizado que precisa lidar com o carregamento de componentes carregados lentamente e erros de rede, porque não posso usar https://vuejs.org/v2/guide/components-dynamic-async.html#Handling -Loading -Estado no meu caso. Este bug pode ser omitido ao não adicionar o componente baixado à reatividade (dados externos como variáveis).
Usar uma cópia de $attrs
: {...this.$attrs}
também remove o problema
Talvez você deva usar adereços para resolver este problema:
render(h) {
console.log("Attributes of loader:", this.$attrs);
if (this.targetComponent) {
return h(this.targetComponent, {
props: this.$attrs // Change attrs to props,not `attrs: this.$attrs`
});
} else {
return h("div", "Component is loading");
}
}
porque você está tentando obter adereços
const targetComponent = {
props: {
// COMMENT PROP
someProp: {
type: String
}
},
render(h) {
console.log("Props of target", this.$props); // You can not get $props when render params only has attrs
return h("div", "WITH PROP:" + this.someProp);
}
};
Tanto a criação de cópia de attrs quanto a passagem de props resolvem meu problema, mas ainda estou curioso por que o componente pai $attrs
está mudando por causa da renderização de child que contém props com a mesma chave?
É porque o objeto $attrs
foi reatribuído. Eu sabia que já vi esse problema em outro lugar:
Duplicado de https://github.com/vuejs/vue/issues/10115