Làm cách nào để hiển thị một siêu liên kết trong ứng dụng React Native?


109

Làm cách nào để hiển thị siêu liên kết trong ứng dụng React Native?

ví dụ

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

2
Cân nhắc thêm nhiều thẻ hơn như 'javascript' để thu hút sự chú ý hơn từ người dùng. Nhưng đừng khái quát hóa quá mức các bài đăng của bạn bằng cách thêm các thẻ như 'mã hóa', v.v.
Matt C

@MattC Tôi cho rằng việc thêm 'javascript' là quá chung chung.
ryanwebjackson

Câu trả lời:


232

Một cái gì đó như thế này:

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

bằng cách sử dụng Linkingmô-đun đi kèm với React Native.


1
Nếu bạn cần một giá trị động, bạn có thể sử dụng giống như this.props.urlở nơi 'http://google.com'(không niềng răng cần thiết)
Elon Zito

@philipp nó ném cho tôi lỗi m 'không thể tìm thấy Linking biến'
Devansh sadhotra

2
@devanshsadhotra bạn có import { Linking } from 'react-native';trong tài liệu của mình không?
Eric Phillips

2
Bạn có thể nhúng <Text> yếu tố quá để các văn bản liên kết có thể là một phần của văn bản cha mẹ:<Text>Some paragraph <Text onPress=...>with a link</Text> inside</Text>
pstanton

4
LinkingIOS đã bị mất giá trị, hãy sử dụng Liên kết.
jasonleonhard

26

Câu trả lời đã chọn chỉ đề cập đến iOS. Đối với cả hai nền tảng, bạn có thể sử dụng thành phần sau:

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
Câu trả lời đã chọn phù hợp với tôi trong Android (RN 35).
Pedram

2
@JacobLauritzen giờ cũng giống như vậy sau khi ai đó sao chép câu trả lời của tôi: / stackoverflow.com/posts/30540502/revisions
Kuf

21

Để làm điều này, tôi thực sự sẽ xem xét việc gói một Textthành phần trong a TouchableOpacity. Khi TouchableOpacitychạm vào a, nó mờ dần (trở nên ít mờ hơn). Điều này cung cấp cho người dùng phản hồi ngay lập tức khi chạm vào văn bản và cung cấp trải nghiệm người dùng được cải thiện.

Bạn có thể sử dụng thuộc onPresstính trên TouchableOpacityđể thực hiện liên kết:

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

13

Tài liệu React Native đề xuất sử dụng Linking:

Tài liệu tham khảo

Đây là một trường hợp sử dụng rất cơ bản:

import { Linking } from 'react-native';

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

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

Bạn có thể sử dụng ký hiệu thành phần chức năng hoặc lớp, sự lựa chọn của đại lý.


LinkingIOS đã bị mất giá trị, hãy sử dụng Liên kết.
jasonleonhard

4

Sử dụng siêu liên kết React Native (Gốc <A> thẻ ):

Tải về:

npm i react-native-a

nhập khẩu:

import A from 'react-native-a'

Sử dụng:

  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

Một lưu ý hữu ích khác để thêm vào các câu trả lời trên là thêm một số kiểu flexbox. Thao tác này sẽ giữ văn bản trên một dòng và đảm bảo văn bản không chồng lên màn hình.

 <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

đối với React Native, có thư viện để mở Siêu liên kết trong Ứng dụng. https://www.npmjs.com/package/react-native-hyperlink

Ngoài ra, tôi cho rằng bạn sẽ cần phải kiểm tra url và cách tiếp cận tốt nhất là Regex. https://www.npmjs.com/package/url-regex


Nếu bạn đang xây dựng cho ios, SVC là cách tiếp cận tốt hơn để triển khai hơn là Liên kết (để mở trong Trình duyệt Safari). github.com/naoufal/react-native-safari-view
rajaishwary

1

Nếu bạn muốn thực hiện liên kết và các loại văn bản đa dạng thức khác, một giải pháp toàn diện hơn là sử dụng React Native HTMLView .


1
Mặc dù liên kết này có thể trả lời câu hỏi, nhưng tốt hơn hết bạn nên đưa các phần thiết yếu của câu trả lời vào đây và cung cấp liên kết để tham khảo. Các câu trả lời chỉ có liên kết có thể trở nên không hợp lệ nếu trang được liên kết thay đổi. - Từ đánh giá
Ari0nhh

@ Ari0nhh Tôi đã hủy xóa câu hỏi vì đó là cách duy nhất tôi có thể trả lời nhận xét của bạn. Có rất nhiều tiền lệ trên SO trong đó một câu trả lời được xếp hạng cao chỉ đơn giản là một liên kết đến một thư viện tốt. Cộng với các câu trả lời khác đã bao gồm một triển khai đơn giản. Tôi cho rằng tôi có thể đăng lại bài này dưới dạng nhận xét về câu hỏi ban đầu, nhưng tôi xem nó như một câu trả lời thực sự. Và việc để lại liên kết ở đây ít nhất là một vụn vặt cho những người tìm kiếm trong tương lai, nếu mọi người muốn chỉnh sửa và cải thiện nó với các ví dụ tốt hơn thì ít nhất bây giờ cũng có một nơi để bắt đầu.
Eliot

1

Tôi chỉ nghĩ rằng tôi sẽ chia sẻ giải pháp hacky của mình với bất kỳ ai đang phát hiện ra vấn đề này ngay bây giờ với các liên kết được nhúng trong một chuỗi. Nó cố gắng nội dòng các liên kết bằng cách hiển thị động với những gì từng chuỗi được đưa vào nó.

Xin vui lòng điều chỉnh nó theo nhu cầu của bạn. Nó hoạt động cho các mục đích của chúng tôi như:

Đây là một ví dụ về cách https://google.com sẽ xuất hiện.

Xem nó trên 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

Nhập Liên kết mô-đun từ React Native

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

Thử nó:-

<TouchableOpacity onPress={() => Linking.openURL('http://Facebook.com')}>
     <Text> Facebook </Text>     
</TouchableOpacity>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.