尝试在 MUI Drawer 组件内实现反应同步融合查询构建器组件时,面临多选复选框下拉列表中的闪烁问题

问题描述 投票:0回答:1

我正在尝试在 MUI 抽屉内实现 React Syncfusion 查询生成器。在实现此操作时,我面临 IN 运算符的多选复选框的闪烁问题。

如果我在 MUI 抽屉组件之外实现查询构建器组件,它可以正常工作,不会出现任何闪烁。

我认为这可能是因为两种弹出窗口(MUI 抽屉和多选下拉菜单)之间的冲突。我需要实现同步融合查询生成器组件的多选复选框下拉列表,而 MUI 抽屉内不会出现任何闪烁。

查询生成器 - 子级

import React, { useState, useEffect } from "react"; import { QueryBuilderComponent } from "@syncfusion/ej2-react-querybuilder"; import { complexData } from "./QueryBuilderJSON"; import { Slider } from "@syncfusion/ej2-react-inputs"; import { getComponent } from "@syncfusion/ej2-base"; import { DropDownList, MultiSelect } from "@syncfusion/ej2-react-dropdowns"; let qryBldrObj; export default function QueryBuilderComplexDataBinding() { const [queryJson, setQueryJson] = useState(); let elem; let dropDownObj; let multiSelectObj; let inOperators = ["in", "notin"]; let fieldMode = "DropdownTree"; let separator = "."; let columns = [ { field: "Primary", label: "Primary", columns: [ { field: "age", label: "Age", type: "number" }, { field: "gender", label: "Gender", type: "boolean", values: ["Male", "Female", "Others"], }, { field: "profession", label: "Profession", type: "string" }, ], }, { field: "Amount", label: "Amount", columns: [ { field: "amount", label: "Amount", type: "number", //template to declare it is a range slider template: { create: () => { elem = document.createElement("div"); elem.setAttribute("class", "ticks_slider"); return elem; }, destroy: (args) => { getComponent( document.getElementById(args.elementId), "slider" ).destroy(); }, write: (args) => { let slider = new Slider({ value: !args.values ? 0 : args.values, min: 0, max: 100, type: "MinRange", tooltip: { isVisible: true, placement: "Before", showOn: "Hover", }, change: (e) => { if (qryBldrObj) { qryBldrObj.notifyChange(e.value, args.elements); } }, }); slider.appendTo("#" + args.elements.id); }, }, operators: [ { key: "Equal", value: "equal" }, { key: "Not equal", value: "notequal" }, { key: "Greater than", value: "greaterthan" }, { key: "Less than", value: "lessthan" }, { key: "Less than or equal", value: "lessthanorequal" }, { key: "Greater than or equal", value: "greaterthanorequal", }, ], }, ], }, { field: "PaymentMode", label: "Payment Mode", operators: [ { key: "Equal", value: "equal" }, { key: "Not Equal", value: "notequal" }, { key: "In", value: "in" }, { key: "Not In", value: "notin" }, ], template: { create: () => { debugger; elem = document.createElement("input"); elem.setAttribute("type", "text"); return elem; }, destroy: (args) => { debugger; multiSelectObj = getComponent( document.getElementById(args.elementId), "multiselect" ); if (multiSelectObj) { multiSelectObj.destroy(); } dropDownObj = getComponent( document.getElementById(args.elementId), "dropdownlist" ); if (dropDownObj) { dropDownObj.destroy(); } }, write: (args) => { debugger; const ds = [ "Cash", "Debit Card", "Credit Card", "Net Banking", "Wallet", ]; //returns the position of the first occurrence of a value in a string. //The indexOf() method returns -1 if the value is not found if (inOperators.indexOf(args.operator) > -1) { multiSelectObj = new MultiSelect({ change: (e) => { debugger; if (qryBldrObj) { qryBldrObj.notifyChange(e.value, e.element); } }, dataSource: ds, mode: "CheckBox", placeholder: "Select Transaction", value: args.values, selectAllText: "Select All", unSelectAllText: "unSelect All", showSelectAll: true, }); multiSelectObj.appendTo("#" + args.elements.id); } else { dropDownObj = new DropDownList({ change: (e) => { if (qryBldrObj) { qryBldrObj.notifyChange(e.itemData.value, e.element); } }, dataSource: ds, value: args.values ? args.values : ds[0], }); dropDownObj.appendTo("#" + args.elements.id); } }, }, type: "string", }, ]; return ( <QueryBuilderComponent dataSource={complexData} columns={columns} //rule={importRules} change={fnGetRule} fieldMode={fieldMode} separator={separator} ref={(scope) => { qryBldrObj = scope; }} ></QueryBuilderComponent> ); }

抽屉 - 家长

<Box key="right"> <Drawer anchor="right" open={props.open}> <div> <QueryBuilderComplexDataBinding /> </div> </Drawer> </Box>
请帮我解决这个问题。预先感谢。

reactjs material-ui query-builder syncfusion
1个回答
0
投票
将 ModalProps 属性设置为如下所示的抽屉。

ModalProps={{ disableEnforceFocus: true }}> <QueryBuilderComplexDataBinding />

 
示例链接:

https://stackblitz.com/edit/react-libed6-xifymn?file=QueryBuilder.js,demo.tsx

© www.soinside.com 2019 - 2024. All rights reserved.