项目需要做个聊天界面,聊天内容使用scrollView显示。进入页面出现的数据内容都很正常并且滚动到底部了。但是一旦发送新内容后,新数据会显示在旧内容最后一条上面。用了scrollTop和scrollIntoView都是这样。
是不是我数据渲染的问题呢?应该如何解决呢
下面列出我的部分代码
componentWillMount() { this.getList() }getList = () => { getChatRoomList().then(res => { if (res.data.rtnCode === 0) { this.setState({list: res.data.rtnData, viewId: `A${res.data.rtnData[res.data.rtnData.length - 1].id}`}) } }) }// 点击发送新增内容sendMsg = () => { const { content, userInfo } = this.state; this.setState({sending: true}); if(content.length > 0) { Taro.showLoading() const params = { userId: userInfo.userId, userName: userInfo.nickname, text: content } addChatRoom(params).then((res) => { if(res.data.rtnCode === 0) { // 成功 this.getList() this.setState({content: ''}) } }) Taro.hideLoading() this.setState({sending: false}); } else { Taro.showToast({ title: '请先输入内容', duration: 2000, icon: 'error' }) } }//render 里面<ScrollView id='chat-list' className='list-wrap' scrollY scrollWithAnimation scrollIntoView={this.state.viewId}> {list.length > 0 && list.map((item) => { if (Number(item.userId) === Number(userInfo.userId)) { return ( <View id={`A${item.id}`} className='list-item-right' key={item.id}> <Image src={person} className='imgIcon-person'></Image> <Text className='list-name'>{item.userName}</Text> <View className='list-content'>{item.text}</View> <View className='list-time'>{item.createTime}</View> </View> ); } return ( <View id={`A${item.id}`} className='list-item' key={item.id}> <Image src={person} className='imgIcon-person'></Image> <Text className='list-name'>{item.userName}</Text> <View className='list-content'>{item.text}</View> <View className='list-time'>{item.createTime}</View> </View> ); })} </ScrollView>
根据您提供的代码和问题描述,看起来您在更新scrollView中的数据时遇到了问题。在发送新内容后,新数据会显示在旧内容最后一条上面,这是因为您在更新数据时没有清除旧数据,而是直接将新数据添加到旧数据的末尾。
要解决这个问题,您需要在更新数据时清除旧数据,然后再添加新数据。您可以通过以下方式实现:
以下是修改后的代码示例:
componentDidMount() { this.getList()}getList = () => { getChatRoomList().then(res => { if (res.data.rtnCode === 0) { this.setState({list: res.data.rtnData, viewId: `A${res.data.rtnData[res.data.rtnData.length - 1].id}`}) } })}sendMsg = () => { const { content, userInfo } = this.state; this.setState({sending: true}); if(content.length > 0) { Taro.showLoading() const params = { userId: userInfo.userId, userName: userInfo.nickname, text: content } addChatRoom(params).then((res) => { if(res.data.rtnCode === 0) { // 清空scrollView中的数据 this.setState({list: []}) this.getList() this.setState({content: ''}) } }) Taro.hideLoading() this.setState({sending: false}); } else { Taro.showToast({ title: '请先输入内容', duration: 2000, icon: 'error' }) }}
在render方法中,您可以保持不变。这样,每次发送新内容时,scrollView中的旧数据将被清除,然后添加最新的列表数据。这样就可以解决新数据显示在旧内容最后一条上面的问题。
taro版本: 3.0.26 @antmjs/vantui版本: 3.3.6 taro项目中引入 @antmjs/vantui 的任何组件, 运行报错, 报错信息 Error: Cannot find module 'react/jsx-runtime'
问题内容: 我的Web应用程序的后端接收来自多个客户端的更新。发生此类更新时,应将其传达给所有其他客户端。 后端更新后,如何启动从服务器到所有Web浏览器客户端的更新? 我正在使用JBoss,JSF和Spring框架。 问题答案: 参见类似的堆栈溢出问题:WebSockets与服务器发送的事件/EventSource 我假设像DarthVader一样,您的前端是某种(通常)无状态的HTML页面。浏
我有一个列结构的熊猫数据帧(df): 此数据框包含例如1月、2月、3月、4月的数据。A、B、C、D是数字列。对于2月份,我想重新计算列A并在数据框中更新它,即对于月份=2月份,A=B C D 我使用的代码: 这运行时没有出现错误,但没有更改2月份A列中的值。在控制台中,它给出了一条消息: 试图在数据帧切片的副本上设置值 尝试使用。loc[row\u indexer,col\u indexer]=改
问题内容: 因此,我正在使用WordPress网站。我在获取用户输入以更新数据库方面有些困难。 JS: PHP(edit-items.php) 每当我尝试更新表时,我都能在前端成功完成此操作,但是在刷新时,数据更改不会停止。检查数据库进一步验证数据是否没有更改…似乎“成功”正在AJAX中传递,但是由于某种原因,它没有更新数据库。 对此有任何见识会有所帮助! *决定 *编辑 以开始使用该方法。一切都
之前name的更新是同步更新的没有问题现在需要走接口,等接口返回后再更新,我试过在这个文件中调用dispath但是调用报错,请问下这种异步的数据该怎么更新
代码如下: 期望触发了事件页面上就更新数据