收藏
回答

this.setData()输出长度不对?

我用wx.navigateTo传递对象ss_xx,然后在显示的页面打印出来,打印的是正确的两条数据,但是一旦this.setData({ss_xx:ss_xx}),输出之后括号显示的是2,但是一展开就是4条

回答关注问题邀请回答
收藏

2 个回答

  • 再见,电脑崽
    再见,电脑崽
    2022-04-22

    我猜测是没有深度拷贝的原因导致的,尝试对传递的参数做JSON.stringify(ss_xx)处理后再传值。

    如果方便的话,提供一下代码片段来看看。

    2022-04-22
    有用 1
    回复 7
    • Jeannn
      Jeannn
      2022-04-22
      是这样的
      2022-04-22
      回复
    • 再见,电脑崽
      再见,电脑崽
      2022-04-22回复Jeannn
      plate4页面中是否有其他setData在修改这个ss_xx的值。
      2022-04-22
      1
      回复
    • 再见,电脑崽
      再见,电脑崽
      2022-04-22
      你贴一下plate4.js的全部代码
      2022-04-22
      1
      回复
    • Jeannn
      Jeannn
      2022-04-22
      const app=getApp()
      const db = wx.cloud.database()
      Page({
        //页面的初始数据!!!!!!!!!!!!!!
        data: {
          ss_xx:[],
          _ss_xx:[],
          ......
        },
        //生命周期函数--监听页面加载!!!!!!!!!!!!!!
        onLoad: function (options) {
          var that = this;
          console.log("---plate4----");
          var ss_xx = JSON.parse(options.ss_xx);
          console.log('plate4下的ss_xx:',ss_xx);
          that.setData({
            ss_xx:ss_xx
          })
          wx.cloud.callFunction({
            name:'login',
            data:{}
          }).then((res)=>{
            console.log("获取到openid:",res.result.openid);
            db.collection("user").where({
              _openid:res.result.openid
            }).get().then((res)=>{
              // res.data[0]等同数据库看到用户的信息
              console.log("首页登录取到的对应openid的信息:",res.data[0]);
              // Object.assign(target, ...sources)用于组合数据到目的对象,会有覆盖
              app.userInfo=Object.assign(app.userInfo,res.data[0]);
              this.jiazai()
              wx.hideLoading()
              if(app.userInfo._openid==""){
                /*如果没有登录信息则跳转到wd*/
                //wx.switchTab({url:"../my/wd/wd"})
                //如果没有登录信息则提示未登录
                wx.showToast({
                  title: '未登录只可浏览',
                  icon:'none',
                  duration:3000
                })
                wx.navigateTo({
                  url: '../index/index',
                })
              }else{
                //登录上了就监听user
                this.jianting()
                this.setData({
                  jianting:true,
                })
              }
            })
          });
          var systeminfo=wx.getSystemInfoSync()
          //console.log(systeminfo.windowHeight)
          this.setData({
            movehight:systeminfo.windowHeight,
            movehight2:systeminfo.windowHeight-100
          })
        },
        //刷新!!!!!!!!!!!!!!
        shuaxin(){
          this.setData({
            shuaxin:"",
            search:"",
            kong:false
          })
          var shuaxin=true
          this.jiazai(shuaxin)
        },
        //生命周期函数--监听页面初次渲染完成
        onReady: function () {
          //写出一周前的时间戳
          var now=new Date().getTime()//现在的时间
          var yizhou=(now-3600*7000*24)
          console.log("现在:",now)
          console.log("一周:",yizhou)
          this.setData({
            yizhou:yizhou
          })
        },
        //生命周期函数--监听页面显示!!!!!!!!!!!!!!
        onShow: function () {
          this.checkred()
          //这是发帖成功,跳转刷新
          var shuaxin=app.shuaxin
          console.log("onShow的shuaxin为:",shuaxin);
          if(shuaxin){
            this.shuaxin()
            app.shuaxin=false
          }
          console.log('刷新成功:'+app.userInfo._id)
          //这是检测是否登录,开启监听
          if(app.userInfo._id!=""){
            //登录状态
            console.log('进入监听事件')
            if(!this.data.jianting){
              //开启监听
              this.jianting()
              this.setData({
                jianting:true
              })
            }
          }
          //点赞页面返回更新点赞评论浏览收藏状态
          var index=this.data.index
          var ss_xx=this.data.ss_xx
          console.log("此时的data.ss_xx",this.data.ss_xx);
          //console.log("index::::",index)
          if(index>=0){
            ss_xx[index].ss_xx.look=app.ssinfo.looknb
            var loveinfo=app.loveinfo
            var starinfo=app.starinfo
            //console.log("app.loveinfo:",loveinfo)
            if(loveinfo=='true'){
              console.log("返回点赞:",index)
              ss_xx[index].love=true
              app.loveinfo=""
            }else if(loveinfo=='false'){
              console.log("返回取消点赞:",index)
              ss_xx[index].love=false
              app.loveinfo=""
            }
            if(starinfo=='true'){
              console.log("返回收藏:",index)
              ss_xx[index].star=true
              app.starinfo=""
            }else if(starinfo=='false'){
              console.log("返回取消收藏:",index)
              ss_xx[index].star=false
              app.starinfo=""
            }
            ss_xx[index].ss_xx.huifunb=app.ssinfo.plnb
            ss_xx[index].ss_xx.dianzannb=app.ssinfo.lovenb
            ss_xx[index].ss_xx.shoucangnb=app.ssinfo.starnb
            // ss_xx[index].ss_xx.shoucangnb=app.ssinfo.starnb
            this.setData({
              ss_xx:ss_xx,
              index:-1
            })
          }
        }m
        //加载数据(刷新状态下,data内ss_xx数组重新赋值)!!!!!!!!!!!!!!
        jiazai(shuaxin){
          var zuixinorzuire=this.data.zuixinorzuire
          // shuaxin为传给jiazai的参数
          console.log("shuaxin:",shuaxin)
          // shuaxin2为data中的值
          var shuaxin2=this.data.shuaxin
          // 如果shuaxin2中有值,则赋给shuaxin,否则shuaxin还是原来的值
          shuaxin=shuaxin2==""?shuaxin:shuaxin2
          console.log("shuaxin2:",shuaxin2)
          if(shuaxin==true){
            var head=0
            console.log("toushi0")
          }else{
            var head=this.data.ss_xx.length
            console.log("toushih",head)
          }
          /////////////////////
          if(zuixinorzuire==0){
            //按照时间排取消时间限制,
            zuixinorzuire="time"
            var yizhou=0
          }else{
            //按照热度排行
            zuixinorzuire="ss_xx.dianzannb"
            var yizhou=this.data.yizhou
          }
          /////////////////
          //这下面是加载搜索值
          if(shuaxin2!=""){
            var text=this.data.shuaxin
            console.log("text=this.data.shuaxin:",text);
            db.collection('ss').where({
              // name: _name,
              "ss_xx.nr":{
                $regex:'.*'+ text,
                $options: 'i'
              },
              'ss_xx.jubao.1':db.command.lte(9),
              time:db.command.gt(yizhou)
            }).orderBy(zuixinorzuire, 'desc').skip(head).get().then(async(res)=>{
              var ss_xx=this.data.ss_xx
              var xx=await this.read(res.data)
              ss_xx.push.apply(ss_xx,xx)
              this.setData({
                ss_xx:ss_xx,
                kong:true
              })
              //console.log("打印了")
              //wx.hideLoading({})
              return
            })
            return
          }
          // skip跳过指定数量的数据
          console.log("此时的zuiinorzuire是什么:",zuixinorzuire);
          db.collection('ss').where({
              'ss_xx.jubao.1':db.command.lte(9),
              time:db.command.gt(yizhou)
          }).orderBy(zuixinorzuire, 'desc')
          .skip(head).get().then(async(res)=>{
            console.log('这里已经取到了相应的数组',res.data)//这里已经取到了相应的数组
            if(res.data==""){
              this.setData({
                kong:true
              })
              // 阻止下拉刷新
              wx.stopPullDownRefresh({})
              //wx.hideLoading({})
              wx.showToast({
                title: '没有更多了',
                icon: 'none',
                duration: 800
              })
              return
            }else if(shuaxin==true){
              //真刷新状态
              //var ss_xx=res.data
              //var ss_xx=await this.read(res.data)
              var ss_xx=await this.love(res.data)
              var ss_xx=await this.star(res.data)
            }else{
              //加载并加入
              var ss_xx=this.data.ss_xx
              //var xx=await this.read(res.data)
              var xx=await this.love(res.data)
              var xx=await this.star(xx)
              // push.apply(),后一个数组的值push进前一个数组中
              ss_xx.push.apply(ss_xx,xx)
              console.log("此时push.apply之后的ss_xx:",ss_xx);
            }
            console.log("跳出来看此时push.apply之后的ss_xx:",ss_xx);
            //写进本地
            this.setData({
              ss_xx:ss_xx,
              kong:true
            })
            if(shuaxin==true){
              //this.goTop()
              //wx.hideLoading({})
              wx.stopPullDownRefresh({})
              wx.showToast({
                title: '刷新成功',
                icon: 'none',
                duration: 800
              })
            }else{
              //wx.hideLoading({})
            }
          })
        },
        
        //处理点赞数据
        async love(e){
          //console.log(e)
          var l=e.length
          for(var i=0;i<l;i++){
            var yn=e[i].ss_xx.dianzanid.indexOf(app.userInfo._id)
            //console.log(yn)
            if(yn==-1){
              e[i].love=false
            }else{
              e[i].love=true
            }
          }
          return e
        },
         
        //点赞帖子(这里得加index)
        dianzan(e){
          // _id为要点赞的用户的id,id为被点赞的文章的id
          var _id=app.userInfo._id
          var id=e.currentTarget.dataset.id
          var index=e.currentTarget.dataset.index
          console.log("_id:",_id);
          console.log(e.currentTarget.dataset)
          if(_id==""){
            wx.showModal({
              title: '提示',
              content: '登录后才可进行此操作!是否进行授权登录?',
              showCancel:true,
              confirmText:'是',
              confirmColor:'#000000',
              cancelText:'否',
              cancelColor:'#FF4D49',
              success (res) {
              if (res.confirm) {
                console.log('用户点击确定')
                wx.switchTab({url:"../my/wd/wd"})
                return
              } else if (res.cancel) {
                console.log('用户点击取消')
              return
              }
              }
            })
            return
          }
          wx.cloud.callFunction({
            name:"dianzan",
            data:{
              id:id,
              dzrid:_id
            }
          })
          // index表示显示的说说中的index,第一条为0
          var ss_xx=this.data.ss_xx
          if(this.data.ss_xx[index].love){
            ss_xx[index].love=false
            ss_xx[index].ss_xx.dianzannb--
          }else{
            ss_xx[index].love=true
            ss_xx[index].ss_xx.dianzannb++
          }
          this.setData({
            ss_xx:ss_xx
          })
        },
       
        //消息监听
        jianting(){
          console.log("已经登录,开启监听user")
          var _id=app.userInfo._id
          var that=this
          this.watcher = db.collection('user').doc(_id).watch({
            onChange: function(e) {
              console.log('监听user数据变化:', e.docs[0])
              app.userInfo=e.docs[0]
              var message=e.docs[0].message//message数组
              app.message=message
              that.jiantingchuli(message)
            },
            onError: function(err) {
              console.error('监听出现问题!', err)
            }
          })
        },
        /*
        下面存放监听变化代码,进行红点更新
        */
        jiantingchuli(e){
          //console.log("监听处理:",e)
          // 1.未读的数一直是数组成员数,0消息则移除红点
          var weidu=e.length//未读消息总数
          //console.log("监听处理1:")
          if(weidu!=0){
            //有未读,设置红点得看页面层级
            // getCurrentPages()获取当前页面栈
            var ceng=getCurrentPages()
            console.log("ceng的getCurrentPages:",ceng);
            if(ceng.length==1){
              //只有tabar页面才可以设置红点
              wx.setTabBarBadge({
                index: 2,
                text: weidu.toString()
              })
            }
            //console.log("监听处理3:有消息清空红点")
            //2.新的消息震动提醒
            var message=this.data.message//本地已收到message数组、每条新的消息都纪录进去
            console.log("message:",message);
            console.log("e[0].id",e[0].id);
            //var newmessage=0
            for(var i=0;i<weidu;i++){
              var id=e[i].id
              var yn=JSON.stringify(message).includes(id)
              if(!yn){
                //说明是新的消息,给他震动提醒
                //newmessage++
                message.push(e[i])
                this.setData({
                  message:message
                })
                //震动
                wx.vibrateLong({
                  type:'heavy'
                })
                //console.log("监听处理3:新消息震动")
              }
            }
          }else{
            //console.log("监听处理3:无消息清空红点")
            var ceng=getCurrentPages()
            if(ceng.length==1){
              //仅可在tabar页面设置红点
              wx.removeTabBarBadge({index: 2})
            }
          }
        },
       
        //处理搜索
        async read(e){
          return e;
        },
        //处理点赞数据
        async love(e){
          //console.log(e)
          var l=e.length
          for(var i=0;i<l;i++){
            var yn=e[i].ss_xx.dianzanid.indexOf(app.userInfo._id)
            //console.log(yn)
            if(yn==-1){
              e[i].love=false
            }else{
              e[i].love=true
            }
          }
          return e
        },
         //处理收藏数据
         async star(e){
          //console.log(e)
          var l=e.length
          for(var i=0;i<l;i++){
            var yn=e[i].ss_xx.shoucangid.indexOf(app.userInfo._id)
            //console.log(yn)
            if(yn==-1){
              e[i].star=false
            }else{
              e[i].star=true
            }
          }
          return e
        },
      })
      2022-04-22
      回复
    • 再见,电脑崽
      再见,电脑崽
      2022-04-22回复Jeannn
      你程序有多个   this.setData({
            ss_xx:ss_xx
          })
      导致打印的数据被修改。


      目前你可以在plate4 onLoad打印的时候直接打印options.ss_xx
      2022-04-22
      1
      回复
    查看更多(2)
  • Mr.Zhao
    Mr.Zhao
    2022-04-22

    console.log(JSON.stringify(data)) 这么打印

    2022-04-22
    有用 1
    回复 5
    • Jeannn
      Jeannn
      2022-04-22
      我是在第一个页面使用JSON.stringify传过去,然后第二个页面JSON.parse解析再输出的
      2022-04-22
      回复
    • Mr.Zhao
      Mr.Zhao
      2022-04-22回复Jeannn
      2022-04-22
      1
      回复
    • Jeannn
      Jeannn
      2022-04-22
      请问能具体说说吗,这是我的代码片段
      2022-04-22
      回复
    • Mr.Zhao
      Mr.Zhao
      2022-04-22回复Jeannn
      截图告诉你了
      2022-04-22
      1
      回复
    • Jeannn
      Jeannn
      2022-04-25
      谢谢您的耐心解答
      2022-04-25
      回复
登录 后发表内容