layui+jsp项目中实现table单元格嵌入下拉选择框功能,下拉选择框可手动输入内容或选择默认值,修改后数据正常回显。

需求

table列表中的数据实现下拉框修改数据,当默认的下拉框不符合要求时,可手动输入内容保存。内容修改后表格显示修改后的值同时表格不刷新。

实现

  • layui框架下拉框组件只能选择存在的数据,不支持将输入的内容显示在input中的功能,通过拼接输入框和下拉框实现该功能。
  • 因使用输入框和下拉框实现,修改数据逻辑也分为两套。
    • 输入框:检测input输入框失去焦点时调用更新接口。
    • 下拉框:下拉框检测到选择后调用更新接口。
  • 功能要求不刷新表格,因此使用var inputField = tr.find('.input-id-key'); inputField.val(data.value);修改表格显示。
  • 使用自定义组件查询出的数据不能正常回显在单元格中,使用var inputField = row.querySelector('.input-id-key');直接修改页面显示。

效果如下图,样式需自己修改。
在这里插入图片描述

实现代码

<!DOCTYPE html>
<html lang="en">
<head>
    <!-- 引入LayUI -->
    <link rel="stylesheet" href="plugins/layui2.4.5/css/layui.css" media="all">
</head>
<body class="no-skin">
<script src="plugins/layui2.4.5/layui.js" charset="utf-8"></script>
<!-- 注意:如果你直接复制所有代码到本地,上述js路径需要改成你本地的 -->
</body>
<!-- 自定义下拉框组件 -->
<script type="text/html" id="selectTpl">
    <div class="layui-form-item">
        <input type="text" id="input_id_key" name="key" placeholder="计划数量修改原因"
               autocomplete="off" class="layui-input input-id-key"
               style="position:absolute;z-index:2;width:80%;">
        <select type="text" id="selectOptions" lay-filter="hc_select" autocomplete="off"
                placeholder="" class="layui-select" style="color:#000000">
            <option value="" disabled selected>请选择或输入</option>
            {{# layui.each(d.dictionaryOptions, function(index, item){ }}
            <option value="{{item.name}}">{{item.name}}</option>
            {{# }); }}
        </select>
    </div>
</script>
<script>
    function tdTitle() {
        $('th').each(function (index, element) {
            $(element).attr('title', $(element).text());
        });
        $('td').each(function (index, element) {
            $(element).attr('title', $(element).text());
        });
    };
    layui.use(['form', 'layedit', 'laydate', 'table', 'element', 'util'], function () {
        var $ = layui.jquery;
        var table = layui.table;
        var form = layui.form;
        var element = layui.element;
        // 初始化下拉选项数据
        var dictionaryOptions = [];
        // 从接口获取下拉选项数据
        $.ajax({
            url: '/oms/...', // 获取下拉选择框列表接口
            method: 'GET',
            success: function (res) {
                dictionaryOptions = res; // 返回的数组赋值到dictionaryOptions
                form.render('select'); // 更新渲染
            }
        });
        $(document).ready(function () {
            initTab();
            var cols = [[
                {type: 'numbers'},
                {
                    field: 'reason', title: '计划数量修改原因', width: 200, templet: function (d) {
                        d.dictionaryOptions = dictionaryOptions; // 将选项数据绑定到当前行数据
                        return layui.laytpl(document.getElementById('selectTpl').innerHTML).render(d);
                    }
                },
                ......
            ]];
            var type = '';
            initTable1(type, cols);
        });
        //选择框选择后执行,通过获取tr找到对应行的单元格,否则只会修改第一行数据
        form.on('select(hc_select)', function (data) {
            var tr = $(data.elem).closest('tr'); // 确保这能准确找到最近的tr元素
            var index = tr.data('index'); // 使用jQuery的data方法来获取data-index
            var inputField = tr.find('.input-id-key'); // 直接在tr内查找input
            if (inputField.length > 0) {//确保查找到input
                inputField.val(data.value); // 更新值
            } else {
                console.error('未找到指定的输入框。');
            }
            var rowData = table.cache['demoEvent'][index]; // 获取修改单元格的整行数据,调用修改接口时可能需要其他字段
            updateReason(rowData,data.value)//修改逻辑接口
        });
        //鼠标移出输入框执行
        $(document).ready(function () {
            // 使用事件委托方式绑定 blur 事件
            $(document).on('blur', '#input_id_key', function () {
                var inputValue = $(this).val();//单元格输入的值
                var cell = $(this).closest('td');
                var row = cell.closest('tr');
                var rowIndex = row.index(); //行索引
                var rowData = table.cache['demoEvent'][rowIndex];//获取修改单元格的整行数据
                updateReason(rowData,inputValue)//修改逻辑接口
            });
        });
        //table默认加载
        function initTable1(orderType, cols) {
            table.render({
                elem: '#test'
                , url: '/oms/...'
                , height: 'full-150'
                , toolbar: '#myToolbar'
                , cols: cols,
                id: 'demoEvent'
                , where: {
                }
                , page: {
                    layout: ['prev', 'page', 'next', 'countPage', 'count', 'skip'] //自定义分页布局
                    , groups: 2 //只显示 1 个连续页码
                    , first: false //不显示首页
                    , last: false //不显示尾页
                }
                , limit: 100
                , done: function (res, curr, count) {
                    if (res.data.length > 0) {
                        // 获取表格的tbody元素
                        var tbody = document.querySelector('#test').nextElementSibling.querySelector('tbody');
                        for (var i = 0; i < res.data.length; i++) {
                            var row = tbody.rows[i];
                            if (row) {
                                // 获取该行的输入框
                                var inputField = row.querySelector('.input-id-key');
                                if (inputField) {
                                    // 回显输入框的值
                                    inputField.value = res.data[i].reason;
                                }
                            }
                        }
                    }
                    tdTitle();
                }
            });
        }
    });
</script>
</html>

  • 11
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在 VueX ,可以通过 mutations 来修改 store 数据,从而实现下拉菜单选数据回显。 具体实现步骤如下: 1. 在 store 定义一个名为 `selectedOptions` 的数组变量,用于存储选数据。 2. 在 mutations 定义一个名为 `addSelectedOption` 的方法,用于将选数据添加到 `selectedOptions` 数组。 3. 在 mutations 定义一个名为 `removeSelectedOption` 的方法,用于将取消选数据从 `selectedOptions` 数组移除。 4. 在下拉菜单组件,通过 `v-model` 绑定 `selectedOptions` 数组,并在 `change` 事件触发 mutations 的 `addSelectedOption` 和 `removeSelectedOption` 方法。 5. 在下拉菜单组件,通过 `v-bind:selected` 绑定一个计算属性,判断该选项是否被选,从而在下拉菜单显示选数据。 示例代码如下: store.js: ``` import { createStore } from 'vuex'; const store = createStore({ state: { selectedOptions: [], }, mutations: { addSelectedOption(state, option) { state.selectedOptions.push(option); }, removeSelectedOption(state, option) { const index = state.selectedOptions.indexOf(option); if (index !== -1) { state.selectedOptions.splice(index, 1); } }, }, }); export default store; ``` 下拉菜单组件: ``` <template> <el-select v-model="selectedOptions" multiple @change="handleChange"> <el-option v-for="option in options" :key="option.value" :label="option.label" :value="option.value" :selected="isSelected(option)"> </el-option> </el-select> </template> <script> import { computed } from 'vue'; import { mapMutations } from 'vuex'; export default { computed: { ...mapMutations(['addSelectedOption', 'removeSelectedOption']), selectedOptions: { get() { return this.$store.state.selectedOptions; }, set(value) { this.$store.state.selectedOptions = value; }, }, options() { return [ { value: 'option1', label: '选项1' }, { value: 'option2', label: '选项2' }, { value: 'option3', label: '选项3' }, { value: 'option4', label: '选项4' }, ]; }, isSelected() { return (option) => { return this.selectedOptions.includes(option.value); }; }, }, methods: { handleChange(value) { const selected = value[value.length - 1]; const isSelected = this.selectedOptions.includes(selected); if (isSelected) { this.removeSelectedOption(selected); } else { this.addSelectedOption(selected); } }, }, }; </script> ``` 在上面的例子,通过 `mapMutations` 将 mutations 的 `addSelectedOption` 和 `removeSelectedOption` 方法映射到组件。在 `selectedOptions` 计算属性,使用 `get` 和 `set` 方法来获取和设置 store 的 `selectedOptions` 数组。 在 `isSelected` 计算属性,定义了一个箭头函数,用于判断选项是否被选。在 `el-option` 组件,通过 `v-bind:selected` 绑定该计算属性,从而实现下拉菜单数据回显。在 `change` 事件,根据选和取消选的情况,分别触发 mutations 的方法,修改 store 数据
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

懒人w

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值