如何在React Native App中显示超链接?


110

如何在React Native应用程序中显示超链接?

例如

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

2
考虑添加更多标签,例如“ javascript”,以吸引用户更多关注。但不加标签,如“编码”等过度概括自己的帖子
马特ç

@MattC我认为添加'javascript'太笼统了。
ryanwebjackson

Answers:


233

像这样:

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

使用Linking与React Native捆绑在一起的模块。


1
如果您需要动态值,则可以使用类似this.props.url的代替'http://google.com'(不需要大括号)
Elon Zito

@philipp,这使我抛出错误m'找不到变量链接'
Devansh sadhotra

2
import { Linking } from 'react-native';您的文档中有@devanshsadhotra 吗?
埃里克·菲利普斯

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。当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上有很多先例,其中排名靠前的答案只是指向一个好的图书馆的链接。加上其他答案已经涵盖了一个简单的实现。我想我可以将其作为对原始问题的评论重新发布,但是我确实将其视为真正的答案。而且,将链接留在这里至少对将来的求职者是个麻烦,如果人们想要对其进行编辑并使用更好的示例进行改进,至少现在有一个起点。
艾略特

1

只是以为我会与现在通过字符串中的嵌入式链接发现此问题的任何人分享我的hacky解决方案。它尝试通过使用任何动态字符串来动态呈现链接,从而内联链接

请随时根据您的需要进行调整。它为我们的目的而工作:

这是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>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.