在输入中键入的每个字母都在引起React QueryBuilder中的重新启动组件

发布于 2025-02-07 05:33:36 字数 333 浏览 1 评论 0 原文

我使用的是用材料图的React查询构建器,并且在Valueeditor中发现了一个错误,在Textfield中,每个键入的字母都会引起重新启动。

这是使用valueeditor中的常规输入的同一事物的代码盒示例。 https://codesandbox.io/s/srcy/s/oditj?file=/src/src/src/ app.tsx

有人知道如何解决此问题? 我很感谢任何类型的帮助 谢谢

I'm using react query builder with MaterialUI and I found a bug in ValueEditor where each typed letter in TextField is causing rerendering.

Here is codesanbox example of same thing using regular input in ValueEditor.
https://codesandbox.io/s/oditj?file=/src/App.tsx

Anyone has any idea how to fix this problem?
I would appreciate any type of help
Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

葬花如无物 2025-02-14 05:33:37

只需在 app 组件之外移动 valueeditor 组件,因为它是在每个“应用”渲染中重新创建的,这会触发另一个渲染。

之前:

  const App = () => {
  const [query, setQuery] = useState<RuleGroupType>({
    id: 'root',
    combinator: 'and',
    rules: [],
  });

  const ValueEditor = ({ handleOnChange, value }: ValueEditorProps) => (
    <input
      type="text"
      onChange={(e) => handleOnChange(e.target.value)}
      value={value}
    />
  );

  return (
    <QueryBuilder
      fields={[{ name: 'test', label: 'Test' }]}
      controlElements={{ valueEditor: ValueEditor }}
      onQueryChange={(q) => setQuery(q)}
      query={query}
    />
  );
};

之后:

const ValueEditor = ({ handleOnChange, value }: ValueEditorProps) => (
  <input
    type="text"
    onChange={(e) => handleOnChange(e.target.value)}
    value={value}
  />
);

const App = () => {
  const [query, setQuery] = useState<RuleGroupType>({
    id: "root",
    combinator: "and",
    rules: []
  });

  return (
    <QueryBuilder
      fields={[{ name: "test", label: "Test" }]}
      controlElements={{ valueEditor: ValueEditor }}
      onQueryChange={(q) => setQuery(q)}
      query={query}
    />
  );
};

演示:

Just move the ValueEditor component outside the App component because it's being re-created in each "App" render, which triggers another render.

Before:

  const App = () => {
  const [query, setQuery] = useState<RuleGroupType>({
    id: 'root',
    combinator: 'and',
    rules: [],
  });

  const ValueEditor = ({ handleOnChange, value }: ValueEditorProps) => (
    <input
      type="text"
      onChange={(e) => handleOnChange(e.target.value)}
      value={value}
    />
  );

  return (
    <QueryBuilder
      fields={[{ name: 'test', label: 'Test' }]}
      controlElements={{ valueEditor: ValueEditor }}
      onQueryChange={(q) => setQuery(q)}
      query={query}
    />
  );
};

After:

const ValueEditor = ({ handleOnChange, value }: ValueEditorProps) => (
  <input
    type="text"
    onChange={(e) => handleOnChange(e.target.value)}
    value={value}
  />
);

const App = () => {
  const [query, setQuery] = useState<RuleGroupType>({
    id: "root",
    combinator: "and",
    rules: []
  });

  return (
    <QueryBuilder
      fields={[{ name: "test", label: "Test" }]}
      controlElements={{ valueEditor: ValueEditor }}
      onQueryChange={(q) => setQuery(q)}
      query={query}
    />
  );
};

Demo: https://codesandbox.io/s/value-editor-rerendering-forked-jrn7pe?file=/src/App.tsx

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文