我正在建立一个使用Reaction的网站,在那里用户应该能够回答问题.其中一些问题可能有多个答案,所以我希望网站动态添加和删除这些答案的输入字段.这里有一个要澄清的例子:最初,一个问题只有一个输入字段可见,但当用户开始在第一个输入字段中键入时,应该出现第二个(空)输入字段,当他开始在第二个输入字段中键入时,应该出现第三个输入字段,依此类推.

添加输入字段已经很好了,但是空的输入字段(当答案被删除时)也应该被删除,这就是问题的开始.

我使用map函数根据"Answers"数组呈现答案:

{answers.map((answer, index) => (
                      <div key={index}>
                        <label htmlFor={`answer${index + 1}`}>{`answer ${index + 1}:`}</label>
                        <input
                          type="text"
                          className="w-full h-10 px-3 text-base placeholder-gray-600 border rounded-            lg focus:shadow-outline"
                          onChange={(e) => handleAnswerChange(index, e.target.value)}
                        />
                      </div> 
                    ))}

这是"handleswerchange"函数:

const [answers, setAnswers] = useState(['']);

  const handleAnswerChange = (index: number, value: string) => {
    console.log('Index:', index);
    console.log('Value:', value);

    setAnswers(prev => {
      const updatedAnswers = [...prev];
      updatedAnswers[index] = value;

      if (value.trim() === '') {
        updatedAnswers.splice(index, 1);
      }
  
      if (index === updatedAnswers.length - 1 && value.trim() !== '') {
        updatedAnswers.push('');
      }
      return updatedAnswers;
    })

    setAnswers(prev => [...prev]);
  };

  useEffect(() => {
    console.log(answers);
  }, [answers]);

如您所见,我正在记录‘Answers’array.日志(log)显示逻辑工作正常,并且在删除答案时数组会正确更新,但UI不会反映这些更改.

例如:当我输入‘a’、‘z’、‘e’、‘r’时,有5个输入域可见.其中4个包含输入,其中一个(最后一个)为空.这是正确的,也是我所期望的.当我删除第二个输入字段(在本例中为‘z’)的内容时,应该删除该输入字段.记录的数组是[‘a’,‘e’,‘r’,‘’].这也是正确的,但UI不反映该array.

相反,现在为空的第二个输入字段保持可见,末尾的空输入字段被删除.我try 使用索引和答案的组合作为div的键属性,try 使用uuidV4生成唯一键,try 重写‘handleswerChange’函数大约12次,...似乎什么都不管用,所以我希望你们中的一个能帮我解决问题.提前谢谢!

推荐答案

您遇到的唯一问题是在input元素中省略了value属性.当然,如果不跟踪input元素中的状态,它就不会起作用.

以下是我的完整代码,您也可以在一些Reaction操场上使用它.

import React, { useState } from 'react';

export function App(props) {
  const [answers, setAnswers] = useState(['']);

  const handleAnswerChange = (index, value) => {
    setAnswers((prev) => {
      const updatedAnswers = [...prev];
      updatedAnswers[index] = value;

      if (value.trim() === '') {
        updatedAnswers.splice(index, 1);

        console.log(updatedAnswers);

        return updatedAnswers;
      }

      if (index === updatedAnswers.length - 1 && value.trim() !== '') {
        updatedAnswers.push('');

        return updatedAnswers;
      }

      return updatedAnswers;
    });
  }

  return answers.map((answer, index) => (
    <div key={index}>
      <label htmlFor={`${answer}${index + 1}`}>{`answer ${index + 1}:`}</label>
      <input
        type="text"
        onChange={(e) => handleAnswerChange(index, e.target.value)}
        value={answer}
      />
    </div> 
  ));
}

离开问题本身,当你只有1个输入时,你也会遇到一个错误,只需在这input个输入上写上"空格"字符,因为你会删除输入.

这就是说,你应该稍微修改一下handleAnswerChange的逻辑:

  const handleAnswerChange = (index, value) => {
    setAnswers((prev) => {
      const updatedAnswers = [...prev];
      updatedAnswers[index] = value;

      if (index === updatedAnswers.length - 1 && value.trim() !== '') {
        updatedAnswers.push('');

        return updatedAnswers;
      }

      if (index !== updatedAnswers.length - 1 && value.trim() === '') {
        updatedAnswers.splice(index, 1);

        console.log(updatedAnswers);

        return updatedAnswers;
      }

      return updatedAnswers;
    });
  }

Reactjs相关问答推荐

从app.js导航,这是在BrowserRouter包装之外

Formik验证不适用于物料UI自动完成

梅X折线图无响应

在REACT-RUTER-DOMV6中使用通用页面包装组件有问题吗?

如何使用useState响应快速/顺序状态更新

是否为Reaction中未使用的组件生成Tailwincss样式?

如何使用react-router-dom保护嵌套在受保护路由中的嵌套路由?

如果我使用 formik,如何在嵌套对象中写入正确的值?

onChange in useEffect 的最佳实践

如何到达类组件中的状态?

臭名昭著的测试未包含在 act(...) 中

如何初始化 redux 全局存储 preloadedState

使用 react-markdown 组件时 Tailwind CSS 的问题

react 测试显示错误的结果

react 本机日历

谁能根据经验提供有关 useEffect 挂钩的更多信息

如果 URL 已随功能组件更改,则取消刷新

为什么我在运行一些 npm react 命令时会收到这些警告?

如何通过 Material Ui 设计将 Accordion 添加到您的 React 项目中?

axios post方法中的请求失败,状态码为500错误