с vue.js , как правильно обращаться с неуправляемыми элементами dom vue

#vue.js

#vue.js

Вопрос:

Мне нужен совет по работе с компонентами vue через узлы DOM, которые не находятся под контролем vue, например, по монтированию компонента vue на элемент, созданный с помощью v-html.

например.

 <vue-main-component>
    <vue-component-A>
        <unmanaged-dom-nodes...> // issued by v-html
            <...>
                <vue-component-B>
  

Очевидно, что vue не может создавать vue-component-B автоматически.
Однако, vue-component-A способен создавать и монтировать vue-component-B после unmanaged-dom-nodes рендеринга.

В настоящее время я использую довольно простой метод: при vue-component-A монтировании я обнаруживаю элементы, которые должны стать компонентами vue в атрибутах unmanaged-dom-nodes через data-xxx , используя querySelectorAll('[data-xxx]')

     // parentVm is the vm of vue-component-A
    // componentClass is vue-component-B
    const vm = new (Vue.extend(componentClass))({
        parent: parentVm,
    })

    parentVm.$once('hook:destroyed', () => void vm.$destroy());
    domNode.appendChild(vm.$mount().$el);
  

В настоящее время это работает так, как ожидалось, однако мне интересно, возможно ли сделать это более надежным.

Варианты использования:

  • сторонняя панель мониторинга, которая не основана на vue.js и которые разрешают содержимое html
  • редактор расширенного текста, который может принимать компоненты vue в качестве содержимого

Комментарии:

1. Как вы определяете неуправляемый узел DOM? <div> в шаблоне компонента или элемент, созданный динамически с помощью библиотеки JS / непосредственно путем манипулирования DOM с помощью JS?

2. Действительно, что вообще означает «неуправляемый узел DOM»? Ваш шаблон (или функция рендеринга) для <vue-component-A> может просто включать любые допустимые элементы HTML или компоненты Vue, в любой подходящей иерархии. Похоже, вы делаете что-то суперсложное, что на самом деле очень просто.

3. На самом деле, у меня нет контроля над этими неуправляемыми dom-узлами. (Я добавил несколько вариантов использования в вопросе).