激活控制器渲染的模板中的 Vue

Posted

技术标签:

【中文标题】激活控制器渲染的模板中的 Vue【英文标题】:Activating Vue that is within a template rendered by a Controller 【发布时间】:2018-01-19 10:28:47 【问题描述】:

我陷入了这样一种情况,即(Laravel)控制器提供了一个使用 Ajax 插入前端的视图,如下所示:

MyController.php

return Response::json(['html' => View::make('my_blade_view', [
            'items' => $items
        ])->render()]);

在 my_blade_view.blade.php 中,我需要添加一些 Vue.js 功能,如下所示:

my_blade_view.blade.php

<div v-on:click="myVueMethod"></div>

问题是,当 Ajax 调用完成时,虽然来自 my_blade_view.blade.php 的 HTML 已成功插入页面(这是另一个 Blade 视图),但 v-on:click 功能没有运行。我想知道是否有一种方法可以告诉 Vue 实例在 Ajax 调用完成时重新处理页面,以便它获取我在由控制器呈现的模板中添加的新 Vue 代码?

谢谢。

【问题讨论】:

【参考方案1】:

我相信你可以使用$mount 来处理这个问题。

您需要做的是在MyController.php 中声明该组件,但不要将它安装到任何html 元素上。然后,一旦您的ajax 调用完成,并且来自my_blade_view.blade.phphtml 被添加到dom,然后调用$mount(elementSelector)

这是一个简单的示例,展示了如何在创建实例后挂载到元素。

var vm = new Vue(
  data: 
    message: 'Hello'
  
)

setTimeout(function()
  vm.$mount("#app");
, 3000)
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.4.2/vue.min.js"></script>
<div id="app">
  <span>message</span>
</div>

或者,在不了解情况的情况下,您可以将my_blade_view.blade.php 推入MyController.php 并用v-if 隐藏它而不是用ajax 加载它吗?

【讨论】:

感谢您的回答。我马上去看看 lameleon 不幸的是,我不相信您的任何一个解决方案都对我有用,至少不能按原样工作。对于您的第一个解决方案,我想我需要一些更接近此的方法:jsfiddle.net/gratiafide/g5xx35Lx/3 @user3089840 本质上是一样的。您只有几个语法和逻辑错误。在这里检查this。 我要给你一点,因为你让我更接近,我真的很感谢你的帮助,但问题是 Vue 实例必须已经与el: '#app',在添加新内容之前,必须“重新安装” @user3089840 dynamic components 是否更适合您的情况?

以上是关于激活控制器渲染的模板中的 Vue的主要内容,如果未能解决你的问题,请参考以下文章

构建 Vue 项目时出现错误“无法安装组件:未定义模板或渲染函数”

Laravel 6 + Vue.js 无法挂载组件:未定义模板或渲染函数

从 Grails 中的控制器渲染 json 视图

Vue.js - 组件模板不使用 v-for 渲染

Vue.js 模板指令

vue的虚拟dom(Virtual DOM )