Как применить динамически созданный шаблон для экземпляра Vue.js? - PullRequest
0 голосов
/ 25 апреля 2018

Я могу использовать статический шаблон с экземпляром Vue.js, как показано ниже. Содержимое firstPlaceholder заменяется содержимым шаблона staticTemplate, а свойство text отображается правильно. (Может потребоваться, чтобы Chrome работал правильно.)

Однако, если я создаю шаблон динамически, рендеринг не работает. secondPlaceholder отсутствует. Может быть, это проблема времени?

=> Как мне адаптировать мой код для рендеринга secondPlaceholder с использованием dynamicTemplate?

<!doctype html>
<html>

<head>
	   <script src="https://cdn.jsdelivr.net/npm/vue"></script>
</head>

<body>
  
    <template id = "staticTemplate">
      <div>{{text}}</div>
    </template> 
  
    <div id ="firstPlaceholder"></div>
  
    <div id ="secondPlaceholder"></div>      
	
	<script>
    
    	var dynamicTemplate = document.createElement('template');
      dynamicTemplate.id = 'dynamicTemplate';
      var div = document.createElement('div');
      div.innerText = '{{text}}';
      dynamicTemplate.appendChild(div);
      
      var staticTemplate = document.getElementById('staticTemplate');
      document.body.insertBefore(dynamicTemplate, staticTemplate);
    
      new Vue({
        el: '#firstPlaceholder',
        template: '#staticTemplate',
        data: {
          text: 'My first text'
        }
      }); 
      
      new Vue({
        el: '#secondPlaceholder',
        template: '#dynamicTemplate',
        data: {
          text: 'My second text'
        }
      });       
     
	</script>
</body>
</html>

Похожие вопросы:

Как настроить целевой элемент (собственный веб-компонент) в vue.js?

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

Check Dom template ,

Элемент HTML Content Template () представляет собой механизм для хранения контента на стороне клиента, который не должен отображаться при загрузке страницы, новпоследствии может быть создан во время выполнения с использованием JavaScript.

<template> содержит один атрибут содержимого, обычно мы будем читать содержимое шаблона по этому атрибуту.так что вы можете добавить свой HTML в контент.

Если напрямую appendChild на <template>, вы можете распечатать html, то не найдете ничего уже добавленного.

Просто исправьте: просто измените dynamicTemplate.appendChild(childDiv) на dynamicTemplate.content.appendChild(childDiv)

, поскольку некоторые браузеры могут не поддерживать <template>, вам, возможно, придется вместо этого использовать <div>, а затем скрыть его.

PS: Я обнаружил, что некоторые документы говорят, что атрибут =содержимое <template> доступно только для чтения HTMLTemplateElement , вероятно, лучше использовать div вместо template.

Также также можно попробовать vue render () , это будет лучше для вашего случая.

function isSupportTemplate() {
  return 'content' in document.createElement('template')
}

function createVueInstance(supported) {
  if(supported) {//check browser whether support template
    var dynamicTemplate = document.createElement('template');
    dynamicTemplate.id = 'dynamicTemplate';
    var childDiv = document.createElement('div');
    childDiv.innerText = 'support <template>: {{text}}-{{text}}';
    dynamicTemplate.content.appendChild(childDiv); //apend your html to template content
    document.body.appendChild(dynamicTemplate)

    var staticTemplate = document.getElementById('staticTemplate');
    document.body.insertBefore(dynamicTemplate, staticTemplate);
  }
  else {
    var dynamicTemplate = document.createElement('div');
    dynamicTemplate.id = 'dynamicTemplate';
    dynamicTemplate.style.display = 'none'
    var childDiv = document.createElement('div');
    childDiv.innerText = 'not support <template>: {{text}}-{{text}}';
    dynamicTemplate.appendChild(childDiv); //append your html to template content
    document.body.appendChild(dynamicTemplate)

    var staticTemplate = document.getElementById('staticTemplate');
    document.body.insertBefore(dynamicTemplate, staticTemplate);
  }

  new Vue({
    el: '#firstPlaceholder',
    template: '#staticTemplate',
    data: {
      text: 'My first text'
    }
  }); 

  new Vue({
    el: '#secondPlaceholder',
    template: '#dynamicTemplate',
    data: {
      text: 'My second text'
    }
  });
}
<!doctype html>
<html>

<head>
	   <script src="https://cdn.jsdelivr.net/npm/vue"></script>
</head>

<body>
  <button onclick="createVueInstance(isSupportTemplate())">Support Template</button>
  <button onclick="createVueInstance(!isSupportTemplate())">Not Support Template</button>
    <template id = "staticTemplate">
      <div>{{text}}</div>
    </template> 
  
    <div id ="firstPlaceholder"></div>
  
    <div id ="secondPlaceholder"></div>      
	
</body>
</html>
0 голосов
/ 25 апреля 2018

Он не может использоваться напрямую в вашем примере, как есть, но, возможно, вы могли бы получить желаемый результат, используя Async Components .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...