Eu tenho um componente que exibirá Array of String. O código se parece com isso.
React.createClass({
render() {
<div>
this.props.data.map(t => <span>t</span>)
</div>
}
})
Está funcionando perfeitamente bem. ou seja, se props.data = ['tom', 'jason', 'chris'] O resultado renderizado na página seria tomjasonchris
Então, eu quero juntar todos os nomes usando vírgulas, então eu mudo o código para
this.props.data.map(t => <span>t</span>).join(', ')
No entanto, o resultado renderizado é [Object], [Object], [Object].
Eu não sei como interpretar objetos para se tornarem componentes de reação a serem renderizados. Alguma sugestão ?
If the array is empty and no initialValue was provided, TypeError would be thrown.
. então não funcionará para array vazio.prev
matriz. por exemplo,[1, 2, 3, 4]
torna-se[[[1,",",2],",",3],",",4]
..reduce((prev: JSX.Element, current: JSX.Element): any => [prev, (<span> </span>), current])
Você pode usar
reduce
para combinar vários elementos de uma matriz:Isso inicializa o acumulador com nulo, portanto, podemos envolver o primeiro item em um array. Para cada elemento seguinte na matriz, construímos uma nova matriz que contém todos os elementos anteriores usando o
...-operator
, adicionamos o separador e, em seguida, o próximo elemento.Array.prototype.reduce ()
fonte
['a'].reduce((a, e) => [...a, ',', e],[])
rendimentos[",", "a"]
. Não passar nenhum inicializador funciona, a menos que o array esteja vazio; nesse caso, ele retorna um TypeError.Atualização com React 16: agora é possível renderizar strings diretamente, então você pode simplificar seu código removendo todas as
<span>
tags inúteis .fonte
A resposta aceita realmente retorna uma matriz de matrizes porque
prev
será uma matriz. O React é inteligente o suficiente para fazer isso funcionar, mas é propenso a causar problemas no futuro, como quebrar o algoritmo de comparação do Reacts ao fornecer as chaves para cada resultado do mapa.O novo
React.Fragment
recurso nos permite fazer isso de maneira fácil de entender, sem os problemas subjacentes.Com
React.Fragment
, podemos simplesmente colocar o separador,
fora do HTML retornado e o React não reclamará.fonte
o que
<span>{t}</span>
você está retornando é um objeto, não uma string. Verifique os documentos de reação sobre isso https://facebook.github.io/react/docs/jsx-in-depth.html#the-transformAo usar
.join()
na matriz retornada demap
, você está unindo a matriz de objetos.[object Object], ...
Você pode colocar a vírgula dentro do
<span></span>
para que seja renderizado da maneira que você deseja.amostra: https://jsbin.com/xomopahalo/edit?html,js,output
fonte
Minha variante:
fonte
Se eu só quiser renderizar uma matriz de componentes separados por vírgulas, geralmente acho
reduce
muito prolixo. Uma solução mais curta em tais casos é{index > 0 && ', '}
irá renderizar uma vírgula seguida por um espaço na frente de todos os itens da matriz, exceto o primeiro.Se você quiser separar o penúltimo item e o último por outra coisa, digamos a string
' and '
, você pode substituir{index > 0 && ', '}
porfonte
Usando o es6, você pode fazer algo como:
E então execute:
fonte
Use uma matriz aninhada para manter "," fora.
Otimize-o salvando os dados na matriz e modifique o último elemento em vez de verificar se é o último elemento o tempo todo.
fonte
Isso funcionou para mim:
fonte
Conforme mencionado por Pith , o React 16 permite que você use strings diretamente, portanto, envolvê-las em tags span não é mais necessário. Com base na resposta de Maarten , se você também quiser lidar com uma mensagem personalizada imediatamente (e evitar lançar um erro no array vazio), você pode conduzir a operação com uma instrução if ternária na propriedade length do array. Isso poderia ser algo assim:
fonte
Isso deve retornar uma matriz plana. Lida com o caso com o primeiro objeto não iterável, fornecendo uma matriz vazia inicial e filtra a primeira vírgula desnecessária do resultado
fonte
Eu sou o único que acha que há muita divulgação e aninhamento desnecessários acontecendo nas respostas aqui? Pontos por ser conciso, claro, mas deixa a porta aberta para questões de escala ou React, alterando a forma como lidam com matrizes / fragmentos aninhados.
Uma matriz, sem aninhamento. Nenhum método de encadeamento sexy também, mas se você se pega fazendo isso com frequência, pode sempre adicioná-lo ao protótipo do array ou envolvê-lo em uma função que também receba um retorno de chamada de mapeamento para fazer tudo de uma vez.
fonte
fonte