Если вы полностью контролируете содержимое компонента, тогда вы , вероятно, сохраните, предполагая, что vm.$el
не изменится.Если вы делаете (например) миксин или директиву, то вы не можете - вполне возможно создать компонент, элемент верхнего уровня которого можно изменить, используя директиву is .
Например, это определяет компонент, который может изменить его тип элемента верхнего уровня:
Vue.component('comp',{
props:{type:String},
template:`
<component :is="type">
I am a {{type}}
</component>
`
})
Это скрипка, которая демонстрирует это: https://jsfiddle.net/tazfLqbh/1/
В качестве хорошей практики я бы предложил предположитьчто это может измениться, поскольку поведение, по-видимому, не определено формально в документации, поэтому поведение может измениться в будущих версиях.
Анализ скрипки
Остается вопрос, является ли динамический компонент вСкрипка запускает создание нового компонента Vue при переключении его типа.В консоли разработчика:
// "Inspect" the span
> a = $0.__vue__
VueComponent {_uid: 1, _isVue: true, $options: {…}, _renderProxy: Proxy, _self: VueComponent, …}
// Toggle the type to div and "inspect" the div
> b = $0.__vue__
VueComponent {_uid: 1, _isVue: true, $options: {…}, _renderProxy: Proxy, _self: VueComponent, …}
> a === b
true
Таким образом, новый экземпляр компонента Vue не создается при переключении типа корневого элемента.
Как и ожидалось, эта скрипка показывает , чтодинамический тип компонента однако запускает создание нового экземпляра компонента Vue.Таким образом, в этом случае кажется, что крюка mounted
достаточно.Примерно так:
<div id="app">
<button @click="toggle">
Toggle div or span element
</button>
<component :is="span?'comp-span':'comp-div'"></component>
</div>
Vue.component('comp-span',{
template:`
<span>
I am a span
</span>
`
})
Vue.component('comp-div',{
template:`
<div>
I am a div
</div>
`
})