2017-02-15 2 views
0

У меня есть ответ сервера, который содержит строку html, которая передается компоненту реакции в качестве опоры. Внутри html есть коды, которые необходимо заменить компонентами React.Как объединить строку с JSX

Я использовал реакцию-заменитель-заменитель, чтобы заставить это работать, но он не работает с HTML, поскольку теги избегают React. Кто-нибудь знает, как это может быть исправлено?

import React from 'react'; 

import replace from 'react-string-replace'; 
const reg = /\{(name)\}/g; 


const Name = props => { 
    return (
     <div>Hello {props.name}</div> 
    ) 
} 


class Embed extends React.Component { 

    render() { 

     const person = this.props.person 
     const component = <Name name={person.name} key={person.id} />; 
     const output = replace(
      this.props.content, 
      reg, 
      prop => component 
     ); 

     return (
      <div>{output}</div> 
     ) 
    } 
} 

const Greeting = props => { 
    return <Embed content="<div><h1>Greetings</h1> <strong>{name}</strong></div>" person={{ name: 'John', id: 123 }} />; 
}; 

export default Greeting; 

ответ

0

Попробуйте это -

class Embed extends React.Component { 

render() { 

    const person = this.props.person 
    const component = <Name name={person.name} key={person.id} />; 
    const output = replace(
     this.props.content, 
     reg, 
     prop => component 
    ); 

    return (
     <div dangerouslySetInnerHTML={{ __html: output }}></div> 
    ) 
    } 
} 

Я предлагаю намного лучший способ сделать его как ниже -

const reg = /\{(name)\}/g; 
 

 
const Name = props => { 
 
    return (
 
     <div>Hello {props.name}</div> 
 
    ) 
 
} 
 

 

 
class Embed extends React.Component { 
 

 
    render() { 
 

 
     const person = this.props.person; 
 
     const component = <Name name={person.name} key={person.id} />; 
 

 
     return (
 
      <div><h1>Greetings</h1> <strong>{component}</strong></div> 
 
     ); 
 
    } 
 
} 
 

 
const Greeting = props => { 
 
    return (<Embed person={{ name: 'John', id: 123 }} > 
 
     
 
    </Embed>); 
 
}; 
 

 
ReactDOM.render(
 
    <Greeting/>, 
 
    document.getElementById('test') 
 
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script> 
 
<div id="test"> 
 
</div>

+0

Спасибо за ваш ответ. К сожалению, это вернет html-рендеринг правильно, но компонент jsx Name в качестве [object Object] – Adam

+1

Могу ли я узнать, почему вы передаете строку как jsx, когда вы можете передать сам компонент либо через prop, либо через дочерние элементы. – WitVault

+0

Это упрощенный пример что я работаю, но компонент Embeds имеет поддержку содержимого, которая поступает с сервера. Я не могу контролировать, что это происходит как HTML или что у него должно быть что-то из этой строки. – Adam

0

хочет напомнить вам это:

От Facebook React Doc:

dangerouslySetInnerHTML является Реагировать на замену для использования innerHTML в браузер DOM. В общем, установка HTML из кода рискованна, потому что легко непреднамеренно подвергать пользователей межсайтовому скрипту (XSS). Таким образом, вы можете установить HTML непосредственно из React, но у вас есть , чтобы напечатать опасноSetInnerHTML и передать объект с помощью ключа __html , чтобы напомнить себе, что это опасно.

Попробуйте это: рабочий пример

const Name = props => { 
    return (
     <div> 
      Hello {props.name} 
     </div> 
    ) 
} 

class Embed extends React.Component { 
    render() { 
    let content = this.props.content.replace('{name}', this.props.person.name); 
     return (
      <div> 
       <Name person={this.props.person}/> 
       <div dangerouslySetInnerHTML={{ __html: content}}></div> 
      </div> 
     ) 
    } 
} 

const Greeting = props => { 
    return <Embed content="<div><h1>Greetings</h1> <strong>{name}</strong></div>" person={{ name: 'John', id: 123 }} />; 
}; 

ReactDOM.render(<Greeting />, document.getElementById('container')); 

Проверка на jsfiddle: https://jsfiddle.net/h81q9nqd/

+0

Спасибо за ваш ответ. Мой пример, вероятно, слишком прост. То, что я действительно хочу достичь, основано на совпадении в регулярном выражении, отображающем другой компонент. Поэтому замещение в компоненте Name слишком поздно, так как решение о том, какой компонент должен быть рендерингом, необходимо выполнить перед рендерингом компонента Name. – Adam

+0

вы можете использовать reg, чтобы подготовить строку, которую вы хотите визуализировать, у меня нет идеи о 'response-string-replace', поэтому для замены обычной строки заменить, аналогично использовать reg для подготовки строки в ур случае, любые строки манипуляции я сделал в компоненте «Название» мы можем поместить это в 'Embed' comp также, проверьте обновленный скрипт :) –

+0

К сожалению, это только заменяет части строки строкой. То, что я пытаюсь сделать, это заменить части строки компонентом. Вот откуда и возникла необходимость использования реакции-замены-замены. Если вы видите порядок вывода в своей скрипке, это Привет, Привет, Джон, который должен приветствовать Привет, Джон. – Adam

Смежные вопросы