收藏
回答

调用的setData为什么不更新?

为什么我设置了setData,数据不更新?我使用调试工具看到AppData里也没更新?setData到底如何使用?

send方法中的this也正常的啊

send(e) {
  let msg = {};
  this.data.messageList.push(msg, { role: 'placeholder' });
  updateMsgMap(this.data.messageList);
  this.setData({
    messageList: this.data.messageList,
    title: '正在输入...'
  }, () => this.scrollToBottom());
  
  sending = true;
  request({
    method: 'POST',
    path: `xxx`,
    data: payload,
  }).then(res => {
    this.data.messageList.pop();
    const { u1, u2 } = res;
    u1.suggest = u2.content.suggestion;
    let last = this.data.messageList.pop();
    last = {...last, ...u1};
    this.data.messageList.push(last);
    if (u2.type === 'audio') {
      u2.audio_play = false;
    };
    this.data.messageList.push(u2);
    if (u2.content.isFinish) {
      this.data.messageList.push({ role: "summary" });
    }
    updateMsgMap(this.data.messageList);
    this.setData({
      messageList: this.data.messageList,
      title: 'title'
    }, () => this.scrollToBottom())
    sending = false;
  }).catch(err => {
    sending = false;
  })
},


最后一次编辑于  05-14
回答关注问题邀请回答
收藏

5 个回答

  • ʟᴇɪ ¹⁰²⁴
    ʟᴇɪ ¹⁰²⁴
    05-14

    我试了数据写死都没用,这太奇葩了。

    另外补充一下背景信息:这个页面第一次打开调用send都是正常的,当我点了左上角的结束返回调用了redirectTo到另一个页面,然后再点回来后,用小程序插件的wechatSI语音识别后的文本调用send才会出现这种情况。send后没反应,setData无效,但是用输入框手动输入文本调用send可以正常

    05-14
    有用
    回复 1
    • dreamhunter
      dreamhunter
      05-15
      用小程序插件的wechatSI语音识别后的文本调用send才会出现这种情况,打印下确认这种情况是否触发了send方法,IDE可以断点看数据情况
      05-15
      回复
  • dreamhunter
    dreamhunter
    05-14

    this 的指向会随着函数的执行环境而变化。具体来说,this 指向的是函数执行时的上下文对象。为了在函数中使用全局数据,需要将 this 的指向复制到一个变量中,例如 that,这样即使 this 的指向发生了变化,that 仍然指向之前的对象。

    函数中最初位置let that = this,之后用that代替this解决指向变化问题


    05-14
    有用
    回复 3
    • ʟᴇɪ ¹⁰²⁴
      ʟᴇɪ ¹⁰²⁴
      05-14
      this是正确的,没有问题, 箭头函数this不会乱指向吧,如果this不对setData会报错吧。另外我打印出来this也是正确的啊,就是单纯的setData不生效,数据没有更新
      05-14
      回复
    • dreamhunter
      dreamhunter
      05-14回复ʟᴇɪ ¹⁰²⁴
      减少数据量,打印出this.data.messageList 数据确保没有异常数据(undefined,null)
      05-14
      回复
    • ʟᴇɪ ¹⁰²⁴
      ʟᴇɪ ¹⁰²⁴
      05-14
      都干过,我一直都是只有两三条数据。打印出this.data.messageList里面都是预期的{}对象,但是开发工具里的appData里就是和this.data.messageList不一致
      05-14
      回复
  • o0o有脾气的酸奶
    o0o有脾气的酸奶
    05-14
    let t = this, msg = {};
    然后send方法里其他地方的this都改成t
    


    05-14
    有用
    回复
  • 那一抹笑😃 穿透阳光
    那一抹笑😃 穿透阳光
    05-14
    request({
    

    在这个上面写一个 let that = this;

    然后把里面的this 换成 that

    05-14
    有用
    回复
  • Mr.Zhao
    Mr.Zhao
    05-13

    用最少的代码复现吗 ,你说设置,你把数据写死呢

    05-13
    有用
    回复 4
    • ʟᴇɪ ¹⁰²⁴
      ʟᴇɪ ¹⁰²⁴
      05-14
      没理解你说的啥意思
      05-14
      回复
    • Mr.Zhao
      Mr.Zhao
      发表于移动端
      05-14回复ʟᴇɪ ¹⁰²⁴
      this.setData({a:1}) 这样写死,如果不生效就是代码没执行,一行代码一行代码的添加调试信息,自己排查
      05-14
      回复
    • ʟᴇɪ ¹⁰²⁴
      ʟᴇɪ ¹⁰²⁴
      05-14
      打印出来的结果是正确的,但是就是不渲染,看了看调试工具中appData里的messageList确实没加进去,这个setData到底是什么原理?
      console.log(this.data.messageList.length)
      我的setData里有另一个字段this.setData({messageList, title}), title可以生效
      05-14
      回复
    • Mr.Zhao
      Mr.Zhao
      发表于小程序端
      05-14回复ʟᴇɪ ¹⁰²⁴

      别人看不到你的结果啊

      05-14
      回复
登录 后发表内容