React Native App에서 하이퍼 링크를 어떻게 표시합니까?


110

React Native 앱에서 하이퍼 링크를 어떻게 표시합니까?

예 :

<a href="https://google.com>Google</a> 

2
사용자의 관심을 끌려면 'javascript'와 같은 태그를 더 추가하는 것이 좋습니다. 그러나 '코딩'과 같은 태그를 추가하여 게시물을 지나치게 일반화하지 마십시오.
Matt C

@MattC 나는 '자바 스크립트'를 추가하는 것이 너무 일반적이라고 주장합니다.
ryanwebjackson

답변:


233

이 같은:

<Text style={{color: 'blue'}}
      onPress={() => Linking.openURL('http://google.com')}>
  Google
</Text>

LinkingReact Native와 함께 번들로 제공되는 모듈을 사용합니다 .


1
동적 값이 필요한 경우, 당신은 같은 것을 사용할 수있는 this.props.url대신에 'http://google.com'(더 필요 중괄호 없음)
엘론 지토

@philipp은 '변수 링크하기를 찾을 수 없습니다'나에게 오류 m를 던지고
Devansh sadhotra

2
@devanshsadhotra import { Linking } from 'react-native';문서에 있습니까?
Eric Phillips

2
링크 된 텍스트가 상위 텍스트의 일부가되도록 <Text> 요소도 포함 할 수 있습니다.<Text>Some paragraph <Text onPress=...>with a link</Text> inside</Text>
pstanton

4
LinkingIOS가 감가 상각되었습니다. Linking을 사용하십시오.
jasonleonhard

26

선택한 답변은 iOS에만 해당됩니다. 두 플랫폼 모두에 대해 다음 구성 요소를 사용할 수 있습니다.

import React, { Component, PropTypes } from 'react';
import {
  Linking,
  Text,
  StyleSheet
} from 'react-native';

export default class HyperLink extends Component {

  constructor(){
      super();
      this._goToURL = this._goToURL.bind(this);
  }

  static propTypes = {
    url: PropTypes.string.isRequired,
    title: PropTypes.string.isRequired,
  }

  render() {

    const { title} = this.props;

    return(
      <Text style={styles.title} onPress={this._goToURL}>
        >  {title}
      </Text>
    );
  }

  _goToURL() {
    const { url } = this.props;
    Linking.canOpenURL(url).then(supported => {
      if (supported) {
        Linking.openURL(this.props.url);
      } else {
        console.log('Don\'t know how to open URI: ' + this.props.url);
      }
    });
  }
}

const styles = StyleSheet.create({
  title: {
    color: '#acacac',
    fontWeight: 'bold'
  }
});

3
선택한 답변은 Android에서 잘 작동했습니다 (RN 35).
Pedram

2
@JacobLauritzen 이제 누군가 내 대답을 복사 한 후에도 동일합니다. / stackoverflow.com/posts/30540502/revisions
Kuf

21

이렇게하려면 Text구성 요소를 TouchableOpacity. a TouchableOpacity를 터치하면 희미 해집니다 (덜 불투명 해짐). 이것은 사용자가 텍스트를 터치 할 때 즉각적인 피드백을 제공하고 개선 된 사용자 경험을 제공합니다.

onPress속성 TouchableOpacity을 사용하여 링크를 만들 수 있습니다 .

<TouchableOpacity onPress={() => Linking.openURL('http://google.com')}>
  <Text style={{color: 'blue'}}>
    Google
  </Text>
</TouchableOpacity>

13

React Native 문서는 다음을 사용하도록 제안합니다 Linking.

참고

다음은 매우 기본적인 사용 사례입니다.

import { Linking } from 'react-native';

const url="https://google.com"

<Text onPress={() => Linking.openURL(url)}>
    {url}
</Text>

딜러가 선택한 기능 또는 클래스 구성 요소 표기법을 사용할 수 있습니다.


LinkingIOS가 감가 상각되었습니다. Linking을 사용하십시오.
jasonleonhard

4

React Native Hyperlink (Native <A>태그) 사용 :

설치:

npm i react-native-a

수입:

import A from 'react-native-a'

용법:

  1. <A>Example.com</A>
  2. <A href="example.com">Example</A>
  3. <A href="https://example.com">Example</A>
  4. <A href="example.com" style={{fontWeight: 'bold'}}>Example</A>

3

