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

Ref回调属性未按预期工作

刁钧
2023-03-14
问题内容

我有两个使用的示例ref callback attribute。首先是对回调函数的引用。第二个有一个箭头函数声明为该值。

第一个按预期工作。但是,第二个null在连续渲染中记录a 。

这是什么原因呢?

开始在输入框中输入内容

示例1(工作正常)

class App extends React.Component{

  constructor(props){

    super(props)

    this.refCallback = this.refCallback.bind(this)

    this.state = {}

  }



  refCallback(el){

    console.log(el)

  }



  render(){

    return <input type="text"

      value={this.state.value}

      ref={this.refCallback}

      onChange={(e) => this.setState({value: e.target.value})}

      />

  }

}



ReactDOM.render(<App/>, document.getElementById('app'))


<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>

<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>

<div id="app"></div>

示例2(这不起作用)

class App extends React.Component{

  constructor(props){

    super(props)

    this.state = {}

  }



  render(){

    return <input type="text"

      value={this.state.value}

      ref={(el) => console.log(el)}

      onChange={(e) => this.setState({value: e.target.value})}

      />

  }

}



ReactDOM.render(<App/>, document.getElementById('app'))


<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>

<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>

<div id="app"></div>

问题答案:

关于React的Github问题已经对此进行了简要讨论。我会尽力解释这一点,但是很难用语言表达。

由于在第二个示例中您没有调用“智能”组件方法,因此console.log(el)每次重新渲染组件时都会发生这种情况,这意味着当特定节点(在本例中为您的输入)被删除并再次呈现时,它也会调用,不管el实际是否改变。当它被React移除时,它会返回,null因为该元素不再存在,即使只是一秒钟的时间。似乎是为了完成而这样做。

这是Dan Abramov
的一条推文,对此做了一些解释。



 类似资料:
  • 我试图测试spring rabbitmq confirm callback的行为,根据api描述,如果通过consumer发送了任何否定确认,则confirm callback应该给出ack的false值,但在我的例子中总是给出true。即使我将消息发布到deleted队列,我也在confirm回调中获得了true值。请告诉我如何得到否定的承认。 下面是我如何创建RabbitTemplate be

  • 我正在学习AOP Spring并尝试一些示例。关于@AfterBack ning,我所理解的是,只有当目标成功返回并且与切入点匹配时,才会调用该方法。然而,在我的例子中,如下所示,我有一个切入点,它定义了所有只返回字符串的方法,但它调用了所有空方法以及返回字符串的方法。 我的建议: 请在下面找到我的Impl课程: 请在下面找到我的MainApp类: 我原本希望只调用getCustomer(),因为

  • 我正在使用Dozer在Document类和DocumentManagementBean类之间进行映射,这都是我自己制作的。两者都有一个Joda DateTime类型的属性,即getter和setter,名为dateAdded。 当文档对象d的属性dateAdded=x时,调用映射器。map(d,DocumentManagementBean.class)所有字段都会正确地自动映射(因为我完全控制代码

  • 我正在使用spring Roo并希望访问Controller类中的一个bean,该类在ApplicationContext.xml中具有以下配置: 配置类本身是: 在我的Controller中,我认为一个简单的Autowired注释应该可以完成这项工作 在启动过程中,spring在setSkipWeeks方法中打印消息。不幸的是,每当我在控制器中调用config.getSkipWeeks()时,它

  • 当我运行以下程序时,它只打印 然而,从Java 8的equalsIgnoreCase文档中我们发现: 如果以下至少一项为真,则两个字符c1和c2被视为相同的忽略情况: •对每个字符应用java.lang.character.ToUpperCase(char)方法会产生相同的结果 所以我的问题是为什么这个程序不打印 在这两种操作中,都使用了大写字符。

  • 我试图使用来传输我根据前面的问题设置的自定义标头。 我在文件中读到... 我的属性包括: