Vue.js - 具有两行跨度的组件

Posted

技术标签:

【中文标题】Vue.js - 具有两行跨度的组件【英文标题】:Vue.js - Component with two rowspan 【发布时间】:2017-04-07 02:56:54 【问题描述】:

我是 Vue.js 的初学者,我想使用组件。我有一个(动态)表,其中包含机器(SN = 序列号)和每个来源的钱,所以我想使用行跨度。每行都将是组件的实例,因为有自己的复选框,我想稍后再使用它。问题是我不知道如何使用循环来创建在表内有点复杂的组件。示例如下:

<div id="container">
    <table border="1">
        <template v-for="row in storage.rows">
            <tr>
                <td rowspan="2"><input type="checkbox"></td>
                <td rowspan="2">row.sn</td>
                <td>row.source</td>
            </tr>
            <tr>
                <td>row.pair.source</td>
            </tr>
        </template>
    </table>
</div>

<script>
    new Vue(
        el: '#container',

        data: 
            storage: 
                rows: [
                    sn: 111, source: 'EK', pair: source: 'VLT', in: 100,
                    sn: 222, source: 'EK', pair: source: 'VLT', in: 200
                ]
            
        ,


    );
</script>

这很好用,但我不知道如何将模板转换为组件。对于 Vue.js,我使用的是 Laravel 及其模板引擎 Blade,所以我有这样的解决方法:

<div id="container">
    <table border="1">
        @foreach($differences as $difference)
            <tr is="ek" diff=" json_encode($difference) "></tr>
            <tr is="vlt" diff=" json_encode($difference->pair) "></tr>
        @endforeach
    </table>
</div>

<template id="ek-template">
    <tr>
        <td rowspan="2"><input type="checkbox"></td>
        <td rowspan="2">@ difference.sn </td>
        <td>@ difference.source </td>
    </tr>
</template>

<template id="source-template">
    <tr>
        <td>@ difference.source </td>
    </tr>
</template>

<script>
    new Vue(
        el: '#container',

        data: 
            storage: 
                differences: !! json_encode($differences) !!
            
        ,

        components: 
            ek: 
                template: '#ek-template',
                props: ['diff'],

                computed: 
                    difference: function () 
                        return JSON.parse(this.diff);
                    ,
                ,
            ,

            vlt: 
                template: '#source-template',
                props: ['diff'],
                computed: 
                    difference: function () 
                        return JSON.parse(this.diff);
                    ,
                ,
            
        ,
    );
</script>

我想使用 Vue.js 循环而不是 Laravel 的 foreach,因为我已经在 Vue.js 对象中有数据。有什么解决办法吗?

【问题讨论】:

【参考方案1】:

您不需要混合使用刀片和 vue js 模板。

您的示例是正确的,您只需转换为单个文件组件的VueJs组件。 (文件*.vue)一个vue组件结构是

// template should only have one root (e.g. wrap in div)
<template>
    <div id="container">
        <table border="1">
            <template v-for="row in storage.rows">
                <tr>
                    <td rowspan="2"><input type="checkbox"></td>
                    <td rowspan="2">row.sn</td>
                    <td>row.source</td>
                </tr>
                <tr>
                    <td>row.pair.source</td>
                </tr>
            </template>
        </table>
    </div>
</template>


<script>
export default 
    // a data has to be a function within a vue component
    data () 
        return 
            storage: 
                rows: [
                    sn: 111, source: 'EK', pair: source: 'VLT', in: 100,
                    sn: 222, source: 'EK', pair: source: 'VLT', in: 200
                ]
            
        
    

</script>

// styling for a template
<style>
</style>

一个新的 laravel 5.3 项目预装了一个示例 vue 组件。您可以将其用作参考并使用 gulp 将所有 vue 组件(*.vue)编译为单个文件(例如 app.js)

【讨论】:

以上是关于Vue.js - 具有两行跨度的组件的主要内容,如果未能解决你的问题,请参考以下文章

(Vue.js)具有不同路由的相同组件

Vue.js - 具有复杂子项的单元测试组件

Vue.js - 具有动态组件的多个事件

如何调用具有不同数据属性的组件? (vue.js 2)

Vue.js/NuxtJS - 如何创建具有可通过 JSON 配置文件自定义的默认设计的组件

Vue.js—组件快速入门以及Vue路由实例应用