ag-grid 列搜索时自动失去焦点

问题描述:

ag-grid 列搜索时自动失去焦点,因为自动失去焦点中文输入会变成英文。
每输入一个字符就失去焦点!!

问题原因与解决方案

可能原因解决方案
组件/列定义被意外重置确保 columnDefsgridOptions 是静态或使用 useMemo/useCallback 缓存
refreshCells()redrawRows() 触发全局刷新避免不必要的刷新。如需刷新,使用 api.refreshCells({ force: false }) 或更精确的 refreshCells({ columns: ['specificColumn'], force: true })

我发现是我使用了onFilterChanged方法才导致的这个问题,我把它注释掉就不会有这个问题了。
但我的需求必须用onFilterChanged。

    const gridApiRef = useRef();
     // 当 Grid 准备就绪时,保存 API 实例并初始化状态
    const onGridReady = (params) => {
        setGridApi(params.api);

    };
    const filterChange = () => { //响应事件 - 当筛选条件改变时获取条数
        if (gridApi) {
           //获取当前展示的数据条数
            //setDataTotal(gridApi?.getDisplayedRowCount())
            //gridApi?.refreshCells({force: true })
        }
    }
<AgGridReact
ref={gridApiRef}
onGridReady={onGridReady}
rowData={tracreData}
columnDefs={columnDefs1}
gridOptions={opt}
rowSelection={'multiple'}
onFilterChanged={filterChange} //过滤条件发生变化时触发
 >
  </AgGridReact>

解决方案1:把columnDefs写成useMemo、useCallback、useState

一开始我的columnDefs就是const columnDefs1=[xxx]。会导致搜索输入时失去焦点,每输入一个字符就需要重新点一下input

改成useMmeo(推荐):
    const columnDefs1 = useMemo(() => [
        {},
        {}
    ], []); // 空依赖数组表示只在组件挂载时创建一次

AgGridReact 的columnDefs={columnDefs}

改成useCallback:
const getColumnDefs = useCallback(() => [

], []); // 依赖数组为空,表示函数只创建一次

AgGridReact 的columnDefs={getColumnDefs}

改成useState:
 const [columnDefs1,setColumnDefs1] = useState([]);
     useEffect(() => {
        setColumnDefs1([
            {}
        ]);
    }, []);

AgGridReact 的columnDefs={columnDefs1}

解决方案2:使用refreshCells({force: true })

需要在onFilterChanged里加上gridApi?.refreshCells({force: true })

 const filterChange = () => { //响应事件 - 当筛选条件改变时获取条数
        if (gridApi) {
           //获取当前展示的数据条数
            //setDataTotal(gridApi?.getDisplayedRowCount())
            gridApi?.refreshCells({force: true })
        }
    }

总结:

我建议使用useMem、useSate来解决这个问题,更方便更快。
useCallback是缓存函数的,用来解决这个问题也可以,但会引起歧义。

refreshCells({force: true })则还需要定义一个ref和onGridReady事件。

