Автор оригинала: Aswath Prabhu R.
Реактивность в рамках является декларативная модель программирования, которая заботится о том, чтобы сохранить DOM (модель объекта документа) в синхронизации с обновлениями текущего состояния
Я знаю, что трудно SIP, давайте станем практичным, чтобы мы заливаем наши умственные модели и получите его хорошее!
Давайте кодируем простой старый счетчик вручную. С появлением многих JavaScript Frameworks и библиотек, это довольно легкое задание для достижения. Будет ли оно то же самое, когда развивается с простой JavaScript?
Забудьте все рамки и библиотеки, ваш единственный инструмент – JavaScript Теперь и просто готовься к приключению!
index.html :
Наш счетчик будет оказан в #app
Отказ
index.js :
class Counter { count = 0; handleIncrement = () => { this.count++; }; handleDecrement = () => { this.count--; }; }
Я определяю класс Счетчик
, с недвижимостью Считать
что по умолчанию для 0
и два метода Дренарь
, Обрабатывающее измерение
это обрабатывает прирост и уменьшение действий соответственно. Наше Текущее состояние это Считать
имущество. Всякий раз, когда состояние обновляется, наше DOM должно быть синхронизировано. Это не должно быть несвежем.
Поскольку мы имеем дело с простой JS, мы должны создавать наши кнопки приращения и уменьшения рукой вручную? Вот что такое наша следующая задача!
index.js :
setUpButton(action) { const actionHash = { Increment: this.handleIncrement, Decrement: this.handleDecrement }; const button = document.createElement("BUTTON"); button.textContent = action; button.onclick = actionHash[action]; return button; }
Наше Setupbutton
Метод гарантирует, что он создает кнопку и связывает соответствующую OnClick
обработчик в соответствии с Действие
прошел как аргумент. Таким образом, мы сделаем с функциональностью. Неплохо до сих пор. Давайте получим это в Дом
Отказ Мы должны кодировать наши оказывать
Метод сейчас!
index.js :
render() { const app = document.getElementById("app"); app.innerHTML = ""; const count = document.createElement("DIV"); count.textContent = this.count; const elementsToAppend = [ count, this.setUpButton("Increment"), this.setUpButton("Decrement") ]; const fragment = document.createDocumentFragment(); elementsToAppend.forEach(element => { fragment.append(element); }); app.appendChild(fragment); }
Это больше Прямо вперед Реализация оказывать
метод. Дом следует хранить в синхронизации с нашим государством Считать
Отказ Таким образом, мы очищаем какие-либо несвежие элементы, которые ранее были отображены сначала, установив innerhtml
Пустое строка
Отказ Мы создаем Div
элемент, который оказывает нашу Считать
значение. Затем мы устанавливаем как наши кнопки приращения, так и к снижению, и, наконец, мы добавим все к #app
элемент.
Ура! Мы скоро сделали. Давайте проверим, работает ли это.
index.js :
новый счетчик (). Визуализация ();
Выход 🤯.
Ой, это не сработало, как ожидалось
При проверке нашего кода мы можем найти это, как только мы обновим наше состояние, которое мы не удалось Чтобы снова сделать наше приложение! Это дело. Давайте исправить это 🛠
index.js :
handleIncrement = () => { this.count++; this.render(); }; handleDecrement = () => { this.count--; this.render(); };
Наконец 😅.
Полный исходный код можно найти здесь Отказ
МОЙ БОГ! Посмотрите, насколько императив наше решение 😓. Что если мы включаем волшебный слой, который заботится об этих nitty-gritty вещи. То есть, когда наши текущие обновления государства наше приложение должно волшебным образом Rerender декларативно. Это путь, верно? Что если мы добавим другое состояние в будущем и не удалось сделать то же самое? Это решение – менее ремонтом И не будущее доказательство.
К удивлению, современные структуры и библиотеки JavaScript на самом деле действуют как Волшебный слой underhooth, которая заботится об этих низкоуровневых задачах и делает вас более продуктивными, позволяя вам полностью сосредоточиться на Приложение бизнес логика Отказ Дом будет в синхронизации с обновлениями государства, и это обещание, учитывая современные рамки и библиотеки. А также мы не можем просто рерандер целую приложение
за единое изменение состояния. Эти инструменты также гарантируют, что они эффективно обновляют Дом
и только повторно рендеринг
части, которые необходимы только.
Эти инструменты имеют свои собственные способы обработки государственного управления.
Как отреагировать это?
Реагировать достигает государственного отслеживания через Уместите
API в функциональных компонентах.
С Уместите
Теперь решение более удобно и читабельно и менее подвержена ошибкам. Будущие обновления могут быть сделаны без проблем.
Уместите
Функция импортируется из реагировать
При вызове, возвращает массив. Он содержит два элемента, первая сама обозначает саму указание состояния, а второй элемент ссылается на функцию, которая может быть вызвана для обновления этой конкретной переменной состояния. Вы не можете просто использовать this.count ++
или this.count--
напрямую, как мы делаем в простых js. Мы должны использовать только соответствующие функции государственных обновлений. Это решение более декларативно, чем предыдущий, который мы обращаемся с обычными JS.
Но что, если я скажу, что есть более элегантный способ достижения этого?
Эмбер , рамки для амбициозных веб-приложений предоставляет нам несколько больших API, которые являются более естественными и синтаксически очень декларативными. Вы можете быть свободным от использования любых функций государственных обновлений, таких как this.settate ()
Отказ Просто Count ++
или Счет ...
достаточно. Вот как мы делаем в JavaScript, верно?
Октановое издание это последнее обновление в Эмбер
Отказ Это поразило меня множеством прохладных новых функций и более организованной декларативной модели программирования. Если бы мне пришлось выбрать один из них, новая модель реактивности зарабатывает медаль, если честно. Давайте посмотрим, как наш счетчик может быть реализован с Эмбер
🤗.
Counter.js :
Counter.hbs :
Я лично чувствую этот подход более естественным. Вы просто говорите Эмбер
какие свойства вы хотите держать в состоянии. Эмбер
автоматически отслеживает это конкретное свойство и сохраняет Дом
In-Sync на обновлениях к нему. Кроме того, ваша разметка теперь разбита в отдельный руль
файл, так что ваша бизнес-логика сейчас становится Меньше неуклюжем и Более читаемый 🤩.
Это много на данный момент. Дайте мне знать свои мысли относительно нашего подхода в комментариях ниже.
Интересно узнать больше о том, как @Tracked
импортируется из @ Glimmer/отслеживание
достигает этой комплексной работы.
Хотите знать, как @Tracked
Содержит трассу разных свойств государства и триггеры Rerender на основе обновлений на них?
Любопытно знать о своих внутренние органы ?
Это то, что именно я буду покрывать в моем следующем посте. Не могу дождаться возбуждения! Познакомьтесь с вами там снова люди, пока! 🤟🏻.