2014-06-21 5 views
22

필자는 React를 작성한 이후로 CoffeeScript에 코드를 작성하고 있습니다.
다음은 기본 구조입니다. ReactJS : 하위 구성 요소의 참조에 액세스하는 방법?

{ div, input } = React.DOM 

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

Inner = React.createClass 
    render: -> 
    input { id: 'myInput', ref: 'myInput' } 

나는 바로 가기를 눌러 트리거 내 외부 클래스에 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() 

어떻게이 다음합니까 :

이제 토글 방법은 다음과 같이 다소 봐?

답변

25

refs은 구성 요소 API의 일부로 간주되지 않으므로 하위의 refs에 액세스하면 캡슐화가 중단됩니다. 대신 부모 구성 요소에서 호출 할 수있는 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' } 
2

이 경우 솔루션은 간단합니다. 입력시 자동으로 초점을 맞출 수 있습니다. 자동 초점에서는 렌더링시 초점을 맞 춥니 다. 일반적으로

Inner = React.createClass 
    render: -> 
    input { ref: 'myInput', autoFocus: true } 

, 당신은 내부 구성 요소에 소품을 통과해야하고, componentDidUpdate에 당신은 할 수 있습니다 : 체인 심판은 심판에 의해 요소를 당기면

if @props.something 
    @refs.myInput.getDOMNode().focus() 
+0

자동 초점 나를 위해 작동하지 않습니다. 사실 나는'componentDidUpdate'에 대해서 생각하고 당신이 제안한 것과 비슷한 것을 시도해 보았습니다. 하지만 하위 구성 요소의 참조에 액세스하는 쉬운 방법이 있는지 정말 알고 싶습니다. React Doc에 대한 refs 예제는 입력을 최상위 구성 요소 안에 넣지만 실제로는 입력은 일반적으로 하위 구성 요소 내에 중첩됩니다. – octref

+0

Ref는 정의 된 구성 요소에서만 사용할 수 있습니다. 자녀 컴포넌트가 액세스 할 수 있다면 참조가 다른 참조와 충돌하지 않을 것이라고 가정해야합니다. 심판을 삭제하거나 변경하려면 다른 모든 구성 요소를 확인해야합니다. 이러한 가정과 장소 전체를 보는 것이 가장 좋습니다. – FakeRainBrigand

3

당신이 할 수있는, 그래서 당신이 할 수있는

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

Outer 클래스를 정의하는 것은 할 것이다 : 그 요소 내부 잡아 심판 @refs.inner.refs.myInput.getDOMNode()을 입력하여 focus에 전화를 겁니다.

+1

답장을 보내 주셔서 감사합니다.하지만 저는 @ssorallen의 솔루션을 선호합니다. – octref

관련 문제