Ответы пользователя по тегу React
  • Как поменять порядок элементов в массиве?

    @awenn2015
    Веб-программист самоучка
    Может быть немного корявый но рабочий вариант, можно сделать проще если просто поле order местами менять и сортировать по нему

    type MoveData = ((dir: "left" | "right", i: number) => void)
    
    type TestItemProps = {
      data: { name: string }, i: number, onMove: MoveData
    }
    
    const TestItem: FC<TestItemProps> = ({ data, i, onMove }) => {
      return (
        <div>
          <div style={{ display: "flex", justifyContent: "space-between" }}>
            <span
              style={{ cursor: "pointer" }}
              onClick={() => onMove("left", i)}
            >◀</span>
            <span
              style={{ cursor: "pointer" }}
              onClick={() => onMove("right", i)}
            >▶</span>
          </div>
          <span>{data.name}</span>
        </div>
      )
    }
    
    function Test() {
      const [state, setState] = useState([
        { name: "Petya", order: 0 },
        { name: "Nikita", order: 1 },
        { name: "Sasha", order: 2 },
        { name: "Valera", order: 3 },
      ])
    
      const onMoveHandle: MoveData = (dir, prev) => {
        const isLeftBlock = prev === 0 && dir === "left"
        const isRightBlock = prev === state.length - 1 && dir === "right"
    
        if (isLeftBlock || isRightBlock) return
    
        const next = dir === "left" ? prev - 1 : prev + 1
    
        setState((past) => past.reduce((acc: { name: string, order: number }[], it, i, arr) => {
          if (![prev, next].includes(i))
            acc.push(it)
          else {
            if (i === prev) acc.push(arr[next])
            else acc.push(arr[prev])
          }
    
          return acc
        }, []))
      }
    
      return (
        <div style={{ display: "flex", columnGap: "10px" }}>
          {state.map((it, i) => (
            <TestItem
              data={it} i={i} onMove={onMoveHandle} key={i}
            />
          ))}
        </div>
      )
    }
    Ответ написан
    Комментировать
  • Как сделать так чтобы в input нельзя было вводить меньше 5?

    @awenn2015
    Веб-программист самоучка
    Можно через событие onBlur валидировать

    const Input = () => {
      const range = { min: 5, max: 50 }
      const [value, setValue] = useState<number | "">(range.min)
    
      function onBlurHandle(value: number) {
        if (value >= range.min && value < range.max) return;
        setValue(range.min)
      }
    
      return (
        <input
          type="number"
          value={value}
          onChange={({ target }) => setValue(target.value === "" ? "" : +target.value)}
          onBlur={({ target }) => onBlurHandle(+target.value)}
          min={range.min}
          max={range.max}
        />
      )
    }
    Ответ написан
    Комментировать
  • Как использовать общие либы в create-react-app проектах?

    @awenn2015 Автор вопроса
    Веб-программист самоучка
    Попробовал просто в корне создать папку node_modules/brandname и в нее все что нужно перекинул, не знаю на сколько это правильный вариант но вроде рабочий


    • /node_modules

      • /@types

        • /brand
          • /index.d.ts





      • /brand
        • /utils.ts






    UPD: Вариант рабочий только для поставки типов, с прочим почему то выкидывает ошибку:

    Module parse failed: Unexpected token (3:27)
    File was processed with these loaders:
    * ./node_modules/source-map-loader/dist/cjs.js
    You may need an additional loader to handle the result of these loaders.
    Ответ написан