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')"; } }
控制一下更新频率:
"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变化才变化。结果发现还是不对。。。。分析了一下原因是,当父组件更新时候,传入到子组件的的引用发生了变化,虽然值是相同的。。。咋搞