VueJs操纵内联模板并重新初始化它

jan*_*mon 13 html javascript vue.js

这个问题类似于VueJS在内联模板组件中重新编译HTML,以及如何使Vue js指令在附加的html元素中工作

不幸的是,该问题的解决方案不再用于当前的VueJS实现,因为$compile已删除.

我的用例如下:

我必须使用第三方代码来操纵页面并在之后触发事件.在该事件被解雇之后,我想让VueJS知道它应该重新初始化当前的DOM.

(用纯JavaScript编写的第三方允许用户向页面添加新的小部件)

https://jsfiddle.net/5y8c0u2k/

HTML

<div id="app">
    <my-input inline-template>
  <div class="wrapper">
  My inline template<br>
  <input v-model="value">
  <my-element inline-template :value="value">
    <button v-text="value" @click="click"></button>
  </my-element>
  </div>
    </my-input>
</div>
Run Code Online (Sandbox Code Playgroud)

Javascript - VueJS 2.2

Vue.component('my-input', {
    data() {
        return {
            value: 1000
        };
    }
});

Vue.component('my-element', {
    props: {
        value: String
    },
    methods: {
        click() {
            console.log('Clicked the button');
        }
    }
});

new Vue({
    el: '#app',
});

// Pseudo code
setInterval(() => {
  // Third party library adds html:
  var newContent = document.createElement('div');
  newContent.innerHTML = `<my-element inline-template :value="value">
     <button v-text="value" @click="click"></button>
  </my-element>`;   document.querySelector('.wrapper').appendChild(newContent)

   //      
   // How would I now reinialize the app or
   // the wrapping component to use the click handler and value?
   //

}, 5000)
Run Code Online (Sandbox Code Playgroud)

jan*_*mon 3

经过进一步调查,我联系了 VueJs 团队并得到反馈以下方法可能是一个有效的解决方案:

/**
 * Content change handler
 */
function handleContentChange() {
  const inlineTemplates = document.querySelector('[inline-template]');
  for (var inlineTemplate of inlineTemplates) {
    processNewElement(inlineTemplate);
  }
}


/**
 * Tell vue to initialize a new element
 */
function processNewElement(element) {
  const vue = getClosestVueInstance(element);
  new Vue({
    el: element,
    data: vue.$data
  });
}

/**
 * Returns the __vue__ instance of the next element up the dom tree
 */
function getClosestVueInstance(element) {
  if (element) {
    return element.__vue__ || getClosestVueInstance(element.parentElement);
  }
}
Run Code Online (Sandbox Code Playgroud)

你可以在下面的小提琴中尝试一下