React JS создать счетчик без useState (чтобы не обнулялся)
В моем проекте есть кнопка для копирования элемента (table). При копировании каждая новая копия создается с именем и порядковым номером. При закрытии страницы стейт обнуляется, если я хочу создать еще несколько копий элемента потом, счетчик снова именует их с нуля, это создает ошибку в работе приложения. Как можно написать функцию для счетчика, чтобы он начинал отсчет с порядкового номера последней копии. Вот мой код:
const [copyTableCounter, setCopyTableCounter] = useState(0);
const onCopyTable = (element) => {
const copiedTable = {
id: table.id,
name: `${element.name}_COPY (${copyTableCounter})`,
position: {
x: element.position.x + 5,
y: element.position.y + 5,
},
columns: table.columns,
};
onCopyTableHandler(copiedTable, areaName);
};
Ответы (1 шт):
Допустим, есть объект(если я правильно понял из комментариев):
const diagram = {
areas: [{
tables: [
{ "id": 11, "originalTableId": 3129, "name": "MY_TABLE_COPY (1)", "position": { "x": 14.0, "y": 445.0 }, "columns": [] },
{ "id": 12, "originalTableId": 3128, "name": "MY_TABLE_COPY (1)", "position": { "x": 14.0, "y": 445.0 }, "columns": [] },
{ "id": 13, "originalTableId": 3127, "name": "MY_TABLE_COPY (1)", "position": { "x": 14.0, "y": 445.0 }, "columns": [] }
]
}]
}
Тогда можно начальное состояние устанавливать исходя из текущих данных
// Начальное состояние - максимальный id
const [copyTableCounter, setCopyTableCounter] = useState(diagram.areas[0].tables.map(el => el.id).sort((a,b) => b - a)[0]);
// Начальное состояние - количество элементов в tables
const [copyTableCounter, setCopyTableCounter] = useState(diagram.areas[0].tables.length);
// Или напрямую использовать в фукнции без сохранения в переменной состояния
// т.к. это не требует дополнительных вычислений
name: `${element.name}_COPY (${diagram.areas[0].tables.length})`,
Я бы предложил в areas создать новый ключ, назовем его tableCounter(к примеру) и смотрел бы на него и при изменении данных по таблицам менял бы это значение
const diagram = {
areas: [{
tables: [],
tableCounter: 0 // вот тут хранить нужное значение для текущей areas
}]
}
Мне кажется этот вариант проще, наглядее и управляем + он попадет в ваш текущий механизм сохранения данных.