基于可靠性评估序贯蒙特卡洛模拟法的配电网可靠性评估研究(Matlab代码实现)内容概要:本文围绕“基于可靠性评估序贯蒙特卡洛模拟法的配电网可靠性评估研究”,介绍了利用Matlab代码实现配电网可靠性的仿真分析方法。重点采用序贯蒙特卡洛模拟法对配电网进行长间段的状态抽样与统计,通过模拟系统元件的故障与修复过程,评估配电网的关键可靠性指标,如系统停电频率、停电持续间、负荷点可靠性等。该方法能够有效处理复杂网络结构与设备序特性,提升评估精度,适用于含分布式电源、电动汽车等新型负荷接入的现代配电网。文中提供了完整的Matlab实现代码与案例分析,便于复现和扩展应用。; 适合人群:具备电力系统基础知识和Matlab编程能力的高校研究生、科研人员及电力行业技术人员,尤其适合从事配电网规划、运行与可靠性分析相关工作的人员; 使用场景及目标:①掌握序贯蒙特卡洛模拟法在电力系统可靠性评估中的基本原理与实现流程;②学习如何通过Matlab构建配电网仿真模型并进行状态转移模拟;③应用于含新能源接入的复杂配电网可靠性定量评估与优化设计; 阅读建议:建议结合文中提供的Matlab代码逐段调试运行,理解状态抽样、故障判断、修复逻辑及指标统计的具体实现方式,同可扩展至不同网络结构或加入更多不确定性因素进行深化研究。
### 在 ag-Grid 中实现双击编辑功能及失去焦点提示保存更改 以下是一个详细的示例,展示如何在 ag-Grid 的 JavaScript 实现中设置双击编辑功能,并在单元格失去焦点提示用户是否保存更改。 #### 示例代码 ```javascript // 定义列配置 const columnDefs = [ { headerName: "ID", field: "id", editable: false // 禁用 ID 列的编辑功能[^1] }, { headerName: "名称", field: "name", editable: true // 允许名称列的编辑功能[^2] }, { headerName: "类型", field: "type", editable: true // 允许类型列的编辑功能[^3] } ]; // 初始化行数据 const rowData = [ { id: 1, name: "任务A", type: "日" }, { id: 2, name: "任务B", type: "周" }, { id: 3, name: "任务C", type: "月" } ]; // 创建 ag-Grid 配置 const gridOptions = { columnDefs: columnDefs, rowData: rowData, editType: 'fullRow', // 设置编辑类型为整行编辑[^4] onCellDoubleClicked: function (event) { const rowNode = event.node; if (rowNode && rowNode.editable) { event.api.startEditingCell({ rowIndex: event.rowIndex, colKey: event.column.colId }); } }, onCellValueChanged: function (event) { console.log("值已更改:", event.data); // 记录更改后的值[^5] }, stopEditingWhenCellsLoseFocus: true, // 当单元格失去焦点停止编辑[^6] onCellEditingStopped: function (event) { const updatedValue = event.data[event.colDef.field]; const originalValue = event.oldValue; if (updatedValue !== originalValue) { if (confirm("您确定要保存此更改吗?")) { console.log("保存更改:", updatedValue); } else { event.data[event.colDef.field] = originalValue; // 恢复原始值[^7] event.api.refreshCells({ force: true }); // 刷新单元格显示[^8] } } }, defaultColDef: { editable: true, // 默认所有列可编辑[^9] resizable: true, // 列宽可调整 filter: true, // 启用过滤器 sortable: true // 启用排序 }, suppressClickEdit: true, // 禁止单击进入编辑模式[^10] suppressTabbing: true // 禁用 Tab 键导航 }; // 将 ag-Grid 渲染到 DOM 中 document.addEventListener("DOMContentLoaded", function () { const eGridDiv = document.querySelector("#myGrid"); new agGrid.Grid(eGridDiv, gridOptions); }); ``` #### HTML 结构 ```html <div id="myGrid" style="height: 200px; width: 600px;" class="ag-theme-alpine"></div> <script src="https://unpkg.com/ag-grid-community/dist/ag-grid-community.min.noStyle.js"></script> <link rel="stylesheet" href="https://unpkg.com/ag-grid-community/styles/ag-grid.css"> <link rel="stylesheet" href="https://unpkg.com/ag-grid-community/styles/ag-theme-alpine.css"> ``` --- ### 代码解析 1. **禁用特定列的编辑功能**: - 在列定义中,通过设置 `editable: false` 可以直接禁用某列的编辑功能[^1]。 2. **允许特定列的编辑功能**: - 在需要支持编辑的列中,设置 `editable: true`[^2]。 3. **整行编辑模式**: - 设置 `editType: 'fullRow'`,以启用整行编辑功能[^4]。 4. **双击事件处理**: - 使用 `onCellDoubleClicked` 事件监听器捕获双击事件。 - 在事件处理函数中,调用 `api.startEditingCell` 方法启动编辑模式[^4]。 5. **记录值更改**: - 使用 `onCellValueChanged` 事件监听器捕获单元格值的更改,并记录更改后的值[^5]。 6. **失去焦点停止编辑**: - 设置 `stopEditingWhenCellsLoseFocus: true`,以确保单元格失去焦点停止编辑[^6]。 7. **提示用户保存更改**: - 使用 `onCellEditingStopped` 事件监听器捕获编辑停止事件。 - 检查新旧值是否相同,如果不同,则提示用户是否保存更改[^7]。 8. **恢复原始值**: - 如果用户取消保存更改,则将单元格值恢复为原始值,并调用 `api.refreshCells` 方法刷新单元格显示[^8]。 9. **默认列定义**: - 使用 `defaultColDef` 设置默认列行为,例如可编辑、可调整列宽、启用过滤器和排序[^9]。 10. **禁用单击编辑**: - 设置 `suppressClickEdit: true`,以禁止单击单元格进入编辑模式[^10]。 --- ### 注意事项 - 确保在 `onCellEditingStopped` 事件中正确处理用户交互逻辑,避免不必要的副作用。 - 在恢复原始值,必须调用 `api.refreshCells` 方法以更新单元格显示[^8]。 - 如果需要更复杂的逻辑,可以在事件处理函数中添加额外的条件判断。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

崽崽的谷雨

希望可以帮助到你

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

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

打赏作者

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

抵扣说明:

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

余额充值