vue.js 渲染包含 vue.js 语法的 ajax 数据

Posted

技术标签:

【中文标题】vue.js 渲染包含 vue.js 语法的 ajax 数据【英文标题】:vue.js render ajax data that contains vue.js syntax 【发布时间】:2018-02-01 14:46:03 【问题描述】:

Vue.js 版本为:2.x

嗨。我正在将 vue js 中的 ajax 请求发送到另一个页面,并获取它的源代码,其中包含 vue.js 语法(例如事件)。当此源添加到属性和属性添加到模板时,ajax 数据源(包含 vue.js 语法)无法呈现,无法正常工作。 例如模板是:

<div id="app">
     foo 
</div>

而 app.js 是:

var app = new Vue(
    el: '#app',
    data: 
        foo: 'bar'
    ,
    mounted()
        this.$http.get('/media').then(function(response)
            data = response.body;
            Vue.set(app, 'foo', data);
        );
    ,
    methods: 
        alertVideoLink: function(event)
            alert(event.target.href);
        
    
);

在上面的app.js代码中,ajax请求返回这个代码(即response.body):

<a href="/media/videos" @click.pevent.self="alertVideoLink(event)">Video Link</a>

但是这个链接不能被渲染并且不能正常工作!我正在测试渲染方法和一些有用的提示,但没有找到。请帮忙...谢谢

【问题讨论】:

对我来说听起来像是一个 XY 问题:这就是为什么你必须从你的 API 端点返回一个模板,而不是你然后加载到自定义组件中的 JSON? 请假设这是唯一的方法!从 ajax 请求返回的数据包含 vue 语法。但我没有找到任何方法来呈现这些数据。在某些情况下,这是非常有用的方法,并且对于解决非常重要。谢谢 如果这是唯一的方法,那么您可能需要重写您的消耗性端点。当您可以简单地传递数据并将该内容交织到组件中时,传递模板字符串是没有意义的。如果你带着“按照我告诉你的那样编写代码”的心态来到 SO,那么你就走错了论坛。 是的,我知道 api 端点应该是 json,但在我的项目中这是唯一的方法。谢谢你的评论 有人帮不上忙吗? 【参考方案1】:

听起来你想使用Async Component。

类似...

components: 
  'async-media': () => Vue.http.get('/media').then(res => (
    template: res.body,
    methods: 
      alertVideoLink (event) 
        this.$emit('click', event)
      
    
  ))

然后在你的模板中...

<async-media @click="handleClickEventFromChildComponent" />

这是一个使用超时来伪造“加载”模板的示例

var app = new Vue(
  el: '#app',
  data: ,
  components: 
    'async-media': () => new Promise(resolve => 
      setTimeout(() => 
        resolve(
          template: '<a href="/media/videos" @click.prevent.self="alertVideoLink($event)">Video Link</a>',
          methods: 
            alertVideoLink(event) 
              this.$emit('click', event.target.href)
            
                    
        )
      , 2000)
    )
  ,
  methods: 
    handleClickEventFromChildComponent (href) 
      console.info('Clicked on', href)
    
  
);
<div id="app">
  <p>Wait 2 seconds</p>
  <async-media @click="handleClickEventFromChildComponent" />
</div>
<script src="https://unpkg.com/vue@2.4.2/dist/vue.min.js"></script>

【讨论】:

谢谢,有什么方法可以让 '/media' 变成动态的? @sgh370 这完全取决于它首先来自哪里。在您的问题中,它是硬编码的 为什么你的脚本不起作用?没有错误但没有工作 @sgh370 您是否在您的Vue 实例中实现了handleClickEventFromChildComponent 方法? 是的,我想操作从 ajax 返回的数据。有什么想法吗?例如替换响应中的一些字符串【参考方案2】:

@Phil 的回答是正确的,但在我的项目中需要更改。在这种情况下,更好的方法是:使用全局组件与本地组件,因为这项工作很简单。

【讨论】:

以上是关于vue.js 渲染包含 vue.js 语法的 ajax 数据的主要内容,如果未能解决你的问题,请参考以下文章

Vue.js 模板语法

Vue.js 源码目录设计

Vue.js模板语法

Vue专题-js常用指令

vue.js初学模板语法

Vue.js 如何渲染动态组件?