নেটিভ অ্যাপ্লিকেশনটিতে কীভাবে একজন হাইপারলিঙ্ক প্রদর্শন করে?


118

আমি কীভাবে একটি প্রতিক্রিয়া নেটিভ অ্যাপ্লিকেশনটিতে একটি হাইপারলিঙ্ক প্রদর্শন করব?

যেমন

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

4
ব্যবহারকারীদের থেকে বেশি মনোযোগ পেতে 'জাভাস্ক্রিপ্ট' এর মতো আরও ট্যাগ যুক্ত করার বিষয়টি বিবেচনা করুন। তবে 'কোডিং' ইত্যাদির মতো ট্যাগ যুক্ত করে আপনার পোস্টগুলিকে বেশি সাধারণীকরণ করবেন না
ম্যাট সি

4
@ ম্যাটসি আমি যুক্তি দিয়ে বলব যে 'জাভাস্ক্রিপ্ট' যুক্ত করা খুব সাধারণ।
ryanwebjackson

উত্তর:


262

এটার মতো কিছু:

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

Linkingপ্রতিক্রিয়া নেটিভ সঙ্গে বান্ডিল যে মডিউল ব্যবহার ।


4
আপনার যদি একটি গতিশীল মান প্রয়োজন হয় তবে আপনি কিছু this.props.urlজায়গায় ব্যবহার করতে পারেন 'http://google.com'(কোনও ধনুর্বন্ধনী প্রয়োজন নেই)
এলন জিতো

@ ফিলিপ এটি আমার ত্রুটি ছুঁড়ে দিচ্ছে এম 'পরিবর্তনশীল সংযোগ খুঁজে
পাচ্ছে

4
@ দেওয়ানশাদ্ধোত্রা কি import { Linking } from 'react-native';আপনার নথিতে আছে?
এরিক ফিলিপস

4
আপনি <টেক্সট> উপাদানগুলি এম্বেড করতে পারেন যাতে লিঙ্কযুক্ত পাঠ্যটি মূল পাঠ্যের একটি অংশ হতে পারে:<Text>Some paragraph <Text onPress=...>with a link</Text> inside</Text>
pstanton

4
লিঙ্কিংআইওএসকে অবমূল্যায়ন করা হয়েছে, লিঙ্কিং ব্যবহার করুন।
জেসনলোনহার্ড

28

নির্বাচিত উত্তরটি কেবল আইওএসকে বোঝায়। উভয় প্ল্যাটফর্মের জন্য, আপনি নিম্নলিখিত উপাদানটি ব্যবহার করতে পারেন:

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'
  }
});

4
নির্বাচিত উত্তরটি অ্যান্ড্রয়েডে (আরএন 35) আমার পক্ষে ভাল কাজ করেছে।
পেদ্রাম

4
@ জ্যাকবলৌরিৎসেন এখন আমার ঠিক উত্তরটি অনুলিপি করার পরে এখন একই অবস্থা: / স্ট্যাকওভারফ্লো.com/ posts
কুফ

21

এটি করার জন্য, আমি দৃ strongly়ভাবে একটিতে একটি Textউপাদান মোড়ানো বিবেচনা করব TouchableOpacity। যখন একটিTouchableOpacity স্পর্শ করা হয়, এটি বিবর্ণ হয় (কম অস্বচ্ছ হয়ে ওঠে)। পাঠ্যটি স্পর্শ করার সময় এটি ব্যবহারকারীর তাত্ক্ষণিক প্রতিক্রিয়া দেয় এবং উন্নত ব্যবহারকারীর অভিজ্ঞতা সরবরাহ করে।

লিঙ্কটি ঘটতে আপনি onPressসম্পত্তিটি ব্যবহার করতে পারেন TouchableOpacity:

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

13

নেটিভ ডকুমেন্টেশন প্রতিক্রিয়া ব্যবহারের পরামর্শ দেয় Linking:

রেফারেন্স

এখানে একটি খুব বেসিক ব্যবহারের কেস:

import { Linking } from 'react-native';

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

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

আপনি কার্যকরী বা শ্রেণীর উপাদান স্বরলিপি, ডিলার পছন্দ ব্যবহার করতে পারেন।


লিঙ্কিংআইওএসকে অবমূল্যায়ন করা হয়েছে, লিঙ্কিং ব্যবহার করুন।
জেসনলোনহার্ড

4

