2016-11-19 60 views
0

創建DOM如何改造這個:ReactJS:在飛行

{dataFormat: 'hello my [friend=https://en.wikipedia.org/wiki/Friendship]'} 

這樣:

<div> 
    hello my <a onClick={...} href="https://en.wikipedia.org/wiki/Friendship">friend</a>   
</div> 

我需要以某種方式能夠掃描一個字符串和動態創建鏈接。任何想法?

dataFormat可以在「常規」文本和鏈接之間包含多個具有未知順序的鏈接。

+1

你試過了嗎?使用'React.createElement'而不是JSX這非常簡單。 –

+0

是的,我想,使用正則表達式。你能否詳細說明你的建議? – Guy

回答

0

使用正則表達式完成了工作。

JSBin:https://jsbin.com/yogepa/edit?js,output

代碼:

renderSpan(content) { 
    return <span> 
     {content} 
    </span> 
} 

renderLink(content) { 
    const parts = content 
      .replace(/\[|\]/g, '') 
      .split('='); 

    return <a style={ styles.link } onClick={ alert }> 
     {parts[0]} 
     </a> 
} 

renderFormat() { 
    let { dataFormat } = this.state; 

    const regex = /(\[[^\]]+])*([^\[]+)(\[[^\]]+])*(\[[^\]]+])*([^\[]+)(\[[^\]]+])*(\[[^\]]+])*([^\[]+)(\[[^\]]+])*/; 

    const matches = regex.exec(dataFormat); 

    return matches.reduce((output, match, index) => { 

     if (match && index >= 2) { 
      output.push(match.indexOf('[') >= 0 ? 
       this.renderLink(match) : 
       this.renderSpan(match) 
      ); 
     } 

     return output; 
    }, []); 
} 

我可能雖然提高了正則表達式表達。

result