Lodash使用笔记之----- _.get()

本文介绍如何使用Lodash库中的_.get()方法为JavaScript对象或数组的引用类型数据设置默认值。通过安装并引入Lodash,可以高效地处理未定义的路径情况。

该方法可以进行判断一个引用类型的数据是否有值,如果为undefind则可以设置默认值给它
1、需要安装Lodash,再在使用的文件中引入Lodash
这里是react项目中 :npm install -S lodash安装lodash依赖包
import _ from ‘lodash’;//文件中引入lodash模块
2、使用_.get()方法

_.get(obj, path, ["defaultValue"])
//obj (Object): 要检索的对象,可以是对象也可以是数组。
//path (Array|string): 要获取属性的路径,该参数可以是数组也可以是字符串类型。
//[defaultValue] (*): 如果解析值是 undefined ,这值会被返回。

对象使用该方法在这里插入图片描述
数组使用该方法
在这里插入图片描述

<think>我们正在使用ele-pro-table(基于Element Plus的增强表格组件)来实现内置合计行功能。根据Element Plus的文档,我们可以通过设置`show-summary`和`summary-method`属性来实现。但是注意,在ele-pro-table中,这些配置可能被封装在`tableConfig`属性中传递。 关键点: 1. 在ele-pro-table中,我们可以通过`:tableConfig`绑定一个配置对象,其中包含Element Table的原生属性。 2. 需要设置`showSummary: true`来显示合计行。 3. 通过`summaryMethod`属性指定一个计算合计行的方法。 步骤: a. 定义表格列,并标记需要合计的列(通常数值列需要合计)。 b. 在`tableConfig`中设置`showSummary`为`true`,并指定`summaryMethod`方法。 c. 实现`summaryMethod`方法,该方法会传入一个参数(包含列信息和当前页数据等),并返回一个数组,数组的每个元素对应每一列的合计内容。 注意:ele-pro-table在数据加载方式上可能和普通el-table不同,它通常通过`datasource`属性异步加载数据。因此,在合计方法中,我们需要访问当前表格显示的数据(当前页数据)。ele-pro-table提供了`@load`事件,当数据加载完成后会触发,我们可以在这个事件中获取当前页的数据。 下面是一个示例代码:</think># Vue3 + ele-data-table 内置合计行功能实现指南 在 Vue3 中使用 ele-data-table 组件实现内置合计行功能,可以通过配置 `tableConfig` 属性来实现。以下是完整实现方案: ## 实现思路 1. 使用 `tableConfig.showSummary` 启用合计行 2. 通过 `tableConfig.summaryMethod` 定义合计计算方法 3. 监听表格加载事件获取当前数据 4. 在合计方法中计算并返回合计值 ## 完整实现代码 ```vue <template> <div class="container"> <h1>Vue3 ele-data-table 合计功能实现</h1> <div class="card"> <ele-data-table ref="tableRef" :columns="columns" :datasource="getDataSource" :tableConfig="tableConfig" @load="handleTableLoad" /> </div> <div class="summary-tips"> <el-tag type="success">当前表格包含 {{ currentTableData.length }} 条数据</el-tag> <el-tag type="warning">金额合计: ¥{{ totalAmount.toFixed(2) }}</el-tag> <el-tag type="danger">数量合计: {{ totalQuantity }} 件</el-tag> </div> </div> </template> <script setup> import { ref, reactive, computed } from 'vue'; const tableRef = ref(null); const currentTableData = ref([]); // 表格配置 const tableConfig = reactive({ showSummary: true, // 启用合计行 summaryMethod: handleSummary, // 合计计算方法 border: true, stripe: true }); // 表格列配置 const columns = ref([ { prop: 'name', label: '产品名称', width: 200, align: 'center' }, { prop: 'category', label: '产品类别', width: 150, align: 'center' }, { prop: 'amount', label: '金额(元)', width: 150, align: 'right', summable: true, // 自定义标记可合计列 formatter: (row) => `¥${row.amount.toFixed(2)}` }, { prop: 'quantity', label: '数量(件)', width: 150, align: 'right', summable: true }, { prop: 'date', label: '日期', width: 180, align: 'center' } ]); // 计算总金额 const totalAmount = computed(() => { return currentTableData.value.reduce( (sum, item) => sum + (Number(item.amount) || 0), 0 ); }); // 计算总数量 const totalQuantity = computed(() => { return currentTableData.value.reduce( (sum, item) => sum + (Number(item.quantity) || 0), 0 ); }); // 数据源方法 const getDataSource = async (params) => { // 模拟API请求 return new Promise(resolve => { setTimeout(() => { const mockData = generateMockData(); resolve({ data: mockData, total: mockData.length }); }, 800); }); }; // 监听数据加载 const handleTableLoad = (data) => { currentTableData.value = data; }; // 合计计算方法 const handleSummary = ({ columns }) => { const sums = []; columns.forEach((column, index) => { if (index === 0) { sums[index] = '合计'; return; } if (column.summable) { const values = currentTableData.value.map(item => Number(item[column.property]) || 0 ); const total = values.reduce((sum, val) => sum + val, 0); // 添加单位(可选) if (column.property === 'amount') { sums[index] = `¥${total.toFixed(2)}`; } else if (column.property === 'quantity') { sums[index] = `${total} 件`; } else { sums[index] = total; } } else { sums[index] = '—'; } }); return sums; }; // 生成模拟数据 const generateMockData = () => { const categories = ['电子产品', '家居用品', '服装', '食品', '图书']; const names = [ '智能手机', '笔记本电脑', '智能手表', '平板电脑', '蓝牙耳机', '沙发', '餐桌', '床', '衣柜', '电视柜', 'T恤', '牛仔裤', '外套', '连衣裙', '运动鞋', '巧克力', '咖啡豆', '坚果', '水果干', '饼干', '科幻小说', '编程指南', '历史书籍', '儿童绘本', '烹饪手册' ]; const data = []; for (let i = 1; i <= 25; i++) { const category = categories[Math.floor(Math.random() * categories.length)]; const name = names[Math.floor(Math.random() * names.length)]; data.push({ id: i, name: name, category: category, amount: Math.random() * 1000 + 100, quantity: Math.floor(Math.random() * 20) + 1, date: `2023-${Math.floor(Math.random() * 12) + 1}-${Math.floor(Math.random() * 28) + 1}` }); } return data; }; </script> <style scoped> .container { max-width: 1200px; margin: 0 auto; padding: 20px; } h1 { text-align: center; color: #2c3e50; margin-bottom: 30px; } .card { background-color: #fff; border-radius: 8px; box-shadow: 0 2px 12px rgba(0, 0, 0, 0.1); padding: 20px; margin-bottom: 20px; } .summary-tips { display: flex; gap: 15px; justify-content: center; margin-top: 20px; } :deep(.el-table__footer) { font-weight: bold; background-color: #f5f7fa; } :deep(.el-table__footer .cell) { color: #f56c6c; } </style> ``` ## 关键实现说明 ### 1. 配置表格启用合计行 ```javascript const tableConfig = reactive({ showSummary: true, // 启用合计行 summaryMethod: handleSummary, // 指定合计计算方法 }); ``` ### 2. 标记需要合计的列 ```javascript { prop: 'amount', label: '金额(元)', summable: true, // 自定义标记可合计列 } ``` ### 3. 实现合计计算方法 ```javascript const handleSummary = ({ columns }) => { const sums = []; columns.forEach((column, index) => { if (index === 0) { sums[index] = '合计'; return; } if (column.summable) { // 计算当前列的总和 const values = currentTableData.value.map(item => Number(item[column.property]) || 0 ); const total = values.reduce((sum, val) => sum + val, 0); // 格式化输出 if (column.property === 'amount') { sums[index] = `¥${total.toFixed(2)}`; } // ...其他列的处理 } else { sums[index] = '—'; } }); return sums; }; ``` ### 4. 获取当前表格数据 ```javascript // 监听数据加载事件 const handleTableLoad = (data) => { currentTableData.value = data; }; ``` ## 常见问题解决方案 ### 1. 分页情况下的全量合计 ```javascript // 在API请求中获取全量合计值 const getDataSource = async (params) => { const res = await api.getData(params); // 使用后端返回的合计值 if (res.totalSummary) { summaries.value = res.totalSummary; } return { data: res.list, total: res.total }; }; ``` ### 2. 单元格编辑后实时更新合计 ```vue <ele-data-table @cell-edit="handleCellEdit" /> <script setup> // 监听单元格编辑事件 const handleCellEdit = () => { // 强制刷新表格 if (tableRef.value?.element) { tableRef.value.element.doLayout(); } }; </script> ``` ### 3. 多级表头合计实现 ```javascript const handleSummary = ({ columns }) => { const sums = []; const calculateColumnTotal = (column) => { if (column.children) { // 递归计算子列 return column.children.reduce((sum, child) => { return sum + calculateColumnTotal(child); }, 0); } if (column.summable) { const values = currentTableData.value.map(item => Number(item[column.property]) || 0 ); return values.reduce((sum, val) => sum + val, 0); } return 0; }; columns.forEach((column, index) => { if (index === 0) { sums[index] = '合计'; return; } if (column.children) { sums[index] = calculateColumnTotal(column); } else if (column.summable) { sums[index] = calculateColumnTotal(column); } else { sums[index] = '—'; } }); return sums; }; ``` ## 性能优化建议 1. **使用计算属性缓存结果**: ```javascript const totalAmount = computed(() => { return currentTableData.value.reduce( (sum, item) => sum + (Number(item.amount) || 0), 0 ); }); ``` 2. **大数据量优化**: ```javascript // 从后端获取合计值 const getDataSource = async (params) => { const res = await api.getData(params); if (res.totalSummary) { summaries.value = res.totalSummary; } return { data: res.list, total: res.total }; }; ``` 3. **防抖处理频繁更新**: ```javascript import { debounce } from 'lodash-es'; const calculateSummaries = debounce(() => { // 计算逻辑 }, 300); ``` ## 总结 在 Vue3 中使用 ele-data-table 实现内置合计行功能的核心步骤: 1. 配置 `tableConfig.showSummary: true` 启用合计行 2. 实现 `tableConfig.summaryMethod` 方法计算合计值 3. 通过 `@load` 事件获取当前表格数据 4. 在列配置中使用自定义属性(如 `summable`)标记需要合计的列 对于复杂场景(分页全量合计、多级表头等),可能需要结合后端接口和前端计算共同实现。 ## 相关问题 1. 如何在 ele-data-table 中实现分页情况下的全量合计? [分页全量合计需要从后端获取全量合计值](#_1-分页情况下的全量合计) 2. 单元格编辑后如何实时更新合计行? [需要监听 cell-edit 事件并刷新表格布局](#_2-单元格编辑后实时更新合计) 3. 如何实现多级表头的合计功能? [在 summaryMethod 中递归处理子列](#_3-多级表头合计实现) 4. 大数据量下如何优化合计计算的性能? [建议从后端获取合计值或使用 Web Worker](#性能优化建议) 5. 如何自定义合计行的样式? 可以通过 `:deep(.el-table__footer)` 选择器自定义样式[^2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值