Eu quero ser capaz de passar texto com tags HTML, assim:
<MyComponent text="This is <strong>not</strong> working." />
Mas dentro do MyComponent
método de render de, quando eu imprimo this.props.text
, ele literalmente imprime tudo:
This is <strong>not</strong> working.
Existe alguma maneira de fazer o React analisar o HTML e descartá-lo corretamente?
<MyComponent>This is <strong>not</strong> working</MyComponent>
, em vez de passá-los como acessórios. Você poderia dar mais contexto sobre o que você está realmente tentando realizar?Respostas:
Você pode usar matrizes mistas com strings e elementos JSX (consulte a documentação aqui ):
Há um violino aqui que mostra que ele está funcionando: http://jsfiddle.net/7s7dee6L/
Além disso, como último recurso, você sempre tem a capacidade de inserir HTML bruto, mas tome cuidado porque isso pode abrir você para um ataque de script entre sites (XSS) se não estiver higienizando os valores das propriedades.
fonte
{text.map( textOrHTML, index) => <span key={index}>{textOrHTML}</span> )}
Embora seja tão estranho que tenhamos que fazer isso inteiramente em primeiro lugar.key="[some unique value]"
o<strong>
elemento.<MyComponent text={<>This is <strong>not</strong> working.</>} />
Na verdade, existem várias maneiras de fazer isso.
Você quer usar JSX dentro de seus adereços
Você pode simplesmente usar {} para fazer com que JSX analise o parâmetro. A única limitação é a mesma para cada elemento JSX: ele deve retornar apenas um elemento raiz.
A maneira mais legível de fazer isso é criar uma função renderMyProp que retornará componentes JSX (assim como a função de renderização padrão) e, em seguida, simplesmente chamar myProp = {this.renderMyProp ()}
Você quer passar apenas HTML como string
Por padrão, JSX não permite renderizar HTML bruto a partir de valores de string. No entanto, há uma maneira de fazer isso:
Então, em seu componente, você pode usá-lo assim:
Esteja ciente de que esta solução 'pode' abrir em ataques de falsificação de script entre sites. Também tome cuidado para que você só possa renderizar HTML simples, nenhuma tag JSX ou componente ou outras coisas sofisticadas.
A forma de array
Em resposta, você pode passar uma matriz de elementos JSX. Que significa:
Eu não recomendaria esse método porque:
O jeito das crianças
Adicionando-o por uma questão de integridade, mas em reação, você também pode obter todos os filhos que estão "dentro" do seu componente.
Então, se eu pegar o seguinte código:
Em seguida, os dois divs estarão disponíveis como this.props.children em SomeComponent e podem ser renderizados com a sintaxe {} padrão.
Esta solução é perfeita quando você tem apenas um conteúdo HTML para passar para o seu componente (imagine um componente Popin que leva apenas o conteúdo do Popin como filho).
No entanto, se você tiver vários conteúdos, não pode usar filhos (ou você precisa pelo menos combiná-los com outra solução aqui)
fonte
this.props.children
. Sem 's' reactjs.org/docs/glossary.html#propschildrenVocê pode usar hazardouslySetInnerHTML
Basta enviar o html como uma string normal
E renderize no código JSX assim:
Apenas tome cuidado se você estiver renderizando dados inseridos pelo usuário. Você pode ser vítima de um ataque XSS
Aqui está a documentação: https://facebook.github.io/react/tips/dangerously-set-inner-html.html.html
fonte
e, em seu componente, você pode fazer a verificação de prop como:
Certifique-se de escolher apenas um tipo de suporte.
fonte
Para mim funcionou passando tag html em adereços infantis
fonte
No React v16.02 você pode usar um Fragment.
Mais informações: https://reactjs.org/blog/2017/11/28/react-v16.2.0-fragment-support.html
fonte
Em um aplicativo de reação do lado do cliente, existem algumas maneiras de renderizar um prop como uma string com algum html. Um mais seguro que o outro ...
1 - Defina o prop como jsx (minha preferência)
• O único requisito aqui é que qualquer arquivo que esteja gerando este prop precisa incluir React como uma dependência (no caso de você estar gerando o jsx do prop em um arquivo auxiliar, etc.).
2 - Defina o innerHtml perigosamente
• Esta segunda abordagem é desencorajada. Imagine um campo de entrada cujo valor de entrada é renderizado como um suporte neste componente. Um usuário poderia inserir uma tag de script na entrada e o componente que renderiza essa entrada executaria esse código potencialmente malicioso. Como tal, esta abordagem tem o potencial de introduzir vulnerabilidades de script entre sites. Para obter mais informações, consulte os documentos oficiais do React
fonte
Defina o tipo de proposta de texto para qualquer e faça o seguinte:
Exemplo
fonte
Você pode fazer isso de duas maneiras que eu conheço.
1-
<MyComponent text={<p>This is <strong>not</strong> working.</p>} />
E então faça isso
Ou segunda abordagem, assim
2-
<MyComponent><p>This is <strong>not</strong> working.</p><MyComponent/>
E então faça isso
fonte
let vhtml = "<p>Test</p>"
e usei-a no suporte como estetext={vhtml}
e ainda renderizado em texto simples por algum motivo.A resposta @matagus é boa para mim, espero que o snippet abaixo seja ajudado aqueles que desejam usar uma variável dentro.
fonte
Em meu projeto, tive que passar um snippet html dinâmico da variável e renderizá-lo dentro do componente. Então eu fiz o seguinte.
O objeto defaultSelection é passado para o componente do
.js
arquivoComponente HtmlSnippet
Exemplo de Plunkr
reagir doc para hazardouslySetInnerHTML
fonte
Você também pode usar uma função no componente para passar jsx para os adereços. gostar:
fonte
Sim, você pode fazer isso usando mix array com strings e elementos JSX. referência
fonte
Parser do html-react-parser é uma boa solução. Você só tem de
ligue com:
e funciona bem.
fonte
Adicionando à resposta: se você pretende analisar e já está no JSX, mas tem um objeto com propriedades aninhadas, uma maneira muito elegante é usar parênteses para forçar a análise JSX:
fonte
Esta pergunta já tem muitas respostas, mas estava fazendo algo errado em relação a isso e acho que vale a pena compartilhar:
Eu tinha algo assim:
mas a massagem era mais longa do que isso, então tentei usar algo assim:
Demorei um pouco para perceber que estava faltando () na chamada de função.
Não está funcionando
Trabalhando
talvez isso ajude você, como ajudou a mim!
fonte
Você pode utilizar fragmentos React com sucesso para esta tarefa. Dependendo da versão que você usa Reagir, você pode usar short sintaxe:
<>
ou a tag completa:<React.Fragment>
. Funciona especialmente bem se você não quiser envolver a string inteira em tags HTML.fonte
Podemos fazer a mesma coisa dessa maneira.
agora você deseja enviar este HTML dentro de outro componente cujo nome é Componente pai.
Ligando: -
Uso da criança: -
este trabalho é perfeito para mim.
fonte
Anexei o html em componentDidMount usando jQuery append. Isso deve resolver o problema.
fonte