如何确定用户是否在react中的输入字段中输入了任何值.

我试图实现的是,当用户在卡片中的一个输入字段中输入文本/整数,并且不单击保存按钮时,我希望在卡片周围显示一个边框.

因此,应该将边框添加到包含至少一个未保存的输入字段以及已更改的输入字段的卡中.

我正在使用下面链接中提到的动态表单.

这是我的动态表单的 struct 链接(示例代码):

Example Dynamic form link

动态表单是一个表单重复器,当我点击"添加新行"按钮时.新卡将添加到react页面.

这张新卡将有一组相同的字段和相同的默认值.当用户更改卡中的任何输入字段时.需要在卡片上添加边框.如果用户单击"保存"按钮,则应保存输入字段.

当对一张卡的单个输入字段进行更改时,该卡实际上是一个边框,但是当我添加一张新卡时.带有未保存输入字段的旧卡的边框将被删除.

我已经试着解决这个问题一周了.我没有使用formik或react-hook表单.我正在使用react bootstrap 库.

当用户将数据输入到输入字段时,我发现很难更改卡的边框.

我使用三元语句来判断字段是否更改.

我使用的useState钩子如下:

const [isFieldChanged, setisFieldChanged] = useState(false);
I am using handleClick function this to set useState variable:
    const handleClick = () => {
        setisFieldChanged(true);
    };

这些是所有字段,这是我设置默认值的方式:

    const [inputFields, setInputFields] = useState([
        {
            fieldName: "",
            label: "",
            fieldSet: "",
            cardinality: 0,
            required: false,
            defaultValue: "",
            weight: 0,
        },
    ]);

下面是三元语句的代码:

<Card
    id={`${inputField.id}`}
    className={
    isFieldChanged &&
    index !== 0 &&
    (inputFields.length) <= (index + 1) &&
    (inputField.cardinality !== 0 ||
    inputField.fieldName.length !== 0 ||
    inputField.label.length !== 0 ||
    inputField.fieldSet.length !== 0 ||
    inputField.required !== false ||
    inputField.defaultValue.length !== 0)
    ? " mt-2 border border-warning"
    : " mt-2 "
    }
>

对于每个表单控件,我都将onKeyPress添加到调用handleClick函数中:

<Form.Control
    type="text"
placeholder="fieldName"
    name="fieldName"
    data-cy="name-text-field"
    value={inputField.fieldName}
    onChange={(event) => {
    handleInputChange(index, event);
    }}
    onKeyPress = {(event)=>{
    handleClick(index, event);
}
/>

推荐答案

您需要的是两种不同的状态——一种用于保存,另一种用于当前数据:

const initialState = {
    firstName: "",
    lastName: "",
    age: ""
  };
  const [savedFormData, saveData] = useState(initialState);
  const [currentFormData, setCurrentFormData] = useState(initialState);

在表单中添加onChange事件.控制:

const handleChange = (name, value) => {
    setCurrentFormData((prev) => {
        return { ...prev, [name]: value };
    });
};

...

// in your Form.Control
onChange={(event) =>
    handleChange("firstName", event.target.value)
}

定义何时存在未发送的数据:可以将两种状态相互比较.仅仅说"用户输入的内容不同"是不够的,因为它可以再次删除,所以状态也一样:

 const dataUnsafed =
    JSON.stringify(savedFormData) !== JSON.stringify(currentFormData);

最后,在保存时,必须将当前数据状态复制到已保存的数据状态,并调用API来分发数据:

 const onSave = () => {
    saveData(currentFormData);
    // Call your API here to persist your "savedFormData
  };

使用"DataUnsaed"设置卡的样式,这里我只设置了一个更厚的边框:

<Card className={dataUnsafed ? "border-3" : ""}>...</Card>

https://codesandbox.io/s/busy-architecture-7it9g9

Javascript相关问答推荐

从PWA中的内部存储读取文件

使用续集和下拉栏显示模型属性

格式值未保存在redux持久切片中

点击按钮一次有文本出现和褪色,而不是点击两次?(html,CSS,JavaScript)

如何使onPaste事件与可拖动的HTML元素一起工作?

Eval vs函数()返回语义

为什么客户端没有收到来自服务器的响应消息?

Jest toHaveBeenNthCalledWith返回当前设置的变量值,而不是调用时的值

如何使用Astro优化大图像?

为列表中的项目设置动画

ReferenceError:无法在初始化之前访问setData

react 路由DOM有条件地呈现元素

固定动态、self 调整的优先级队列

我们是否可以在reactjs中创建多个同名的路由

如何调整下拉内容,使其不与其他元素重叠?

递归地将JSON对象的内容上移一级

错误400:当我试图在React中使用put方法时,该字段是必需的

Google OAuth 2.0库和跨域开放程序的问题-策略错误

是否在图表中计算线上的点坐标?

如何导入我在Web Worker创建的函数?