REACT: Как поменять местами элементы в списке дел по их приоритетам

Я делаю список дел и хочу сделать функцию, которая меняет задачи по их приоритетам. Например:

  1. Идти в тренажерный зал

  2. Научитесь реагировать

    Я хочу сделать кнопку, которая перемещает элементы вверх и вниз и получает:

    1. Научитесь реагировать

    2. Идти в тренажерный зал

У меня есть функция, которая, я уверен, работает правильно, но я думаю, что проблема в <div>, где я использую эту функцию.

const moveUpDown = (currentIndex, nextIndex) =>{
  const newCounts = [...todos]

  const currentCounts = newCounts[currentIndex]
  const previousCounts = newCounts[nextIndex]

  newCounts[currentIndex] = previousCounts
  newCounts[nextIndex] = currentCounts

  setTodos(newCounts)
}

Это мое возвращение:

function ToDo(props) {
    return (
        <div key = {props.todo} className = "item-todo">
            <div 
                className = {props.todo.complete ? "item-text strike" : "item-text"}
                onClick = {() => props.toggleTask(props.todo.id)}
                >
                {props.todo.task}
            </div>
            <div className = "item-delete" onClick = {() => props.removeTask(props.todo.id)}>
                X
            </div>
// Lines below I'm using function moveUpDown
            <div
                className = "item-moveUpDown" disabled = {props.todo === 0} onClick = {() => props.moveUpDown(props.todo, props.todo - 1)}
                >
                Up
            </div>
            <div
                className = "item-moveUpDown" disabled = {props.todo === 0} onClick = {() => props.moveUpDown(props.todo, props.todo + 1)}
            >
                Down
            </div>
        </div>
    )
}
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
20
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Параметры, которые вы передаете moveUpDown, не имеют смысла — похоже, что они должны быть числами, но вы передаете props.todo, который является объектом.

Возможно, если бы вы изменили функцию moveUpDown, чтобы принять «дело», которое вы хотите переместить, и дельту, чтобы указать, в каком направлении вы хотите его переместить; например:

const moveUpDown = (todo, delta) =>{
  const newCounts = [...todos];

  // Remove from the array
  const currentIndex = newCounts.indexOf(todo);
  newCounts.splice(currentIndex, 1);

  // Now put it back in at the new position
  newCounts.splice(currentIndex + delta, 0, todo);

  setTodos(newCounts)
}

Теперь вы можете изменить своих абонентов, например:

<div
    className = "item-moveUpDown"
    disabled = {props.todo === 0}
    onClick = {() => props.moveUpDown(props.todo, 1)}
>
    Down
</div>

Также обратите внимание, что ваш атрибут disabled не имеет смысла — props.todo — это объект, поэтому он никогда не будет равен нулю. Возможно, вам следует передать индекс элемента списка задач как отдельное свойство?

Другие вопросы по теме