Нацельтесь и управляйте одним элементом DOM в vue

Почему-то я до сих пор не могу понять некоторые основные концепции vue.

Я сделал простую веб-страницу, используя phalcon. Создал его так, чтобы он работал без JS и сейчас самое время добавить некоторые навороты - ajax запросы и тому подобное, чтобы пользовательский опыт был лучше.

Я хотел сделать все, используя vue, чтобы посмотреть, как все это складывается. Но после нескольких часов гугления я все еще не могу найти решение для самой простой задачи.

Скажем: я хочу получить текстовый абзац из набора <li>-ов и немного изменить его. Может быть, сделать отрывок из него и добавить кнопку «Подробнее» позади него. Теперь, в jQuery, я бы просто выполнял итерацию с каждым() и выполнял задачи. С набором элементов DOM для таргетинга vue мне намного сложнее, вероятно, из-за того, что вся парадигма «наоборот».

Я знаю, что мог бы выполнить итерацию с помощью v-for, но эти элементы уже находятся в DOM, взяты из базы данных и шаблонизированы с помощью volt. У меня была даже эта дикая идея создания файлов .js из phalcon, но это полностью свело бы на нет мою стратегию создания сначала функциональной веб-страницы, а затем ее постепенного улучшения.

Честно говоря, я чувствую, что прямо сейчас я слишком усложняю ради этого. Подходит ли vue для такого проекта, или это исключительно инструмент для создания приложения с нуля?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
555
2

Ответы 2

Шаблоны Vue выполняются на стороне клиента, а это означает, что если вы предоставляете уже шаблонную html-страницу (вашим бэкэндом), Vue мало что может для вас сделать. Vue нужны данные, а не элементы DOM для построения моделей представления.

Это становится довольно очевидным, например, при создании одностраничного приложения, которое будет отображаться только на стороне клиента. Вы просто асинхронно загружаете данные из внутреннего API (например, REST), а затем выполняете весь рендеринг на клиенте.

Насколько я понимаю ваш вариант использования, вы хотите смешивать рендеринг на стороне клиента и сервера, рендеринг большей части неинтерактивного контента с использованием механизма шаблонов вашего бэкэнда и добавление некоторой интерактивности с помощью vue. В этом случае вам нужно будет добавить некоторые компоненты vue (с их собственной логикой рендеринга) в ваш бэкэнд-шаблон и передать данные в этот компонент, используя привязку данных vue.

Вот пример:

...
<div id = "app">
    <my-vue-list :products = "{% products %}"></my-vue-list>
</div>
...

И в вашем JS:

var app = new Vue({
  el: '#app',
  data: {
    components: {MyVueList} // You will have to register all the components you want to use here
  }
})

Вероятно, мне следует просто отбросить часть «просмотра» phalcon по большей части и вернуть данные из контроллера. Но тогда почему бы просто не использовать firebase или что-то подобное, если у нас все равно нет функциональной версии, отличной от JS... Смешивание шаблонов volt и шаблонов vue, вероятно, вызовет у меня головную боль, и, поскольку мне нужны лишь некоторые незначительные улучшения UX, я думаю Я прибегну к jQuery.

heliogabal 02.02.2019 23:37

@heliogabal У вас не должно быть проблем с использованием шаблонов Phalcon, я могу только предположить, что это эквивалентно тому, что лезвие для Laravel, однако, исходя из опыта, я практически полностью исключил все шаблоны на основе php из всех своих проектов и использую Vue исключительно. Laravel больше действует как API. Vue также имеет много преимуществ по сравнению с jQuery, в первую очередь использование виртуального DOM. Просто мои 2 цента.

Brian Lee 03.02.2019 00:58

@heliogabal MVC вышел из моды, поскольку строгое разделение клиента и API гораздо более гибкое. Хотя можно смешать vue с каким-то бэкэнд-шаблоном MVC, я не думаю, что этот вариант особенно хорошо масштабируется. На мой взгляд, нет причин выбирать MVC вместо подхода API — вы также можете использовать здесь, например, firebase — но в конце концов все сводится к тому, что вам наиболее удобно.

Philip Feldmann 03.02.2019 11:45

Я немного старомоден, поэтому «прогрессивное улучшение» застряло у меня в голове. Я тоже думаю, что это песня прошлого :)

heliogabal 03.02.2019 12:53

Vue предоставляет атрибут ссылка для регистрации ссылки на элемент dom или дочерний компонент:

// accessible via this.$refs.foo
<li ref = "foo">...</li>

Однако обратите внимание, что ссылки не являются реактивными, как указано в документах:

$refs is also non-reactive, therefore you should not attempt to use it in templates for data-binding.

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