নেটিভ হাইপারলিঙ্ক প্রতিক্রিয়া ব্যবহার করুন (নেটিভ <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>

4

উপরের প্রতিক্রিয়াগুলিতে যুক্ত করার জন্য আরেকটি সহায়ক নোট হ'ল কিছু ফ্লেক্সবক্স স্টাইলিং যুক্ত করা। এটি পাঠ্যটিকে এক লাইনে রাখবে এবং নিশ্চিত করবে যে পাঠ্যটি স্ক্রিনকে ওভারল্যাপ করে না।

 <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

প্রতিক্রিয়া নেটিভের জন্য, অ্যাপটিতে হাইপারলিংকগুলি খোলার পাঠাগার রয়েছে। https://www.npmjs.com/package/react-native-hyperlink

এগুলি ছাড়াও, আমি মনে করি আপনাকে ইউআরএল পরীক্ষা করতে হবে এবং সেরা পদ্ধতির নাম রেজেজ ge https://www.npmjs.com/package/url-regex


আপনি যদি আইওএসের জন্য নির্মাণ করছেন, এসভিসি লিঙ্কিংয়ের পরিবর্তে (সাফারি ব্রাউজারে খোলার জন্য) প্রয়োগের জন্য আরও ভাল পন্থা। github.com/naoufal/react-native-safari-view
রাজা

2

প্রতিক্রিয়া নেটিভ থেকে মডিউলটির সংযোগ আমদানি করুন

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

এটি ব্যবহার করে দেখুন: -

<TouchableOpacity onPress={() => Linking.openURL('http://Facebook.com')}>
     <Text> Facebook </Text>     
</TouchableOpacity>

1

আপনি যদি লিঙ্কগুলি এবং অন্যান্য ধরণের সমৃদ্ধ পাঠ্য করতে চান তবে আরও কার্যকর সমাধান হ'ল রিএ্যাক্ট নেটিভ এইচটিএমএল ভিউ ব্যবহার করা ।


4
যদিও এই লিঙ্কটি প্রশ্নের উত্তর দিতে পারে, উত্তরের প্রয়োজনীয় অংশগুলি এখানে অন্তর্ভুক্ত করা এবং রেফারেন্সের জন্য লিঙ্কটি সরবরাহ করা ভাল। লিঙ্কযুক্ত পৃষ্ঠাগুলি পরিবর্তিত হলে লিঙ্ক-শুধুমাত্র উত্তরগুলি অবৈধ হতে পারে। - পর্যালোচনা থেকে
Ari0nhh

@ এরি0 হ্নহ আমি আপনার মন্তব্যে সাড়া দেওয়ার একমাত্র উপায় হওয়ায় আমি প্রশ্নটি মুছে ফেলেছি। এসওতে প্রচুর নজির রয়েছে যেখানে একটি উচ্চ র‌্যাঙ্কড উত্তর কেবল একটি ভাল লাইব্রেরির লিঙ্ক। প্লাস অন্যান্য উত্তরগুলি ইতিমধ্যে একটি সাধারণ বাস্তবায়ন কভার করে। আমি মনে করি আমি এটি মূল প্রশ্নের মন্তব্য হিসাবে পোস্ট করতে পারি, তবে আমি এটিকে একটি সত্য উত্তর হিসাবে দেখছি view এবং এখানে লিঙ্কটি রেখে যাওয়া ভবিষ্যতের সন্ধানকারীদের জন্য কমপক্ষে একটি কমল, যদি লোকেরা এটি সম্পাদনা করতে এবং আরও ভাল উদাহরণ দিয়ে উন্নত করতে চান তবে কমপক্ষে এখন আর একটি জায়গা শুরু করার আছে।
এলিয়ট

1

ভেবেছি আমি এই সমস্যাটি এখন যে কেউ আবিষ্কার করছে তার সাথে আমার স্ট্রিমের মধ্যে এম্বেড থাকা লিঙ্কগুলি ভাগ করব এটি লিঙ্কগুলিকে এটিকে যে কোনও স্ট্রিংতে খাওয়ানো হয় তা গতিসম্পন্ন করে ইনলাইন করার চেষ্টা করে।

আপনার প্রয়োজন অনুসারে এটি নিঃসঙ্কোচ করুন। এটি আমাদের উদ্দেশ্যে যেমন কাজ করছে:

এটি https://google.com কীভাবে প্রদর্শিত হবে তার একটি উদাহরণ ।

এটি গিস্ট এ দেখুন:

https://gist.github.com/Fenderly-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

আপনি লিঙ্কিং প্রপার্টি ব্যবহার করতে পারেন <টেক্সট স্টাইল = {{রঙ: 'স্কাই ব্লু'}} অনপ্রেস = {() => লিঙ্কিং.ওপেন URL ('http://yahoo.com') Yah> ইয়াহু

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.