위의 응답에 추가 할 또 다른 유용한 참고 사항은 일부 flexbox 스타일을 추가하는 것입니다. 이렇게하면 텍스트가 한 줄로 유지되고 텍스트가 화면과 겹치지 않게됩니다.

 <View style={{ display: "flex", flexDirection: "row", flex: 1, flexWrap: 'wrap', margin: 10 }}>
  <Text>Add your </Text>
  <TouchableOpacity>
    <Text style={{ color: 'blue' }} onpress={() => Linking.openURL('https://www.google.com')} >
         link
    </Text>
   </TouchableOpacity>
   <Text>here.
   </Text>
 </View>


1

링크 및 기타 유형의 리치 텍스트를 수행하려는 경우보다 포괄적 인 솔루션은 React Native HTMLView 를 사용하는 것 입니다.


1
이 링크가 질문에 답할 수 있지만 여기에 답변의 필수 부분을 포함하고 참조 용 링크를 제공하는 것이 좋습니다. 링크 된 페이지가 변경되면 링크 전용 답변이 무효화 될 수 있습니다. - 검토에서
Ari0nhh

@ Ari0nhh 내가 귀하의 의견에 응답 할 수있는 유일한 방법 이었기 때문에 질문을 삭제 취소했습니다. 높은 순위의 답변이 단순히 좋은 라이브러리에 대한 링크 인 SO에 대한 많은 선례가 있습니다. 또한 다른 답변은 이미 간단한 구현을 다루고 있습니다. 나는 이것을 원래 질문에 대한 의견으로 다시 게시 할 수 있다고 생각하지만 실제 답변으로 간주합니다. 그리고 여기에 링크를 남겨 두는 것은 적어도 미래의 구직자들을위한 부스러기입니다. 만약 사람들이 그것을 편집하고 더 나은 예제로 개선하고 싶다면 적어도 지금은 시작할 곳이 있습니다.
Eliot

1

문자열 내에 포함 된 링크 를 사용하여 지금이 문제를 발견하는 모든 사람과 내 해키 솔루션을 공유 할 것이라고 생각했습니다 . 문자열이 공급되는 모든 것을 동적으로 렌더링 하여 링크인라인 하려고 시도 합니다.

필요에 따라 자유롭게 조정하십시오. 다음과 같은 목적을 위해 작동합니다.

https://google.com 이 표시 되는 방식의 예입니다 .

Gist에서보기 :

https://gist.github.com/Friendly-Robot/b4fa8501238b1118caaa908b08eb49e2

import React from 'react';
import { Linking, Text } from 'react-native';

export default function renderHyperlinkedText(string, baseStyles = {}, linkStyles = {}, openLink) {
  if (typeof string !== 'string') return null;
  const httpRegex = /http/g;
  const wwwRegex = /www/g;
  const comRegex = /.com/g;
  const httpType = httpRegex.test(string);
  const wwwType = wwwRegex.test(string);
  const comIndices = getMatchedIndices(comRegex, string);
  if ((httpType || wwwType) && comIndices.length) {
    // Reset these regex indices because `comRegex` throws it off at its completion. 
    httpRegex.lastIndex = 0;
    wwwRegex.lastIndex = 0;
    const httpIndices = httpType ? 
      getMatchedIndices(httpRegex, string) : getMatchedIndices(wwwRegex, string);
    if (httpIndices.length === comIndices.length) {
      const result = [];
      let noLinkString = string.substring(0, httpIndices[0] || string.length);
      result.push(<Text key={noLinkString} style={baseStyles}>{ noLinkString }</Text>);
      for (let i = 0; i < httpIndices.length; i += 1) {
        const linkString = string.substring(httpIndices[i], comIndices[i] + 4);
        result.push(
          <Text
            key={linkString}
            style={[baseStyles, linkStyles]}
            onPress={openLink ? () => openLink(linkString) : () => Linking.openURL(linkString)}
          >
            { linkString }
          </Text>
        );
        noLinkString = string.substring(comIndices[i] + 4, httpIndices[i + 1] || string.length);
        if (noLinkString) {
          result.push(
            <Text key={noLinkString} style={baseStyles}>
              { noLinkString }
            </Text>
          );
        }
      }
      // Make sure the parent `<View>` container has a style of `flexWrap: 'wrap'`
      return result;
    }
  }
  return <Text style={baseStyles}>{ string }</Text>;
}

function getMatchedIndices(regex, text) {
  const result = [];
  let match;
  do {
    match = regex.exec(text);
    if (match) result.push(match.index);
  } while (match);
  return result;
}

1

React Native에서 모듈 연결 가져 오기

import { TouchableOpacity, Linking } from "react-native";

시도 해봐:-

<TouchableOpacity onPress={() => Linking.openURL('http://Facebook.com')}>
     <Text> Facebook </Text>     
</TouchableOpacity>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.