我正在使用 material-table 并且我决定实现 Google 具有的“预先输入”类型的功能。像这样的东西:

javascript - 提前输入/预测测试功能有问题-LMLPHP

为了实现这一点,我用自己的组件包装了 MTableEditField 组件,如下所示:

import React, { useState } from "react";
import { MTableEditField } from "material-table";

const CustomTableEditField = props => {
  const [rawValue, setRawValue] = useState(props.value);
  const [suggestedValue, setSuggestedValue] = useState("asdasda");

  const handleOnChange = value => {
    // ... logic to find best match and set state values
  };

  return (
    <MTableEditField
      inputProps={
        suggestedValue
          ? {
              style: {
                backgroundColor: "#557D92",
                color: "white",
                padding: "offset"
              }
            }
          : {}
      }
      {...props}
      value={suggestedValue ?? rawValue}
      onChange={handleOnChange}
    />
  );
};

export default CustomTableEditField;

问题是当有一个值时,它看起来像:

javascript - 提前输入/预测测试功能有问题-LMLPHP

如果有比赛,我不希望它改变整个背景。我希望它保留已经输入的文本,并在其中附加建议的文本。

我研究了渐变,它被视为可以调整大小的图像,但我无法渲染任何东西。

这完全可以做到,还是我只是在浪费时间?

编辑

Stackblitz

最佳答案

不确定 MTableEditField 的自定义,但是您可以尝试通过编写自己的组件来执行以下操作。

1) 主要思想是拆分单词(原始和建议)并将它们分开 span 元素,以便我们可以完全控制样式。

2) 将 span 元素包裹在 div 中,并编写自己的 onChange 事件处理程序。

PS:这是示例代码,需要微调代码。

查看 working sample on stackblitz

import React, { useState } from "react";

const dict = ['apple', 'mango', 'berry'];

const CustomTableEditField = props => {
  const [rawValue, setRawValue] = useState("");
  const [suggestedValue, setSuggestedValue] = useState("");

  const handleKeyPress = (event) => {
    // console.log('key: ', event.key);
    let new_raw;
    if (event.key === "Backspace") {
      new_raw = rawValue.slice(0, rawValue.length - 1);
    } else {
      new_raw = `${rawValue}${event.key}`;
    }
    setRawValue(new_raw);

    const suggested = dict.find(word => word.startsWith(new_raw));
    if (suggested && new_raw) {
      setSuggestedValue(suggested.slice(new_raw.length));
    } else {
      setSuggestedValue("");
    }
  }

  return (
    <div
      tabIndex="0"
      onKeyDown={handleKeyPress}
      style={{border: '1px solid green', height: '30px', color: 'black'}}>
      <span>{rawValue}</span>
      {suggestedValue && (
          <span
            style={{backgroundColor: "#557D92",
            color: "white",
            padding: "offset"}}> {suggestedValue} </span>
      )}
      </div>
  );
};

export default CustomTableEditField;

关于javascript - 提前输入/预测测试功能有问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60340215/

10-14 21:13
查看更多