Home > Enterprise >  How to create a page from the id parameter in the url
How to create a page from the id parameter in the url

Time:01-02

I'm trying to create a single page from the id that is passed as a parameter.

my routes structure:

enter image description here

When I pass the mouse over an item in my list I get the id of the firebase document so I need to create a page to show the data in the documents based on their ids.

http://localhost:3000/category/rent/541KqSMHpU17QuYLihFs

id:

541KqSMHpU17QuYLihFs

My listItem component:

<script>
    export let listing
    export let id
    export let handleDelete
    import DeleteIcon from '../../static/assets/svg/deleteIcon.svg'
</script>

<li >
    <a href={`/category/${listing.type}/${id}`} >
        <img src={listing.imgUrls[0]} alt={listing.name}  />
        <div >
            <p >
                {listing.location}
            </p>
            <p >
                {listing.name}
            </p>
            <p >
                ${listing.offer
                    ? listing.discountedPrice.toString().replace(/\B(?=(\d{3}) (?!\d))/g, '.')
                    : listing.regularPrice.toString().replace(/\B(?=(\d{3}) (?!\d))/g, '.')}
                {listing.type === 'rent' ? '/ por mês' : ''}
            </p>
            <div >
                <img src="/assets/svg/bedIcon.svg" alt="cama" />
                <p >
                    {listing.bedrooms > 1 ? `${listing.bedrooms} camas` : `${listing.bedrooms} cama`}
                </p>
                <img src="/assets/svg/bathtubIcon.svg" alt="banheiro" />
                <p >
                    {listing.bathrooms > 1
                        ? `${listing.bathrooms} banheiros`
                        : `${listing.bathrooms} banheiro`}
                </p>
            </div>
        </div>
    </a>
    {#if handleDelete}
        <DeleteIcon
            
            fill="rgb(231, 76, 60)"
            onClick={() => {
                handleDelete(listing.id, listing.name)
            }}
        />
    {/if}
</li>

The important thing here is it:

<a href={`/category/${listing.type}/${id}`} >

How do I make my [listingId] slug be the id page?

my [listingId].svelte so far:

<script>
    import { page } from '$app/stores'
    const listingId = $page.params.listingId
    import { db } from '../../../../firebase.config.js'

    // get the id parameter from the url

</script>

Happy new Year!!

CodePudding user response:

I had a little trouble understanding your question at first.

As it stands now, your URIs are in the shape /category/id/[listingId], so http://localhost:3000/category/rent/541KqSMHpU17QuYLihFs won't get matched. What you need are URIs in the shape of /category/[id]/[listingId]. So you need to rename your id directory to [id] in order to make it dynamic.

You will then be able to retrieve the id the same way you do listingId:

<script>
    import { page } from '$app/stores'
    const { id, listingId }  = $page.params
    import { db } from '../../../../firebase.config.js'

    // do stuff

</script>

With the above URL as an example, id will hold the value 'rent' and listingId will hold the value '541KqSMHpU17QuYLihFs'.

Hope this answers your question (and happy new year to you as well!)

Edit: a better, more explicit name for the [id] parameter would be [listingCategory] and would improve the readability of your code/the understanding of your intent.

  • Related