Повышайте свои навыки: расширьте возможности своего приложения React с помощью React-Router-Dom State Lifting!

Понимание состояний React. Состояние — это объект, представляющий текущее состояние компонента. Он содержит данные, которые могут меняться со временем, и определяет поведение и отрисовку компонента. Когда состояние обновляется, React автоматически перерисовывает компонент, чтобы отразить изменения.
Вот фрагмент кода, иллюстрирующий это:

import { useState } from "react"

export function App () {
    const [count, setCount] = useState(0);
    const handleAdd = () => setCount(prev => prev + 1)
    return (
        <div>Count is { count } </div>
        <button onClick={handleAdd}>Increment</button>
    );
}

Я определил базовую функцию подсчета с помощью кнопки, которая увеличивает состояние подсчета на единицу (1) при каждом нажатии, используя версию текущего состояния и обновленную версию.
Предполагается, что теперь вы понимаете, как работают состояния React. так как мы хотели бы углубиться, чтобы увидеть, как мы можем переместить состояния в URL.

Зачем перемещать состояния в URL?

Например, мы намерены создать веб-сайт электронной коммерции с использованием React JS. Затем мы намерены хранить всю информацию о нашем веб-сайте в состоянии :(
Это не идеально, поскольку URL-адрес продукта не должен храниться в состоянии. Но Почему?< br /> Помните, что состояние находится на устройстве пользователя и недоступно где-либо еще. Это снизит уровень нашей монетизации, поскольку пользователи не могут делиться продуктами с друзьями, поскольку все это жестко запрограммировано в состоянии.
Это становится самое время переместить состояния на URL, чтобы они были доступны всем и ими можно было поделиться. 😊

Это означает:

  • Параметры URL можно добавлять в закладки и делиться ими
  • Это улучшает пользовательский опыт, позволяя пользователям перемещаться вперед и назад очень удобным способом.

Теперь я могу добиться этого с помощью React-Router. Поскольку эта статья не о React-Router, я не буду тратить на это много времени. Вы можете проверить документацию, чтобы узнать больше.
Как обычно, каждая библиотека экспортирует пользовательские хуки, помогающие выполнять определенные задачи в нашем приложении. react-router экспортировал пользовательский хук useSearchParam.

Хук useSearchParam. Хук useSearchParam — это простой способ чтения и обновления параметров поиска URL в компоненте React, упрощающий создание закладок и ссылок, которыми можно поделиться. Он создает экземпляр собственного URL-адреса браузера, поэтому у него так много методов, которые могут соответствовать требованиям вашего приложения.
Это работает с параметрами запроса и обозначается символом ?.
Вот пример того, как это видно: https://shopify/sneakers?size=34 . URL-адрес просто описывает путь к странице кроссовок с размером = 34 на Shopify.

Настройка нашего приложения:

Предположим, у вас есть шаблон со списком всех продуктов. Давайте углубимся в реализацию продуктов со встроенной функцией сортировки по состоянию vs URL.

Как мы можем добиться этого, сохранив в состоянии:

  • создайте компонент, который принимает все глобальные продукты в качестве реквизита для отображения списка найденных продуктов
  • создать объект для хранения отфильтрованных продуктов
  • Проведите фильтрацию товаров по названию.
  • отображать отфильтрованный продукт пользователю
import { useState } from "react"

export const productLists = (products) => {
    const [foundProduct, setFoundProduct] = useState([]);
    const [inputValue, setInputValue] = useState(null)

    const findByName = () => { 
        const filteredProducts = products ? products
       .filter(product => product.name.includes(inputValue.toLowerCase()))
             : null

        setFoundProduct(filteredProducts)
    }

    const AvailableProducts = foundProducts.map(newProduct=> (
        <div key={newProduct.id}>
            <h2>{ newProduct.name} </h2>
            <span>{newProduct.price}</span>
            <article>{newProduct.description}</article>
        </div>
   ))

    return (
        <>
           <div>
                <p>Search for a product </p>
                <input
                     val={inputValue}
                     onChange={e => setInputValue(e.target.value)}
                 />
                <button role="search" onClick={findByName}>Search</button>
           </div>


        <h1>Available product from your input</h1>
         <section>{AvailabeProducts}</section>
        </>
    );

}

Теперь мы понимаем, что это неэффективно, поскольку пользователь может захотеть поделиться отсортированным продуктом со своими друзьями. Это становится невозможным, поскольку состояния живут только в браузере.
Давайте рефакторим это, используя хук useSearchParam из react-router-dom, чтобы немного улучшить взаимодействие с пользователем.

  • импортировать и использовать хук useSearchParam из react-router-dom
  • сохранить текущий URL-адрес браузера в переменной
  • и используйте метод get, чтобы получить переменную имени продукта (может быть, цена или что-то в этом роде.
  • фильтровать по значению переменной. Здесь я использовал имя для фильтрации
  • переберите отфильтрованный массив и верните соответствующую разметку.
import { useState, useRef } from "react"
import { useSearchParam } from "react-router-dom"

export const productLists = (products) => {
   const [inputValue, setInputValue] = useState();
  const [searchParam, setSearchParam] = useSearchParam();
  const nameFilter = searchParam.get('name') 

   const filteredProducts = products ? products
      .filter(product => product.name === nameFilter))
            : null

    const AvailableProducts = filteredProducts.map(newProduct=> (
        <div key={newProduct.id}>
            <h2>{ newProduct.name} </h2>
            <span>{newProduct.price}</span>
            <article>{newProduct.description}</article>
        </div>
   ))

    return (
        <>
           <div>
                <p>Search for a product </p>
                <input
                     val={inputValue}
                     onChange={e => setInputValue(e.target.value)}
                 />
                <button role="search" 
                    onClick={() => setSearchParam({name: inputValue)}
                >Search</button>
           </div>


        <h1>Available product from your input</h1>
         <section>{AvailabeProducts}</section>
        </>
    );

}

Именно так можно повысить статус до URL на базовом уровне. Вы можете обратиться к документам react-router.

Если вы нашли это полезным, подпишитесь на меня в Twitter, поставьте лайк, оставьте комментарий или поддержите меня, купив мне кофе по этой ссылке. .