反应更新列表不是一个函数

卡齐姆

我想更新chatList, 当用户按下按钮时newChat()调用方法并调用 API。此 API 发回所有旧聊天 + 新聊天。但是当我调用它时,我得到一个错误TypeError: chatList.map is not a function错误是因为我正在添加完整的聊天记录吗?当我按下按钮时,如何让 chatList 自行更新,我曾尝试使用 UseEffect 进行过一些操作,但是这也不起作用。

那么如何在按下按钮时使旧的和新的聊天显示在列表中。

import React, { useState, useEffect } from "react";
import { GroupchatCard } from "./GroupchatCard";
import ChatEmpty from "./ChatEmpty";
import axios from "axios";
function ChatSide() {


  const [lengthChats, setLengthChats] = useState(0);
  const [isChatEmpty, setIsChatEmpty] = useState(true);
  const [chatList, setChatList] = useState([]);

  const [messagesnumber, setMessagesnumber] = useState("");
  const getMessagesnumber = () => {
    var zuffalszahl = Math.floor(Math.random() * 5);
    setMessagesnumber(zuffalszahl);
  };
  // This should load all the chats inital at the beginning
  useEffect(() => {
 
     getChats();
    
  }, []);

   const getChats = () => {
    axios
    .get("http://localhost:4000/chat/rooms", { } )
    .then((res) => {
      if (res.status === 200) {
        if(res.data.length >= 1) {
          setLengthChats(res.data.length)
          setChatList(...chatList, res.data)
          setIsChatEmpty(false);
          localStorage.removeItem('chatList')
          localStorage.setItem('chatList', JSON.stringify(res.data))
        }
        
      }
    })
    .catch((error) => {
      console.log(error);
    });
   }
   
  // If user clicked on the plus add all chats again to the list
 useEffect(() => {
 
    // Check if some chats are saved in the local storage
     if(lengthChats > 1) {
     console.log("working only if the button is clicked")
     }
    
  }, [lengthChats]);
  /**
   * Gernate a new Chat
   */
  const newChat = () => {
    console.log(lengthChats)
    if (lengthChats < 3) {
      axios
      .get("http://localhost:4000/chat/add", { } )
      .then((res) => {
        if (res.status === 200) {
          console.log(res.data)
          if(res.data.length >= 1) {

            setLengthChats(res.data.length)
            setChatList(...chatList, res.data)
            setIsChatEmpty(false);
            localStorage.removeItem('chatList')
            localStorage.setItem('chatList', JSON.stringify(res.data))
          }
          
        }
      })
      .catch((error) => {
        console.log(error);
      });
    }
    else {
      window.alert("Du kannst nur maximal drei Chats offen haben");
    }
  }

  window.addEventListener("load", getMessagesnumber);
  return (
    <div>
      <div class="row m-1 mb-5 h-100" style={{ alignItems: "center" }}>
        <div class="col-md-11" >
          Chats
            </div>
        <div class="col-md-1" onClick={newChat}>
          <i class="fas fa-plus-circle" style={{ fontSize: "2rem", color: "#5869ff" }}></i>
        </div>
      </div>
      <div class="row mb-2">

      </div>
      <div class="row">
        <div class="col-md-12">
          {
            isChatEmpty === true &&
            <ChatEmpty></ChatEmpty>
          }
          {
            isChatEmpty === false &&
            <div className="list-group">

              {chatList.map((d, i) => (
                <GroupchatCard messagesnumber={messagesnumber} chatname={d.chatname} chatid={d.id} chatimage={d.image} />
              ))
              }

            </div>
          }


        </div>
      </div>
    </div>
  );
}

export default ChatSide;

我发现是因为这个useEffect但是我还能怎么说当组件第一次加载时做这个初始提交,这样我们就有了所有的值,如果用户点击一个按钮,就不useEffect要再考虑这个了。

  useEffect(() => {
 
     getChats();
    
  }, []);
多米诺987

您需要将聊天列表设置为一个数组:

setChatList(prevList => [...prevList, ...res.data])

它接受一个函数来传递当前的聊天记录,现在你只需要用 [] 包裹起来。

setChatList(...chatList, res.data)  // This fails

这将数组中的每个项目作为参数 (the ...)传递因此将选择第一个项目,因为第一个参数将设置为该值。这不是数组(只有项目),所以 .map 失败

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

反应typerror,不是一个函数

反应:.map不是一个函数

反应this.setState不是一个函数

反应:_this2.setState不是一个函数

反应错误更改 this.setState 不是一个函数

反应-TypeError:jokes.map不是一个函数

反应-TypeError:_this.setState不是一个函数

反应:this.props.posts.map不是一个函数

反应:this.setState 不是一个函数

data.map 不是一个函数反应

反应TypeError:lists.map不是一个函数

反应 this.state.addroom.map 不是一个函数

每当我尝试创建一个新的反应函数时,Undefined 都不是一个函数

TypeError:this.props.data.map不是一个函数,但是data是一个列表

反应流通过 Json 来查找匹配:.find 不是一个函数

TypeError:(0,_reactNavigation.default)不是一个函数。反应本机

反应未捕获的TypeError:this.setState不是一个函数

反应:尝试登录时this.setState不是一个函数

角2反应形式错误-TypeError:this.form.get不是一个函数

TypeError:this.props.propName.map不是一个函数反应js

反应本地错误,因为this.setState不是一个函数

反应测试-TypeError:localStorage.getItem不是一个函数

反应不记得firebase状态错误this.setState不是一个函数

如何在反应中设置条件函数以影响一个组件而不是更大的组件

反应TypeError:this.state.List.map不是一个函数

函数返回一个包含两个反向副本而不是三个的列表

如何从一个组件访问状态值到另一个文件中的另一个函数(不是组件)?反应 js

返回一个列表而不是 IQueryable

反应状态更新仅更新一个元素