在 Vue.js 中添加动态数据绑定文本

Posted

技术标签:

【中文标题】在 Vue.js 中添加动态数据绑定文本【英文标题】:Add dynamically data-bound text in Vue.js 【发布时间】:2019-04-30 12:37:22 【问题描述】:

我的情况一定很奇怪,但我对此有好处。 这是我的情况:

我有一个基于 json 呈现表单的 Vue 应用程序。 例如,JSON:


  "fields": [
      "name": "firstName",
      "title": "Name"
  , 
      "name": "lastName",
      "title": "Last Name"
  , 
      "title": "Hello  firstName !"
  ]

从那个 json 中,最终的渲染必须是:

<input type="text" name="firstName" v-model="firstName" />
<input type="text" name="lastName" v-model="lastName" />
<p>Hello  firstName </p>

我可以渲染所有这些,除了&lt;p&gt;,它被渲染为原始 firstName ,而不是数据绑定/反应。

我的问题是: 如何将动态模板(可以来自 Rest API)插入到组件中,并让它们拥有 mustache 表达式的全部功能。

组件会有类似的东西

...firstName field...
<dynamic template will be added here and update whenever firstName changes>

如果我对这个问题不太清楚,请告诉我 谢谢!!!

【问题讨论】:

你可以让你的 json 成为一个计算属性并拥有"title": "Hello " + this.firstName 是的,我能够做到,但这对我来说似乎并不优雅。我最终不得不通过 REST API 在 JSON 中使用发送 JS 字符串连接表达式,所以它最终得到了类似的东西 "title": "'Hello ' + this.firstName 并在计算属性中调用 eval()。但同样,不优雅......我会等待更好的方法,因为我找不到一个 嗯,是的,调用eval 是一种代码味道。不过,如果没有看到您的完整代码,很难给出建议。 &lt;p&gt;Hello &lt;span v-text="firstName"&gt;&lt;/span&gt;&lt;/p&gt;? 不能使用它,因为整个新元素 &lt;p&gt;Hello &lt;span v-text="firstName"&gt;&lt;/span&gt;&lt;/p&gt; 是要在元素中设置的字符串。在从 API 检索到响应之前,此元素不存在,并且一直在变化。一个字符串可能正在读取 firstName,但另一个可能正在读取其他任何内容 【参考方案1】:

这是你想要做的事情吗?我创建了一个动态组件,其模板是从可编辑的 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
      ;
    
  
);
<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>

【讨论】:

以上是关于在 Vue.js 中添加动态数据绑定文本的主要内容,如果未能解决你的问题,请参考以下文章

Vue.js 动态绑定class

vue.js - v-for 中动态生成的组件没有正确更新绑定属性

vue.js存储--localStorage

Vue.js实现双向绑定的原理

windows存储动态数据绑定列表等类型

在 Laravel 5.1 和 Vue JS 中保存多个数据动态表单