当前位置: 首页 > 面试题库 >

在componentDidUpdate()内部的setState()

陶英纵
2023-03-14
问题内容

我正在编写一个脚本,该脚本根据下拉列表的高度和输入在屏幕上的位置将下拉列表移动到输入下方或上方。我也想将修改器设置为根据其方向下拉。但是setState在内部使用componentDidUpdate会产生无限循环(这很明显)

我已经找到了使用getDOMNode和直接将classname设置为下拉列表的解决方案,但是我觉得应该使用React工具有更好的解决方案。有谁能够帮我?

这是工作代码的一部分getDOMNode(略微忽略了定位逻辑,以简化代码)

let SearchDropdown = React.createClass({
    componentDidUpdate(params) {
        let el = this.getDOMNode();
        el.classList.remove('dropDown-top');
        if(needToMoveOnTop(el)) {
            el.top = newTopValue;
            el.right = newRightValue;
            el.classList.add('dropDown-top');
        }
    },
    render() {
        let dataFeed = this.props.dataFeed;
        return (
            <DropDown >
                {dataFeed.map((data, i) => {
                    return (<DropDownRow key={response.symbol} data={data}/>);
                })}
            </DropDown>
        );
    }
});

这是带有setstate的代码(它创建一个无限循环)

let SearchDropdown = React.createClass({
    getInitialState() {
        return {
            top: false
        };
    },
    componentDidUpdate(params) {
        let el = this.getDOMNode();
        if (this.state.top) {
           this.setState({top: false});
        }
        if(needToMoveOnTop(el)) {
            el.top = newTopValue;
            el.right = newRightValue;
            if (!this.state.top) {
              this.setState({top: true});
           }
        }
    },
    render() {
        let dataFeed = this.props.dataFeed;
        let class = cx({'dropDown-top' : this.state.top});
        return (
            <DropDown className={class} >
                {dataFeed.map((data, i) => {
                    return (<DropDownRow key={response.symbol} data={data}/>);
                })}
            </DropDown>
        );
    }
});

问题答案:

你可以setState在里面使用componentDidUpdate。问题在于,由于没有中断条件,因此您正在以某种方式创建无限循环。

基于您需要呈现组件后浏览器提供的值的事实,我认为您的使用方法componentDidUpdate是正确的,它只需要更好地处理触发的条件即可setState



 类似资料:
  • 我最近需要在一个JScrollPane的viewport视图中放置几个组件,其中包括一个JTextPane。 我将所有组件(两个JPanel和JTextPane)放在另一个JPanel中,这个JPanel有一个BorderLayout LayoutManager,并将该JPanel设置为ScrollPane的viewport视图。 我立即注意到: JTextPane不再根据JScrollPane的

  • 直到今天,我才知道java有堆,堆是由JVM创建的。此外,这个内存是由操作系统分配给JVM实例的,即堆驻留在JVM实例中。 这表明,JVM和堆相距甚远。 所以,我现在很困惑,有谁能让我知道,我以前是错的还是我不能理解这幅画?

  • 问题内容: 请看下面的代码: 在上面的代码中,在方法ModifyList()中声明的匿名内部类的实例能够访问传递给该方法的参数。AFAIK Java为内部类创建一个单独的字节码文件。 谁能解释一下Java在字节码级别上如何处理这些局部变量绑定?我的意思是,Java如何精确跟踪对作为参数传递给该方法的对象的引用? 任何帮助将不胜感激! [抱歉我的英语不好! 如果您理解我的问题,请编辑这篇文章,并删除

  • 我试图运行一个简单的mapdb示例,但出现了以下错误: 我的班级: 我的pomx.xml 我跑得很快-

  • 问题内容: tldr; 如何模拟或将prop与数组配合使用以强制重置组件? 我正在实现一个显示计时器的组件,并在该组件达到零时执行回调。目的是让回调更新对象列表。后一个组件由新的React钩子 和组成。 该包含在该定时器启动时的基准,而剩余的时间。该套间隔称为每秒钟更新的剩余时间,并检查是否回调应该叫。 该组件并不是要重新安排计时器的时间,或者在间隔达到零时保持间隔不变,而是应该执行回调和空闲。为

  • 太长,读不下去了如何模拟或使用带有数组的道具强制重置我的组件? 我正在实现一个组件,它显示一个计时器,并在达到零时执行回调。目的是让回调更新对象列表。后一个组件由新的React钩子和组成。 包含对计时器启动时间和剩余时间的引用。设置每秒钟调用一次的间隔,以更新剩余的时间,并检查是否应该调用回调。 该组件并不意味着重新安排计时器,或者在间隔达到零时保持间隔,它应该执行回调并空闲。为了让计时器刷新,我