2016-09-08 23 views
5

Mam komponent React zdefiniowane w JSX która zwraca komórkę przy użyciu td lub th, np:JSX z tagiem HTML zmiennej

if(myType === 'header') { 
    return (
    <th {...myProps}> 
     <div className="some-class">some content</div> 
    </th> 
); 
} 

return (
    <td {...myProps}> 
    <div className="some-class">some content</div> 
    </td> 
); 

możliwe byłoby napisać JSX w taki sposób, czy tag HTML pochodzi ze zmiennej? Jak:

let myTag = myType === "header" ? 'th' : 'td'; 
return (
    <{myTag} {...myProps}> 
    <div className="some-class">some content</div> 
    </{myTag}> 
); 

Powyższy kod zwróci błąd „nieoczekiwany znak” wskazując na {. Używam webpacka z wtyczką babel do kompilacji JSX.

Odpowiedz

5

Spróbuj ustawić swój stan podzespołów i rendering tak:

render: function() { 

      return(
       <this.state.tagName {...myProps}> 
        <div className="some-class">some content</div> 
       </this.state.tagName> 
      ); 

     }, 
+2

Eh, dzięki za cynk. Będzie działać bez obawy o stan, po prostu przypisz nazwę zmiennej do zmiennej i użyj jej wewnątrz JSX, np .: 'let tx = 'td'; return ( ... 'itd. – Amiramix

+0

W rzeczywistości nazwa zmiennej musi zaczynać się od dużej litery, w przeciwnym razie reaguje traktując ją jako znacznik HTML i wyświetla' tx' zamiast wartości Zmienna Jeśli nazwa zmiennej to 'Tx', to poprawnie renderuje jej zawartość (np.' td' lub 'th'). – Amiramix

5

można zrobić coś takiego:

const content = <div> some content </div> 
return (
    {myType === 'header' 
    ? <th>{content}</th> 
    : <td>{content}</td> 
    } 
) 

Zauważ, że to naprawdę nie rozwiąże pytanie o „dynamicznym tagiem”, ale raczej problemu to wydaje się mieć.

+0

Czy przetestować to rozwiązanie? Czy będzie działać bez 'niebezpiecznieSetInnerHTML'? Czy nie napotkasz problemu opisanego na http://stackoverflow.com/questions/36800148/how-to-render-jsx-html-to-is-inside-variable-or-prop i http://stackoverflow.com/questions/23616226/insert-html-with-react-variable-statements-jsx? – Amiramix

+0

To nie robi tego samego. W twoim linku używają ciągów zawierających znaczniki html. Nie to robię tutaj. – Amida

+0

Och, widzę, masz rację, to też powinno działać. – Amiramix