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

javascript - vue2 在子组件监听父组件的值value变化,对子组件监听父组件传来的value,之后做更新操作,会导致父组件的requestAnimationFrame的循环更新value值卡顿,这是什么问题?

公西志文
2023-09-20

vue2 在子组件监听父组件的值value变化,对子组件监听父组件传来的value,之后做更新操作,会导致父组件的requestAnimationFrame的循环更新value值卡顿,这是什么问题?

animateFunc() {      // 30fps      const tempImgUrlList = [];      for (const [key, val] of Object.entries(this.timestamp_dict)) {        if (this.videoIndexEvent == this.eventData[0].value.length - 1) {          // 视频全部播放完毕暂停          cancelAnimationFrame(this.animateNumber);          this.setPauseisTrue();          this.isVideoAction = false;          break;        }        if (          this.videoIndex ==          Object.values(this.timestamp_dict)[0].imgs.length - 1        ) {          // 第一段播放完成暂停          cancelAnimationFrame(this.animateNumber);          this.isVideoAction = false;          break;        }        this.slidervalue = val.timestamp[this.videoIndex] || this.slidervalue;        const url = "data:image/jpeg;base64," + val.imgs[this.videoIndex];        tempImgUrlList.push(url);      }      try {        if (          this.videoIndex ==          Object.values(this.timestamp_dict)[0].imgs.length - 1        ) {          cancelAnimationFrame(this.animateNumber);          this.isVideoAction = false;          // 第一段播放完请求下一段数据          if (this.has_next) {            // this.has_next  是否有下一个视频            this.slidervalue = parseFloat(this.slidervalue) + 1;            this.alginSendSocket().then(res => {              if (res === "socket") {                this.timer = setInterval(() => {                  if (!this.load_video) {                    clearInterval(this.timer);                    this.timer = null;                    this.videoIndex = 0;                    this.initImage();                    this.animateFunc();                    this.isVideoAction = true;                  }                }, 500);              } else {                this.videoIndex = 0;                this.initImage();                this.animateFunc();                this.isVideoAction = true;              }            });          } else {            // 若无下一段数据就结束            this.videoIndex = 0;            this.videoIndexEvent = 0;          }          return;        }      } catch (error) {        // this.load_video = false; // 加载完成      }      this.imgUrlList = tempImgUrlList;      this.videoIndex += 1;      this.videoIndexEvent += 1; // 记录播放的index      this.animateNumber = requestAnimationFrame(this.animateFunc);    },

子组件

"parent.slidervalue": {      handler(newVal, oldVal) {        try {          let getchart = echarts.getInstanceByDom(            document.getElementById("charts" + this.index)          );          if (this.parent.isPause && getchart && this.signalName.length !== 0) {            /**             *             * 就近匹配 往上走一个 使用父组件的X轴list             * 子组件还是旧的 未更新,前期父子组件搭建问题,采用此方法,之后不推荐             *  */            const findIndex = this.findIndexDep(              this.parent.eventData[0].value,              String(newVal)            );            const xValue = this.dateTimes[findIndex];            let newOption = _.chain(this.defOption)              .set("xAxis[0].axisPointer.value", xValue)              .value();            getchart.setOption(newOption);           this.sendvalue(newVal, this.parent.eventData[0].value);          }        } catch (error) {          throw "Cannot read properties of null (reading 'getAttribute')";        }      }

共有1个答案

林和煦
2023-09-20

控制一下更新频率:

"parent.slidervalue": {  handler: _.throttle(function(newVal, oldVal) {    try {      let getchart = echarts.getInstanceByDom(        document.getElementById("charts" + this.index)      );      if (this.parent.isPause && getchart && this.signalName.length !== 0) {        const findIndex = this.findIndexDep(          this.parent.eventData[0].value,          String(newVal)        );        const xValue = this.dateTimes[findIndex];        let newOption = _.chain(this.defOption)          .set("xAxis[0].axisPointer.value", xValue)          .value();        getchart.setOption(newOption);        this.sendvalue(newVal, this.parent.eventData[0].value);      }    } catch (error) {      console.error("Error in handler: ", error);    }  }, 100),}
 类似资料:
  • 我对JS的反应有点陌生。我有两个问题。我来了 现在我要做的是,当应用程序组件挂载时,我生成一个对后端服务器的ajax调用,当它返回时,它更新道具,并设置状态,这样子组件也会重新呈现,但子组件不会重新呈现。谁能告诉我出了什么问题。 问题2 现在让我们假设我将进入组件二路由,它将呈现组件二,我在应用程序组件中生成一个ajax调用,根据ajax调用返回的数据,我在应用程序组件中设置了一些道具,我还希望组

  • 假设我的父组件有两个子组件: 我从Child2获得一个输入,并将其传递给父组件(到目前为止,我知道该怎么做)。但是,我需要将该输入传递给Child1,以更新它的状态。 我怎么能那么做?

  • 代码demo: 请教一下子组件的watch不加()=>就无法进入监听?

  • 这个问题在这里已经得到了回答,但事情总是在变化。 基本上,父组件获取一些数据,子组件需要这些数据。 这是子组件。

  • 有一个父组件 A,上面有两个子组件,B 和 C。 在子组件 B 上有一个子组件 D,其中 D 里面有一个 textarea 在子组件 C 上有一个按钮,点击这个按钮获取 D 里面 textarea 的值。 我尝试的两个方案 方案一:可以通过直接操作 dom 来解决 方案二:通过 D 将 textarea 的值传递给 B,然后由 B 传给 A,再有 A 传给 C,但总是传不成功。 请问我的这个需求,

  • 场景 我有一个父组件,里面包含一个子组件,子组件传入了一个对象,假设对象是字面量。当我的父组件更新时,子组件也会更新。导致不必要的渲染。 尝试 1.通过使用React.memo包裹子组件,作用是父组件更新,子组件只有当props变化才变化。结果发现还是不对。。。。分析了一下原因是,当父组件更新时候,传入到子组件的的引用发生了变化,虽然值是相同的。。。咋搞