¿Cómo crear href dinámico en la función de renderizado de reacción?


105

Estoy mostrando una lista de publicaciones. Para cada publicación, me gustaría representar una etiqueta de anclaje con la identificación de la publicación como parte de la cadena href.

render: function(){
    return (
        <ul>
            {
                this.props.posts.map(function(post){
                    return <li key={post.id}><a href='/posts/'{post.id}>{post.title}</a></li>
                })
            }
        </ul>
    );

¿Cómo lo hago para que cada publicación tenga href de /posts/1, /posts/2etc.?

Respuestas:


192

Utilice la concatenación de cadenas:

href={'/posts/' + post.id}

La sintaxis JSX permite utilizar cadenas o expresiones ({...})como valores. No puedes mezclar ambos. Dentro de una expresión, puede, como sugiere su nombre, utilizar cualquier expresión de JavaScript para calcular el valor.


1
muy sensible. ¡Gracias!
Connor Leech

1
funciona muy bien, pero si está utilizando un compilador como babel, las cadenas de plantillas son más elegantes.
HussienK

¿y si es un mailto?
tallgirltaadaa

@tallgirltaadaa: no hay diferencia. JSX / JavaScript no se preocupa por el valor real de la cadena.
Felix Kling

87

También puede usar la sintaxis de comillas invertidas de ES6

<a href={`/customer/${item._id}`} >{item.get('firstName')} {item.get('lastName')}</a>

Más información sobre literales de plantilla es6


para que esto funcione, ¿es necesario usar "y no"?
Joe Lloyd

3
Sí, el backtick es una nueva sintaxis es6 para la interpolación de cadenas. Actualicé mi respuesta con un enlace
Nath

2

Además de la respuesta de Felix,

href={`/posts/${posts.id}`}

también funcionaría bien. Esto es bueno porque está todo en una sola cadena.


0

¿Podrías intentar esto?

Cree otro elemento en la publicación como post.link y luego asígnele el enlace antes de enviar la publicación a la función de renderizado.

post.link = '/posts/+ id.toString();

Entonces, la función de renderización anterior debería seguir en su lugar.

return <li key={post.id}><a href={post.link}>{post.title}</a></li>
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.