luc*_*cas 1 vue.js vue-component
我的情况一定很奇怪,但我对此有好处。这是我的情况:
我有一个基于 json 呈现表单的 Vue 应用程序。例如,JSON:
{
"fields": [{
"name": "firstName",
"title": "Name"
}, {
"name": "lastName",
"title": "Last Name"
}, {
"title": "Hello {{ firstName }}!"
}]
}
Run Code Online (Sandbox Code Playgroud)
从那个 json,最终的渲染必须是:
<input type="text" name="firstName" v-model="firstName" />
<input type="text" name="lastName" v-model="lastName" />
<p>Hello {{ firstName }}</p>
Run Code Online (Sandbox Code Playgroud)
我能够呈现所有这些,除了<p>呈现为原始{{ firstName }}而不是数据绑定/反应性的。
我的问题是:如何将动态模板(可以来自 Rest API)插入到组件中,并使它们具有 mustache 表达式的全部功能。
该组件将具有类似
{...firstName field...}
<dynamic template will be added here and update whenever firstName changes>
Run Code Online (Sandbox Code Playgroud)
如果我对这个问题不太清楚,请告诉我谢谢!!!
这是你想做的事情吗?我创建了一个动态组件,其模板是从可编辑的 JSON 字符串生成的。
new Vue({
el: '#app',
data: {
componentData: {
firstName: 'Jason',
lastName: 'Bourne',
},
jsonString: `
{
"fields": [{
"name": "firstName",
"title": "Name"
}, {
"name": "lastName",
"title": "Last Name"
}, {
"title": "Hello {{ firstName }}!"
}]
}`
},
computed: {
template() {
const json = JSON.parse(this.jsonString);
return json.fields.map((s) => {
if ('name' in s) {
return `<input type="text" name="${s.name}" v-model="${s.name}">`;
}
return s.title;
}).join('\n');
},
componentSpec() {
return {
template: `<div>${this.template}</div>`,
data: () => this.componentData
};
}
}
});Run Code Online (Sandbox Code Playgroud)
<script src="https://unpkg.com/vue@latest/dist/vue.js"></script>
<div id="app">
<textarea rows="16" cols="40" v-model.lazy="jsonString">
</textarea>
<component :is="componentSpec"></component>
</div>Run Code Online (Sandbox Code Playgroud)