Я могу попытаться объяснить, что происходит, хотя мне несколько непонятно, почему вы делаете то, что делаете.
Давайте начнем здесь:
var ocharcomp = new ccharcomp({
propsData: {
char: ch
}
});
vm.charcomponents.push(ocharcomp);
Этосоздание новых экземпляров компонента ccharcomp
, который фактически равен CharComponent
. Каждый из них затем добавляется в массив.
Ни один из этих экземпляров Vue не монтируется. Они никогда не оказываются. Они просто созданы и помещены в массив. У них не будет $el
, а хук mounted
никогда не будет вызываться.
Тогда в вашем шаблоне у вас есть это:
<charcomponent
v-for = "c in charcomponents"
v-bind:char="c.char"
></charcomponent>
Это зацикливается на том же массиве исоздает новый экземпляр CharComponent
для каждой записи. Значение char
копируется из каждого компонента в массиве в соответствующий компонент, созданный в шаблоне.
Компоненты, созданные в шаблоне, будут отрисованы, смонтированы и будут иметь $el
. Это то, что вы видите в своей логи с хука mounted
.
Тогда у нас есть это:
showchars() {
for (var c of this.charcomponents) {
c.showinfo("it's different later");
}
}
Это зацикливание на исходном массиве компонентов, которыеникогда не были установленыУ них нет $el
, они никогда не имеют. Компоненты, созданные с помощью шаблона, все еще существуют и имеют $el
, но их нет в массиве.
Я не могу сделать конкретное предложение о том, как решить вашу проблему, поскольку я не совсем понимаюпочему вы создаете дочерние компоненты таким странным способом. Более нормальный шаблон будет выглядеть так:
- Иметь массив
['a','b','c']
в data
для соответствующего родительского компонента. - Зацикливаться на этом массиве в шаблоне для создания дочерних элементов.
- Используйте
ref
в шаблоне и $refs
в родительском для доступа к дочерним компонентам, затем используйте $el
, чтобы получить элемент для каждого дочернего элемента.
ОднакоЕсли вы просто хотите применить стилизацию, то захватывать элемент, как это обычно не рекомендуется. Вместо этого вы должны использовать привязки :class
или :style
в шаблоне, чтобы позволить Vue применить стиль для вас. Возможно, вам потребуется ввести дополнительные data
свойства для хранения базового состояния, чтобы шаблон мог определить, какие стили применять, где.