vue规格新增一对多的例子

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>规格测试</title>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <!-- 引入样式 -->
    <link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
    <!-- 引入组件库 -->
    <script src="https://unpkg.com/element-ui/lib/index.js"></script>
    <script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
</head>
<body>
    <div id="app">
        <ul>
            <li  v-for="(list,index) in list_init" :key="index">
                <a class="btn_a" style="border: 0">{{list.name}}</a>
                <a class="btn_a" @click="btn_a(list1, list.name)" v-for="(list1,index1) in list.content" :key="index1" style="border: 1px solid rgb(204, 204, 204)">
                    {{list1}}
                </a>
                <el-button type="primary" plain @click="addnew_content(list.content)">新增规格</el-button>
            </li>
            <li>
                <el-button type="primary" plain @click="addnew_name">新增名称</el-button>
            </li>
        </ul>
        <table style="margin-top: 50px;">
            <tr>
                <td>序号</td>
                <td>规格</td>
                <td>价格</td>
                <td>操作</td>
            </tr>
            <tr v-for="(list,index) in guige_see" :key="index" v-if="list.guige">
                 <td>
                     {{index + 1}}
                </td>
                <td>
                    {{list.guige}}
                </td>
                <td>
                    <el-input v-model="list.price" placeholder="请输入内容"></el-input>
                </td>
                <td>
                    <el-button @click="del_one(index)" type="danger" icon="el-icon-delete" circle></el-button>
                </td>
            </tr>
        </table>
        <el-dialog
            :title="title"
            :visible.sync="dialogVisible"
            width="30%">
            <span v-if="guige_add_state">新增规格</span>
            <span v-else>新增名称</span>
            <h1></h1>
            <el-input v-model="input" placeholder="请输入内容"></el-input>
            <span slot="footer" class="dialog-footer">
                <el-button @click="dialogVisible = false">取 消</el-button>
                <el-button v-if="guige_add_state" type="primary" @click="add_content">新增内容</el-button>
                <el-button v-else type="primary" @click="add_name">新增名称</el-button>
            </span>
        </el-dialog>
    </div>
    <script>
        var app = new Vue({
            el: '#app',
            data () {
                return {
                    list_init: [],
                    dialogVisible: false, // 弹框控制
                    guige_add_state: true, // 控制新增的名称或是规格
                    title: '', // 控制弹框标题
                    content: [], // 暂存规格内容
                    input: '', // 弹框的输入内容
                    guige_josn: [],
                    arr_cun: [],
                    guige_see: []
                }
            },
            methods: {
                btn_a (list1, name) {
                    var this_1 = this
                    var obj = event.target 
                    var color = obj.style.borderColor
                    console.log(list1)
                    console.log(name)
                    if(color == 'rgb(204, 204, 204)'){
                        obj.style.border = '1px solid red'
                        if(this_1.guige_josn.length == 0){
                            console.log('没有数据')
                            this_1.guige_josn.push({
                                name: name,
                                content: [list1]
                            })
                        }else{
                             // 假如已经添加过了
                            var addstate = false
                            for(var i in this_1.guige_josn){
                                if(this_1.guige_josn[i].name == name){
                                    console.log('已经添加过name')
                                    var index = this_1.guige_josn[i].content.indexOf(list1)
                                    if(index == -1){
                                        this_1.guige_josn[i].content.push(list1)
                                    }
                                    
                                    addstate = true
                                }
                            }
                            // 如果没添加过的
                            if(addstate == false){
                                console.log('没有添加过name')
                                this_1.guige_josn.push({
                                    name: name,
                                    content: [list1]
                                })
                            }
                        }
                       
                        console.log(this_1.guige_josn)
                    }
                    else{
                        color = 'rgb(204, 204, 204)'
                        obj.style.border = '1px solid rgb(204, 204, 204)'
                        for(var i in this_1.guige_josn){
                            if(this_1.guige_josn[i].name == name){
                                var index = this_1.guige_josn[i].content.indexOf(list1)
                                this_1.guige_josn[i].content.splice(index, 1)
                                if(this_1.guige_josn[i].content.length == 0){
                                    delete this_1.guige_josn[i]
                                }
                            }
                        }

                    }
                   this_1.computed_guige()
                },
                computed_guige () {
                    var this_1 = this
                    this_1.arr_cun = []
                    this_1.guige_see = []
                    for(var i in  this_1.guige_josn){
                        this_1.arr_cun.push(this_1.guige_josn[i].content)
                    }
                    console.log('arr_cun')
                    console.log(this_1.arr_cun)
                    // 计算n个数组,每组取出一个,生成所以的序列
                    var arr = this_1.arr_cun
                    var sarr = [[]];
                    for (var i = 0; i < arr.length; i++) {
                        var tarr = [];
                        for (var j = 0; j < sarr.length; j++)
                            for (var k = 0; k < arr[i].length; k++)
                                tarr.push(sarr[j].concat(arr[i][k]));
                                sarr = tarr;
                    }
                    for(var i=0;i<sarr.length;i++){
                        sarr[i] = sarr[i].join(',')
                    }
                    for(var i in sarr){
                        this_1.guige_see.push({
                            guige: sarr[i],
                            price: ''
                        })
                    }
                    // this_1.guige_see = sarr
                    console.log(this_1.guige_see)
                },
                // 删除一个规格
                del_one (index) {
                    var this_1 = this
                    console.log(index)
                    this_1.guige_see.splice(index, 1)
                },
                get_spec () {
                    var this_1 = this
                    $.ajax({
                        type: 'post',
                        data: '',
                        url: 'http://test.interface.carmanclub.com.cn/cym_back/backStage/goods/spec/findSpec',
                        success: function(json){
                            console.log(json)
                            this_1.list_init = json.data.list
                            for(var i in this_1.list_init){
                                this_1.list_init[i].content = this_1.list_init[i].content.split(',')
                            }
                        }
                    })
                },
                addnew_content (content) {
                    var this_1 = this
                    this_1.dialogVisible = true
                    this_1.guige_add_state = true
                    this_1.title = '新增规格'
                    this_1.input = ''
                    console.log(content)
                    this_1.content = content
                },
                add_content(){
                    var this_1 = this
                    if(this_1.input) this_1.content.push(this_1.input)
                    this_1.dialogVisible = false
                },
                addnew_name () {
                    var this_1 = this
                    this_1.input = ''
                    this_1.dialogVisible = true
                    this_1.guige_add_state = false
                    this_1.title = '新增名称'
                },
                add_name () {
                    var this_1 = this
                    if(this_1.input){
                        this_1.list_init.push({
                            name: this_1.input,
                            content: []
                        })
                    }
                    this_1.dialogVisible = false
                }
            },
            mounted () {
                var this_1 = this
                this_1.get_spec()
                var obj = [
                    {
                        name: '尺码',
                        content: ['X', 'L', 'M']
                    },
                    {
                        name: '颜色',
                        content: ['黑', '白']
                    },
                    {
                        name: '形状',
                        content: ['方', '圆', '正']
                    }
                ]
                for(var i in obj){
                    
                }
            }
        })
    </script>
<style>
    ul,li{
        list-style: none;
        padding: 0;
        margin: 0;
    }
    .btn_a{
        display: inline-block;
        padding:10px;
        margin: 10px;
    }
    .red{
        border: 1px solid red;
    }
    td{
        padding: 50px;
    }
</style>
</body>
</html>

  

原文地址:https://www.cnblogs.com/cengjingdeshuige/p/9407129.html