2017-03-07 9 views
0

私はvar str = '<Text> something </Text>'を持っていますが、それをコンポーネントにレンダリングできますか?React-Nativeの文字列をコンポーネントに変更するにはどうすればいいですか?

私は次のことを試してみましたが、それは

var str = '<Text>test</Text>' 
    render(){ 
     return(
      <Text>{str}</Text> 
     ) 
    } 

が反応でdangerouslySetInnerHTMLに似てこれを行うにはどのような方法がある:(動作しません?

私のプロジェクトでは、私がでJSONを取得私は正規表現によってようにTextにhtml要素p等を交換したいだけ

{ 
    content:'<p>example</p>' 
} 

のようにフェッチが、 resultは文字列です。

私もreact-native-html-renderを試しましたが、ドキュメントは理解できず、うまく動作しません。

+1

この質問はこの質問と非常によく似ています。http://stackoverflow.com/questions/41139643/react-native-how-to-change-text-value-dynamically/41139864#41139864 –

答えて

1

応答の内部HTMLをRN Text要素に変換する関数を作成できます。

残念ながら
var str = '<p>something here</p>' 

var convertToText = (response) => { 
    var text = response.split(/[^A-Za-z]/).filter(x => x !== '').slice(1, -1).join(' ') //gives "something here"; 
    return <Text>text</Text>; 
} 

convertToText(str) === <Text>something here</Text> 
+0

ありがとう、私はすでに私の質問を編集して、私はこの問題を解決することができますか?ありがとうございました。 – MonkeyFigaro

+0

私の答えを更新した、基本的には、この関数を使用してテキスト要素に変換することができますが、応答に何であるかに基づいて別の要素が必要な場合は、いくつかの構成を追加する必要があります。 –

+0

実際に私はこれが1つの単語の要素に対してのみ機能していることを認識しました。 –

0
var str = <Text>test</Text>; 

    render() { 
    return (
     <View style={styles.container}> 
     {str} 
     </View> 
    ); 
    } 
+0

thx、実際はフェッチの応答、私はあなたが言ったようにstrを設定することはできませんでした... – MonkeyFigaro

1

州の一部として設定します(例:this.state.str)。コンストラクタで、デフォルト値(例:this.state = {str: "test"})を設定します。フェッチを行う関数でsetStateを実行して値を変更します(例:this.setState({str: response}))。最後に、レンダリングでは次のようにします。

0

JSXはReact.createElement呼び出しにtranspiledにつれて、コンパイル時に組み込まれる必要があるタグ。または、自分でReact.createElementコールを書くこともできます。

たとえば、サーバー応答でJSXツリーを歩くことができるパーサーを作成することができます。何かのように

function parseResponseIntoJSXTree (string) { 
    // very psuedo example: 
    var type = parseJSXTag(string) // produces `Text` 
    var props = parseJSXTagProps(string) // produce any attribute=values 
    var innerContent = parseJSXContent(string) // produces 'something' 
    return React.createElement(type, props, children) 
} 

ルートノードよりも深い子要素がある場合は、ツリーを歩く必要があるため、これは表面を傷つけるだけです。

私の恐ろしい、恐ろしい答えますか? は、あなたのバンドルにbabelを含めると実行します。

var renderableContent = require('babel-core', {presets: ['react-native']) 
    .transform('<Text>something</Text>') 

注 - babelランタイム(おそらく)には存在しないであろうノードの依存関係を必要としない限り、私は非常にこれを阻止、それは技術的に働くだろう。

+0

ありがとう!しかし、パースを書くのは少し難しいようです。そして、あなたが言った_礼儀正しい答え_それは**考えられる有用な方法かもしれません。もう一度ありがとう! – MonkeyFigaro

0

私の要件は、JSONサーバーの応答に応じて、任意のコンポーネントを含む動的な画面を作成する場合と似ています。ここに私がやったことです:

const blockContent = [ 
    { 
    type: 'text', 
    content: 'Some title', 
    size: 20, 
    color: 'black', 
    wrapperPadding: 10 
    }, 
    { 
     type: 'text', 
     wrapperPadding: 10, 
     size: 16, 
     color: 'red', 
     content: 'Some text. Some text. Some text. Some text. Some text. ' 
    }, 
    { 
     type: 'text', 
     wrapperPadding: 10, 
     size: 16, 
     color: 'red', 
     content: 'Some text. Some text. Some text. Some text. Some text. ' 
    }, 
    { 
     type: 'link', 
     content: 'Some link', 
     size: 16, 
     color: 'blue', 
     wrapperPadding: 10, 
     url: 'http://www.google.com' 
    } 
]; 

    class CustomBlock extends Component { 

     openURL (url) { 
     Linking.openURL(url).catch(err => console.error('An error occurred', err)); 
     } 

     render() { 
     return (
      <View style={styles.container}> 
      {blockContent.map((item) => { 
       switch (item.type) { 
       case 'text': 
        return (
        <View style={{padding: item.wrapperPadding}}> 
         <Text style={{fontSize: item.size, color: item.color}}>{item.content}</Text> 
        </View> 
       ); 
       case 'link': 
        return (
        <TouchableHighlight style={{padding: item.wrapperPadding}} underlayColor="lightgrey" onPress={this.openURL.bind(this, item.url)}> 
         <Text style={{fontSize: item.size, color: item.color}}>{item.content}</Text> 
        </TouchableHighlight> 
       ); 
       } 
      })} 
      </View> 
     ); 

それはあなたが、私はテキストとリンクで行ったように使用すると、同様にそれらのスタイルを期待するすべてのコンポーネントを宣言するのは非常に簡単です。

関連する問題