React Native Appでハイパーリンクを表示するにはどうすればよいですか?


109

React Nativeアプリでハイパーリンクを表示するにはどうすればよいですか?

例えば

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

2
ユーザーの注意を引くために、「javascript」などのタグを追加することを検討してください。しかしなど、「コード」のようなタグを追加することで、あなたの投稿を過剰に一般化していない
マット・C

@MattC「javascript」を追加するのは一般的すぎると私は主張します。
ryanwebjackson

回答:


232

このようなもの:

<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';文書にありますか?
エリックフィリップス

2
あなたは埋め込むことができます。<テキスト>もそうリンクされたテキストは、親のテキストの一部とすることができる要素:<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 2017年

2
@JacobLauritzenさて、誰かが私の回答をコピーした後も同じです:/ stackoverflow.com/posts/30540502/revisions
Kuf

21

これを行うには、Textコンポーネントをでラップすることを強く検討しますTouchableOpacity。とき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ネイティブハイパーリンク(ネイティブ <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

上記の応答に追加するもう1つの役立つメモは、いくつかのフレックスボックスのスタイルを追加することです。これにより、テキストが1行に保たれ、テキストが画面に重ならないようになります。

 <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>

2

React Nativeの場合、アプリでハイパーリンクを開くためのライブラリがあります。 https://www.npmjs.com/package/react-native-hyperlink

これに加えて、私はあなたがURLをチェックする必要があると思います、そして最良のアプローチは正規表現です。 https://www.npmjs.com/package/url-regex


iOS向けにビルドしている場合、SVCはリンク(Safariブラウザーで開く)よりも実装に優れたアプローチです。github.com/naoufal/react-native-safari-view
rajaishwary

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.