2017-04-21 2 views
2

작동하지 라우터 반응하지만, e.preventDefault()을 작동하지 않습니다 :에서 preventDefault 내가하지</em> 새 탭 또는 기존의 탭에서 열려 할 <em>라우터 반응에서 <code><Link></code> 요소가

constructor(props) { 
    super(props); 
    this.loadLink = this.loadLink.bind(this); 
} 

loadLink(e) { 
    e.preventDefault(); 
    const id = null || e.target.id; 
    this.props.onLink(id); 
} 

render() { 
    return (
     <Link id="my-id" ref="my-id" onClick={this.loadLink} to="/some-url">Some link</Link> 
    ); 
} 

e.nativeEvent.stopImmediatePropagation()을 시도한 결과 <Link>에서 <a> 태그로 변환하려고했지만 링크를 클릭해도 항상 새 탭에서 열립니다.

dev 도구를 통해 확인했으며 해당 링크에 연결된 유일한 맞춤 이벤트 처리기입니다.

어떤 아이디어일까요? 어떻게 추적 할 수 있습니까?

+0

React는 합성 이벤트를 사용합니다. http://stackoverflow.com/questions/24415631/reactjs-syntheticevent-stoppropagation-only-works-with-react-events – chris

+3

스팬을 사용하지 않는 이유는 어디에서나 연결되기를 원하지 않는다면? – azium

+0

@chris 네, 그렇기 때문에'e.stopPropgataion' 또는'e.nativeEvent.stopImmediatePropagation()'이 효과가 있지만 그렇지 않을 것이라고 생각합니다. @azium 나는 하이퍼 링크의 SEO 혜택을 원한다. span은 그것을 제공하지 않을 것이다. – OrdinaryHuman

답변

-1

좋아요, 다른 사람이 이벤트 리스너를 추가하는 기능을 추가 한 것으로 나타났습니다. 다른 구성 요소에있는 의 모든 하위 시스템에 이벤트 리스너를 추가 했으므로 내가 수행 한 작업에 상관없이 새 탭에서 열었습니다.

componentDidMount() { 
    const anchors = document.getElementsByTagName("a"); 
    for (let i = 0, length = anchors.length; i < length; i++) { 
     const anchor = anchors[i]; 
     anchor.addEventListener('click', function(e) { 
      e.preventDefault(); 
      window.open(this.getAttribute('href'), '_blank'); 
     }, true); 
    } 
} 

이 문제가 해결되었습니다.

하나의 교훈은, 위의 함수는 모든 구성 요소의 모든하는 HREF를 지배 구성 요소 수준의 기능의 범위를 제한하는 것입니다뿐만 아니라 하나 그것은 작성되었습니다.

그것은의 클릭 이벤트 핸들러에서 대기하고 있던 dev tools inspector, 나는 실수로 다른 것을 언급했다고 생각했습니다.

1

링크를 원하지만 경로를 지정하지 않으려면 앵커 태그 만 사용해야합니다.

<a onClick={this.loadLink} href="javascript:;">Some link</a> 

이렇게하면 특별한 스타일링 없이도 링크와 상호 작용할 수 있습니다. 반응 라우터 Link 태그는 앵커 태그입니다. 그래서 귀하의 링크 스타일은 동일합니다. href가 단지 빈 javascript 블록이라는 것을 주목하십시오. 이것은 죽은 링크를 시뮬레이트합니다 (단, 클릭 리스너는 제외).

+0

불행히도, 이것은 작동하지 않습니다. 이렇게하면 빈 탭이 열립니다. 게다가 나는 href가있는 SEO 주스를 원합니다. – OrdinaryHuman

+0

target = "_ blank"를 지정하고 기본값을 방지하지 않으면 새 탭이 발생하지 않아야합니다. 또는 프로그래밍 방식으로 작업하는 경우 href를 원한다면 하나를 사용하고 기본값을 방지하십시오. 그러나 앵커 태그를 유지하십시오. 반응 라우터로 라우팅하지 않는 경우에는 링크를 사용하지 않아야합니다. –

관련 문제