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>
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>
Câu trả lời:
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 Linking
mô-đun đi kèm với React Native.
this.props.url
ở nơi 'http://google.com'
(không niềng răng cần thiết)
import { Linking } from 'react-native';
trong tài liệu của mình không?
<Text>Some paragraph <Text onPress=...>with a link</Text> inside</Text>
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'
}
});
Để làm điều này, tôi thực sự sẽ xem xét việc gói một Text
thành phần trong a TouchableOpacity
. Khi TouchableOpacity
chạ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 onPress
tí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>
Linking
:import { Linking } from 'react-native';
const url="https://google.com"
<Text onPress={() => Linking.openURL(url)}>
{url}
</Text>
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:
<A>Example.com</A>
<A href="example.com">Example</A>
<A href="https://example.com">Example</A>
<A href="example.com" style={{fontWeight: 'bold'}}>Example</A>
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>
đố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 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 .
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;
}
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>