ReactJS:如何访问子组件的引用?

oct*_*ref 22 coffeescript reactjs

我正在编写CoffeeScript中的代码,因为我一直在用它编写React.
这是基本结构.

{ div, input } = React.DOM

Outer = React.createClass
  render: ->
    div { id: 'myApp' },
      Inner()

Inner = React.createClass
  render: ->
    input { id: 'myInput', ref: 'myInput' }
Run Code Online (Sandbox Code Playgroud)

toggle我的外类上有一个方法,可以通过按快捷方式触发.它切换了我的应用程序的可见性.
当我的应用程序从隐藏切换到显示时,我想专注于输入.

现在切换方法看起来或多或少像这样:

Outer = React.createClass
  render: ->
     ......

  hide: ->
    @setState { visible: no }

  show: ->
    @setState { visible: yes }

    $('#myInput').focus() # jQuery
    # I want to do something like
    # @refs.myInput.getDOMNode().focus()
    # But @refs here is empty, it doesn't contain the refs in Inner

  toggle: ->
    if @state.visible
      @hide()
    else
      @show()
Run Code Online (Sandbox Code Playgroud)

那怎么办?

Ros*_*len 24

访问refs子进程会破坏封装,因为refs它不被视为组件API的一部分.相反,你应该公开一个Inner可以由父组件调用的函数,调用它focus可能是有意义的.

此外,将元素集中在一起componentDidUpdate以确保渲染完成:

{ div, input } = React.DOM

Outer = React.createClass
  render: ->
    div { id: 'myApp' },
      Inner({ref: 'inner'})

  componentDidUpdate: (prevProps, prevState) ->
    # Focus if `visible` went from false to true
    if (@state.visible && !prevState.visible)
      @refs.inner.focus()

  hide: ->
    @setState { visible: no }

  show: ->
    @setState { visible: yes }

  toggle: ->
    if @state.visible
      @hide()
    else
      @show()

Inner = React.createClass
  focus: ->
    @refs.myInput.getDOMNode().focus()

  render: ->
    input { id: 'myInput', ref: 'myInput' }
Run Code Online (Sandbox Code Playgroud)