如何根据布局和页面模板在 laravel 应用程序中分离 Vue 逻辑

How to seperate Vue logic in a laravel app based on layout and page templates

我有一个 laravel 应用程序和一个附加到主体的 Vue 实例(或一个 div,就在主体内部)。

const app = new Vue({
    el: '#app'
});

我认为将 Vue 实例用于与布局相关的内容(例如页眉、导航、页脚逻辑)是有意义的。

现在我有一个在特定路线上可见的表格(例如 example.com/thing/create)。我想给它添加一些逻辑,例如根据表单中的选定选项隐藏字段。这是仅适用于此表单的逻辑(不可重复使用)。我不喜欢将所有逻辑都放在表单中,而是放在 app.js 中。我可以将它放在绑定到正文的 Vue 实例中,但这听起来很奇怪,因为它只适用于更深入 dom 的形式。

我想在 blade 模板(继承布局)中保留表单标记。

我尝试创建一个组件,但不确定如何将它绑定到主 Vue 实例中。处理此表单的最佳方法是什么,将其放入 app.js 并使其结构化,将变量放入范围内。或者真的有必要移除绑定到完整布局代码的主 Vue 实例吗?

我试过类似这样的方法,但它不起作用(将它附加到 <form id="object-form"> 似乎失败了:

var ObjectForm = {
    template: function() { return '#object-form'},
    data: function() {
        return {
            selectedOption: 1
        }
    },
    computed: {
        displayField: function() {
            // return true or false depending on form state
            return true;
        }
    }
};

如果我删除#app Vue 实例或当我将所有内容直接放入应用程序 Vue 实例中时,一切正常。但这看起来很乱,如果我对另一种形式有类似的变量,它们应该分开一些。 我将不胜感激关于结构(区分页面布局和页面特定表单)的一些建议,如果可能的话,一些示例将表单逻辑放在主要 app.js.

我希望这有助于为您分解内容并帮助您理解 Vue 模板。

最好利用Vue的组件。对你来说,它看起来像这样。这段代码有些依赖于你的文件结构,但你应该能看懂。

在您的 app.js 文件(或您的主 js 文件)中

Vue.component('myform',require('./components/MyForm.vue'));

const app = new Vue({
  el: "#app"
});

然后创建 MyForm.vue file

<template>
 <form> 
  Put Your Form Markup Here
 </form>
</template>

<script>
 // Here is where you would handle the form scripts.
 // Use methods, props, data to help set up your component
  module.exports = {
    data: function() {
        return {
            selectedOption: 1
        }
    },
    computed: {
        displayField: function() {
            // return true or false depending on form state
            return true;
        }
    },
   methods: {
     // add methods for dynamically changing form values
   }
  }
</script>

然后你就可以调用你的 blade 文件了。

<myform></myform>

我知道怎么做了。诀窍是使用内联模板。将视图中的表单包围起来:

<object-form inline-template>
    <form>...</form>
</object-form>

其中 object-form 是组件的名称。在上面的 ObjectForm 代码中,我删除了模板,如下所示:

var ObjectForm = {
    data: function() {
        return {
            selectedOption: 1
        }
    },
    computed: {
        displayField: function() {
            // return true or false depending on form state
            return true;
        }
    }
};

我像这样在根 vue 应用程序中附加组件:

const app = new Vue({
    el: 'body',
    components: {
        'object-form': ObjectForm
    }
});

这样我就可以使用从控制器和视图生成的表单,并且可以将它与根(附加到正文)方法和属性分开。

为了更好地组织它,我可以按照@Tayler Foster 建议的方式将 ObjectForm 存储在单独的 .vue 文件中。