Часто, при разработке сайтов на фреймворках, не придаётся особого внимания деталям, которые в данный фреймворк включены. И это нормально, ведь главная задача фреймворка - чтобы удобно было сайт делать и чтобы он был быстрым и функциональным. Но, эти детали тем и интересны, что узнав некоторые моменты, взгляд на javascript разработку чуть дополняется.

Одной из таких деталей является keyed реализация. Что это такое?

Keyed реализация - это прежде всего создание ассоциации между данными и DOM узлом. То-есть, при изменении данных благодаря данной реализации меняются сами DOM узлы. Non-keyed же таким образом не совсем связана с DOM узлом.

В большинстве фреймворков сегодня есть специальная конструкция, благодаря которой повторяются DOM узлы в зависимости от данных. Допустим, в таком фреймворке как Cample.js данной конструкцией (non-keyed) является класс Each:

const newEach = new Each("new-each",
    ()=>["val1","val2","val3"],
    "<div><input type="text"/>{{data}}</div>"
);

В данном примере, если повторить данный HTML разметку 3 раза, то будет такой результат:

<div><input type="text"/>val1</div>
<div><input type="text"/>val2</div>
<div><input type="text"/>val3</div>

Так вот, что будет если в non-keyed реализации придут новые данные, где будет уже массив, но уже не с тремя элементами, а с двумя? И также, если будет введены в input какие-то данные, то что там будет, когда в данную конструкцию цикла придёт два элемента?

<div><input value="1" type="text"/>val1</div>
<div><input value="2" type="text"/>val2</div>
<div><input value="3" type="text"/>val3</div>

Результат будет примерно следующим, если данные будут иметь следующий вид:

const newEach = new Each("new-each",
    ()=>["val1","val3"],
    "<div><input type="text"/>{{data}}</div>"
);

Сам же HTML будет выглядеть так, если также ввести в input какие-то данные:

<div><input value="1" type="text"/>val1</div>
<div><input value="2" type="text"/>val3</div>

То-есть, видно, что в non-keyed реализации информация в DOM узлах сохраняется не так, как это было бы в keyed реализации, потому что нету ассоциации благодаря ключу.

Таким образом, сравниваются два массива данных, где раньше было 3 элемента, а стало 2, значит данные уменьшились на 1 единицу, и тогда надо удалить последний блок в DOM, ведь нету ассоциации с ключом. Если бы ассоциация была, то код выглядел бы следующим образом:

<div><input value="1" type="text"/>val1</div>
<div><input value="3" type="text"/>val3</div>

Это можно сравнить с id при создании базы данных, когда, допустим, id бы не было, тогда строки бы удалялись не по id, а по разнице со старыми данными и новыми.

Конечно, это один из маленьких примеров того, какие особенности есть у javascript фреймворков, но, тем наверное и интереснее работа с ними и создание сайтов благодаря ним.

Надеюсь, данная статья была Вам интересна. Спасибо большое за прочтение!

Комментарии (2)


  1. kai3341
    30.07.2023 11:43

    Хорошо, но мало. Хорошо, что тема того, как оно работает под капотом, поднимается в принципе. Может, подобная статья была про React? Интересно было бы почитать.

    Сравнение с id в БД не совсем корректно, но идея сравнить с с БД как таковыми классная. За фасадом API прячется реализация, со своими сильными и слабыми сторонами, как то undo сегмент или autovacuum


    1. antonmak1 Автор
      30.07.2023 11:43

      Да не, можно конечно было бы написать, как это связывается в javascript с DOM. Описать функционал таковой реализации в Virtual DOM и без него, сравнить это, но, просто статья была написана конкретно про ключевое отличие реализаций.

      P.S. Не знаю на счёт статьи подобной, я лично описал опыт на примере Cample.js. Другие статьи не смотрел, потому что думаю что уверен в том, что написано.