当前位置: 首页 > 知识库问答 >
问题:

前端 - Taro使用scrollView数据更新错行?

夹谷俊远
2023-12-22

Taro使用scrollView数据更新问题

项目需要做个聊天界面,聊天内容使用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>

共有1个答案

曾枫
2023-12-22

根据您提供的代码和问题描述,看起来您在更新scrollView中的数据时遇到了问题。在发送新内容后,新数据会显示在旧内容最后一条上面,这是因为您在更新数据时没有清除旧数据,而是直接将新数据添加到旧数据的末尾。

要解决这个问题,您需要在更新数据时清除旧数据,然后再添加新数据。您可以通过以下方式实现:

  1. 在发送新内容之前,先清空scrollView中的数据。
  2. 发送新内容后,获取最新的列表数据,并将其添加到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中的旧数据将被清除,然后添加最新的列表数据。这样就可以解决新数据显示在旧内容最后一条上面的问题。

 类似资料:
  • 问题内容: 我的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但是调用报错,请问下这种异步的数据该怎么更新

  • 全部的 只是想看看用表单中提交的数据更新数据库行的最佳选项是什么。我理解Laravel更新查询生成器,但是我在如何获取表单数据,然后执行该查询方面遇到了困难。相对较新的Laravel:)这是我想出的,只是从我的PHP经验和逻辑: 我曾试图将查询放入一个函数中,然后让表单操作成为函数: 正如我所说,主要问题是试图让命名的表单对象成为更新行的对象。我有两个文本输入字段,分别命名为“body”和“not