箭头函数中的组件重新渲染

Posted

技术标签:

【中文标题】箭头函数中的组件重新渲染【英文标题】:Component re-rendering in arrow functions 【发布时间】:2021-07-25 18:13:47 【问题描述】:

我有一个箭头功能来切换 div 并根据 div 设置一个按钮来显示或隐藏。


    toggleDeliveryDiv = () => 
        document.getElementById('btn_collapse_delivery').click(); 
        this.setState(deliveryShow: !this.state.deliveryShow)
        
        var styl = document.getElementById("plusDiv")
     
            if(this.state.deliveryShow)
                styl.style.display = 'block'
            else
                styl.style.display = 'none'
            
    

我在 onClick 事件中调用箭头函数,如下所示:

onClick=this.toggleDeliveryDiv

但是我猜该方法要么被调用两次,要么组件由于 setState 调用而被重新渲染。请问我怎样才能防止箭头函数中的重新渲染,或者我怎样才能更好地实现这一点???

【问题讨论】:

你不应该在 react 中主动操作 DOM(除非在非常特殊的极端情况下),你应该依靠 this.state 来改变可见性。 我的用例剥夺了我依赖状态来改变可见性的能力,因为它总是创建一个新实例并导致多个元素具有相同的 id 错误 【参考方案1】:

您可以使用“this.state.deliveryShow”来更改 div 元素的样式,而不是操作 DOM。这样您就不必手动处理它了。

<div id="plusDiv" style=display:this.state.deliveryShow?'block':'none'></div>

【讨论】:

这两种方法仍然会导致重新渲染或多个函数调用 我已经相应地编辑了答案。让我知道它现在是否有效。 谢谢。虽然我在使用状态来控制样式时仍然遇到同样的问题。所以我试图隐藏或显示的按钮是动态添加额外表单组件的添加按钮。当前,当单击按钮时,会添加额外的组件,但也会切换整个 div。添加方法:``` addChild = (e) => let objId = e.target.id;让 objName = "文本"+objId; e.target.id = Number(objId) + 1 var objCom = this.state.componentList.concat(id:objId,name:objName,booleane:true) this.setState( componentList: objCom ) 跨度> 【参考方案2】:

应该是这样的: onClick=this.toggleDeliveryDiv 要么 onClick=()=&gt;this.toggleDeliveryDiv()

【讨论】:

以上是关于箭头函数中的组件重新渲染的主要内容,如果未能解决你的问题,请参考以下文章

[转]为啥在 React 的 Render 中使用箭头函数和 bind 会造成问题

你能解释一下这个反应原生代码(渲染方法中的奇怪箭头函数)吗?

this.props 在 React 组件中的箭头函数中显示为未定义

如何在不重新绑定 this 的情况下返回一个带有粗箭头函数的对象? [复制]

Vue中匿名函数和箭头函数的this

JavaScript - 带有箭头函数的超时内部[重复]