Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/462.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript。反应雷杜。异步的。在呈现DOM之前,循环未完成_Javascript_Reactjs - Fatal编程技术网

JavaScript。反应雷杜。异步的。在呈现DOM之前,循环未完成

JavaScript。反应雷杜。异步的。在呈现DOM之前,循环未完成,javascript,reactjs,Javascript,Reactjs,我正在开发一个Messagelist组件,其中我正在从外部API提取消息数据。每条消息都包含一个UserId,我将使用它来查询我自己的API以获取更多的用户信息。我将foundUsers列表放在我的redux存储中,并已连接我的组件。在呈现到DOM之前,我的目标是循环遍历每个消息,并用相应用户的名称替换userid 我遇到的问题是,在渲染组件之前,循环似乎没有完成,这给了我一些奇怪的行为 半秒钟后 这是我的密码: render(){ let users = this.prop

我正在开发一个Messagelist组件,其中我正在从外部API提取消息数据。每条消息都包含一个UserId,我将使用它来查询我自己的API以获取更多的用户信息。我将foundUsers列表放在我的redux存储中,并已连接我的组件。在呈现到DOM之前,我的目标是循环遍历每个消息,并用相应用户的名称替换userid

我遇到的问题是,在渲染组件之前,循环似乎没有完成,这给了我一些奇怪的行为

半秒钟后

这是我的密码:

    render(){
    let users = this.props.chatkit.roomUsers
    let userIds = users.map((user) => {
        return user.id
    })
    let roomMessages = this.props.messages
    let messages = []
    for(var i = 0; i < roomMessages.length; i++){
        //create a new field to give each message a unique id
        roomMessages[i].unique = roomMessages[i].senderId
        //create a new field to give each message the avatar from that user
        let matchingUserIndex = userIds.indexOf(roomMessages[i].senderId)
        if(matchingUserIndex >= 0){
            roomMessages[i].avatar = users[matchingUserIndex].avatar
        }

        //review messages
        let previous = {}
        if(i > 0){
            previous = roomMessages[i - 1]
        }
        let currentMessage = roomMessages[i]
        //check if consecutive messages are made by the same user
        if(currentMessage.senderId === previous.senderId && currentMessage.unique === previous.unique){
            //display user name and avatar as an empty string
            messages.push({...currentMessage, unique: "", avatar: ""})
        } else{
            //display the user name
            messages.push({...currentMessage})
        }
    }
    //transform the unique field to contain the name of the user 
    let updatedMessages = []
    for(var j = 0; j < messages.length; j++){
        let matchingIdIndex = userIds.indexOf(messages[j].unique)
        if(matchingIdIndex >= 0 && messages[j].unique !== ""){
            messages[j].unique = users[matchingIdIndex].name
            updatedMessages.push(messages[j])
        } else {
            updatedMessages.push(messages[j])
        }
    }

    let currentChatkitUser = this.props.chatkit.chatUser.id

    return(
        <div>
            {this.props.room && (
                <div 
                    style={{overflow: "scroll", overflowX: "hidden", maxHeight: "70vh"}}
                    ref={this.messageList}
                >
                    <ul style={{listStyle: "none"}} className="p-4 mb-0">
                        {updatedMessages.map((message, index) => {
                            return (
                                <li 
                                    className="mb-1"
                                    key={index}>
                                    <div>
                                        {message.unique && (
                                            <span 
                                                className="d-block font-weight-bold mt-3"
                                                style={{color: "#000323"}}
                                            >
                                                <img 
                                                    src={message.avatar} 
                                                    style={{width: "2.5rem"}}
                                                    className="rounded-circle mr-2"
                                                />
                                                {message.unique}
                                            </span>
                                        )}
                                        <span 
                                            className={message.senderId === currentChatkitUser ? 
                                                "muted-blue text-light rounded d-inline-block ml-5" : "bg-secondary text-light rounded d-inline-block ml-5" 
                                            }
                                            style={{padding:".25rem .5rem"}}
                                        >
                                            {message.text}
                                        </span>
                                    </div>
                                </li>
                            )
                        })}
                    </ul>
                    <TypingIndicator usersWhoAreTyping={this.props.usersWhoAreTyping}/>
                    <div 
                        style={{float: "left", clear: "both"}}
                        ref={this.messagesEnd}>     
                    </div>
                </div>
            )}
        </div>
    )
}
render(){
让用户=this.props.chatkit.roomUsers
让userid=users.map((user)=>{
返回用户id
})
让roomMessages=this.props.messages
让消息=[]
对于(var i=0;i=0){
roomMessages[i].avatar=用户[matchingUserIndex].avatar
}
//查看消息
让上一个={}
如果(i>0){
先前=房间消息[i-1]
}
让currentMessage=roomMessages[i]
//检查连续消息是否由同一用户生成
if(currentMessage.senderId==previous.senderId&¤tMessage.unique==previous.unique){
//将用户名和化身显示为空字符串
messages.push({…currentMessage,唯一:“”,头像:“”)
}否则{
//显示用户名
messages.push({…currentMessage})
}
}
//转换唯一字段以包含用户名称
让updatedMessages=[]
对于(var j=0;j=0&&messages[j].unique!==“”){
消息[j].unique=users[matchingIdIndex].name
updatedMessages.push(消息[j])
}否则{
updatedMessages.push(消息[j])
}
}
让currentChatkitUser=this.props.chatkit.chatUser.id
返回(
{this.props.room&&(
    {updatedMessages.map((消息,索引)=>{ 返回(
  • {message.unique&&( {message.unique} )} {message.text}
  • ) })}
)} ) }
使用state属性(例如loading=true),在初始值处将返回一些加载DOM的呈现。定义一个执行所有循环活动的函数,并在componentwillmount中执行该函数,完成循环后,将loading属性的state设置为false,通过该属性,可以使DOM在render方法中呈现用户列表。(不确定componentwillmount是否已弃用)。

使用状态属性(例如,loading=true),在初始值处将返回一些加载DOM。定义一个执行所有循环活动的函数,并在componentwillmount中执行该函数,完成循环后,将loading属性的state设置为false,通过该属性,可以使DOM在render方法中呈现用户列表。(不确定componentwillmount是否已弃用)。

请向我们展示您的道具和状态的定义。请向我们展示您的道具和状态的定义。