reactjs - 如何在 React Native 的新标签页中打开外部链接?

标签 reactjs react-native react-native-android react-native-ios react-native-web

我在做:

import React from 'react';
import PropTypes from 'prop-types';
import { TouchableOpacity, Linking } from 'react-native';

/**
 * Used to create external link to other websites
 */
class ExternalLink extends React.Component {
  _openLink = async () => {
    const { href } = this.props;
    if (await Linking.canOpenURL(href)) {
      await Linking.openURL(href);
    }
  };

  render() {
    const { href, children, ...rest } = this.props;
    return (
      <TouchableOpacity
        accessibilityRole="link"
        onPress={this._openLink} // eslint-disable-line no-underscore-dangle
        href={href}
        {...rest}
      >
        {children}
      </TouchableOpacity>
    );
  }
}

ExternalLink.propTypes = {
  /** External URL */
  href: PropTypes.string.isRequired,
  /** Any node */
  children: PropTypes.node.isRequired,
};

export default ExternalLink;

但是,这在当前选项卡中打开,有没有办法在新选项卡中打开 URL?

最佳答案

我想有两个主要选择:

你只能在 web 中使用 window.open() 函数:

if(Platform.OS == 'web'){
   window.open(url, '_blank');
} else {
   Linking... // normal Linking react-native
}

或者您可以从 react-native-web ( https://github.com/necolas/react-native-web/blob/master/packages/react-native-web/src/exports/Linking/index.js ) 创建自定义链接:

CustomLinking.js :
import { canUseDOM } from 'fbjs/lib/ExecutionEnvironment';
import invariant from 'fbjs/lib/invariant';

const initialURL = canUseDOM ? window.location.href : '';

const CustomLinking = {
  addEventListener() {},
  removeEventListener() {},
  canOpenURL(): Promise<boolean> {
    return Promise.resolve(true);
  },
  getInitialURL(): Promise<string> {
    return Promise.resolve(initialURL);
  },
  openURL(url: string, target = '_self'): Promise<Object | void> {
    try {
      open(url, target);
      return Promise.resolve();
    } catch (e) {
      return Promise.reject(e);
    }
  },
  _validateURL(url: string) {
    invariant(typeof url === 'string', 'Invalid URL: should be a string. Was: ' + url);
    invariant(url, 'Invalid URL: cannot be empty');
  }
};

const open = (url, target) => {
  if (canUseDOM) {
    window.open(
      url,
      target // <- This is what makes it open in a new window.
    );
  }
};

export default CustomLinking;

用法:
import Linking from "./CustomLinking";

Linking.openURL(href, '_blank');

关于reactjs - 如何在 React Native 的新标签页中打开外部链接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61198982/

相关文章:

javascript - THREE.FontLoader() 在三个 JS 中不起作用

reactjs - Material-UI slider - 使用比例更改值

realm - 在 React Native 和 Android 之间共享 Realm 实例

react-native - 使用 react-native bundle (Android) 创建发布版本后返回调试

reactjs - 如何用react js打开动态模态

reactjs - 加载时如何为 Nextjs/Image 添加淡入动画?

javascript - React + Firebase 保存问题。为什么这个哈希?

javascript - react native + 终极版 : How to render <ListView/> upon clicking a button?

android - 从 db-models 响应 native 获取

node.js - React Native - 运行 "npm start"和 "react-native run-android"时出错