vue实现输入行和列生成表格

vue实现输入行和列生成表格

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="widtd=device-widtd, initial-scale=1.0">
    <title>vue实现输入行和列生成表格</title>
    <script src="../node_modules/vue/dist/vue.js"></script>
    <script src="../node_modules/axios/dist/axios.js"></script>
    <style>
        html,
        body,
        #app {
            height: 100%;
        }

        td {
            min-width: 60px;
            width: auto;
            height: 30px;
        }

        td>span {
            display: inline-block;
            width: 100%;
            height: 100%;
        }

        td>input {
            display: inline;
        }
    </style>
</head>

<body>
    <div id="app" @click='clickOther($event)'>
        <div>
            行: <input type="number" v-model='rows'>
            列: <input type="number" v-model='cols' id="cols">
        </div>
        <br />
        <div>
            <table border="1" cellspacing="0" v-if="tableData.length" ref="table">
                <tr v-for="(arr, index) in tableData" :key="index">
                    <td v-for="(item, index1) in arr" :key="index1">
                        <span v-show='!item.isEdit' @click='clickTd(item,$event)'>{{item.name}}</span>
                        <input type="text" v-model="item.name" v-if='item.isEdit' />
                    </td>
                </tr>
            </table>
        </div>
        <button @click="output">输出</button>
        <button @click='importData'>导入数据</button>
    </div>
    <script>
        let vm = new Vue({
            el: '#app',
            data: {
                rows: 0,
                cols: 0,
                tableData: [

                ]
            },
            methods: {
                //点击其他地方使表格置为非编辑状态
                clickOther(e) {
                    var curDom = (e && e.target) || (event && event.srcElement);
                    var table = this.$refs.table
                    if (table && !table.contains(curDom)) {
                        this.removeEdit()
                    }
                },
                // 使表格置为非编辑状态
                removeEdit() {
                    this.tableData.forEach(arr => {
                        arr.forEach(item => {
                            item.isEdit = false
                        })
                    })
                },
                //生成表格
                submit() {
                    let rows = this.rows * 1
                    let cols = this.cols * 1
                    let arr = []
                    let tableDataCopy = JSON.parse(JSON.stringify(this.tableData))
                    for (let i = 0; i < this.rows; i++) {
                        arr[i] = []
                        for (let j = 0; j < this.cols; j++) {
                            arr[i][j] = {
                                isEdit: false,
                                name: tableDataCopy[i] ? (tableDataCopy[i][j] ? tableDataCopy[i][j].name : '') : ''
                            }
                        }
                    }
                    this.tableData = arr
                },
                //点击表格内的单元格使单元格变成编辑状态
                clickTd(item, event) {
                    this.removeEdit()
                    item.isEdit = true
                    this.$nextTick(() => {
                        event.target.nextElementSibling.focus()
                    })
                },
                // 导出数据
                output() {
                    console.log(this.tableData)
                },
                // 导入数据
                async importData() {
                    const {data}= await axios.get('../json/table.json')
                    let importData=data.data
                    this.rows=importData.length
                    this.cols=importData[0].length
                    importData.forEach(arr=>{
                        arr.forEach(item=>{
                            item.isEdit=false
                        })
                    })
                    this.tableData=importData
                }
            },
            watch: {
                // 监听行输入框变化
                rows() {
                    this.submit()
                },
                // 监听列输入框变化
                cols() {
                    this.submit()
                }
            }
        })
    </script>
</body>

</html>

输入行和列的效果如下:
输入行和列的效果
导入数据table.json

{
    "data": [
        [{"name": "zl11"},{"name": "zl12"},{"name": "zl13"},{"name": "zl14"}],
        [{"name": "zl11"},{"name": "zl12"},{"name": "zl13"},{"name": "zl14"}],
        [{"name": "zl11"},{"name": "zl12"},{"name": "zl13"},{"name": "zl14"}]
    ]
}

点击导入数据效果如下:
点击导入数据

  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值