这是我的代码

  const [messages, setMessages] = useState(messagesList);

  const [addMessage, setAddMessage] = useState({
    messageSent: '',
  });

  const addMessageChange = (event) => {
    event.preventDefault();
    const fieldName = event.target.getAttribute("name");
    const fieldValue = event.target.value;
    const addMessageData = { ...addMessage };
    addMessageData[fieldName] = fieldValue;
    setAddMessage(addMessageData);
  };

  const addMessageSubmit = (event) => {
    event.preventDefault();
    const newMessage = {
      id: 18,
      sender: "Aakanksha Mantri",
      textMessage: addMessage.messageSent,
      sentbyUser: true,
      time: "00:45",
    };

    const newMessages = [...messages, newMessage];
    setMessages(newMessages);
  };
<div className="chat-body">
        {messagesList.map((messageData) => (
          <div className={messageData.sentbyUser ? 'message-received' : 'message-sent'}>
            <p className="message-name">{messageData.sender}</p>
            {messageData.text} <span className="message-time">{messageData.time}</span>
          </div>
        ))}
      </div>
<form onSubmit={addMessageSubmit}>
  <div className="message-input">
    <input type="text" placeholder="Type a message" name="messageSent" onChange={addMessageChange}></input>
    <button type="submit">Send!</button>
  </div>
</form>

在提交时,我希望将输入的消息添加到包含虚拟数据且已导入的json文件中.此外,聊天正文div应该反映在表单提交时所做的更改.

推荐答案

问题是您正在更新本地messages状态,但呈现导入的静态JSON数据.

const [messages, setMessages] = useState(messagesList);

...

<div className="chat-body">
  {messagesList.map((messageData) => (
    <div className={messageData.sentbyUser ? 'message-received' : 'message-sent'}>
      <p className="message-name">{messageData.sender}</p>
      {messageData.text} <span className="message-time">{messageData.time}</span>
    </div>
  ))}
</div>

该组件应该映射messages状态.不要忘记映射元素上的有效react 键.

<div className="chat-body">
  {messages.map((messageData) => (
    <div
      key={messageData.id} // <-- or any unique property
      className={messageData.sentbyUser
        ? 'message-received'
        : 'message-sent'
      }
    >
      <p className="message-name">{messageData.sender}</p>
      {messageData.text} <span className="message-time">{messageData.time}</span>
    </div>
  ))}
</div>

搁置一边

我强烈建议在组件从以前的状态更新状态时使用functional state updates.

const addMessageChange = (event) => {
  event.preventDefault();

  const { name, value } = event.target;

  setAddMessage(message => ({
    ...message,
    [name]: value
  }));
};

const addMessageSubmit = (event) => {
  event.preventDefault();

  const newMessage = {
    id: 18,
    sender: "Aakanksha Mantri",
    textMessage: addMessage.messageSent,
    sentbyUser: true,
    time: "00:45",
  };

  setMessages(messages => [...messages, newMessage]);
};

Reactjs相关问答推荐

我想将状态设置为true,直到每一张卡片都生成并在多姆中呈现

条件索引路由

安装后未渲染tailwind

在Reaction常量函数中未更新状态变量

React中的useEffect钩子

Redux工具包-useSelector如何通过Reducer引用InitialState?

useEffect firebase 清理功能如何工作?

我从 S3 存储桶下载图像时收到错误

在 golang 服务器中刷新或直接 url 路径时响应 404

将 useRef 与 useImperativeHandle 一起使用时,React 不会重新渲染

在Vite React上获取Amplify的环境变量

useState数组不更新

将props 传递给 NextJS 布局组件

如何从 React Redux store 中删除特定项目?

如何将值从下拉列表传递到 select 上的输入?响应式JS

错误:无效挂钩调用.钩子只能在函数组件的主体内部调用.使用 next/router 时

如何使用 useEffect 和 if 语句 React

React Hooks 表单在日志(log)中显示未定义的用户名

我在使用 Elements of stripe 时使用 React router v6

在 redux 状态更改时更新react 按钮禁用状态