Положите рядом (в смысле - сделайте свойствами одного объекта) шаблон и данные, которые в него будут засовываться. Т.е., вместо нескольких массивов должен быть один, типа так:
data: () => ({
blocks: [
{
template: '<div><ul><li v-for="n in data" v-html="n"></li></ul></div>',
data: [
'<h2>Заголовок 1</h2><p>какой-то текст 1</p>',
'<h2>Заголовок 2</h2><p>какой-то текст 2</p>',
],
},
{
template: '<div><h3 v-for="color in data" :style="{ color }">{{ color }}</h3></div>',
data: [ 'red', 'green', 'blue' ],
},
{
template: '<div><p v-for="i in data">{{ i }}</p></div>',
data: 4,
},
],
}),
Сделайте компонент, параметрами которого будут шаблон и данные. Шаблон компилируется, результат компиляции применяется в render-функции:
Vue.component('block-component', {
props: [ 'template', 'data' ],
computed: {
compiled() {
return Vue.compile(this.template);
},
},
render() {
return this.compiled.render.call(this);
},
});
Создавайте экземпляры этого компонента:
<block-component v-for="n in blocks" v-bind="n"></block-component>
https://jsfiddle.net/qnwa4kgv/