Blade Vue Vars

Blade Vue Vars Vue.js

Blade Vue Vars — это подход к передаче данных между шаблонами Laravel Blade и компонентами Vue.js. Он позволяет использовать переменные из PHP (Laravel) в JavaScript (Vue) и наоборот, но требует осторожности из-за конфликтов синтаксиса и этапов рендеринга. Разберем, как это работает и какие подводные камни есть.

Основная проблема

  • Blade (серверный шаблонизатор Laravel) и Vue (клиентский фреймворк) используют одинаковые синтаксисы для вставки переменных: {{ }}.
  • Если не экранировать код, Blade попытается обработать Vue-переменные, что приведет к ошибкам.
  • Пример конфликта:
<!-- Blade пытается обработать `message` как PHP-переменную -->

<div>{{ message }}</div> 
<!-- Ошибка, если `message` существует только во Vue -->

Как передавать данные из Blade во Vue

Использование @json

Директива Blade преобразует PHP-переменные в JSON, чтобы Vue мог их прочитать:

<script>
  window.sharedData = @json($data); // PHP-массив $data станет JS-объектом
</script>

В компоненте Vue:

export default {
  data() {
    return {
      items: window.sharedData
    }
  }
}

Передача через props

В Blade:

 XML
<vue-component :items='@json($items)'></vue-component>

В Vue:

javascript

export default {
  props: ['items']
}

Экранирование Blade-синтаксиса

Если нужно вывести {{ }} как текст для Vue, добавьте @:

xml<div>@{{ vueVariable }}</div> 
<!-- Blade проигнорирует, Vue обработает -->

Примеры использования

Динамическая таблица с пагинацией без перезагрузки страницы (Blade + Vue):

xml<!-- Blade -->
<div id="app">
  <data-table :initial-data='@json($users)'>
    @{{ vueMessage }} <!-- Vue обработает после загрузки -->
  </data-table>
</div>
javascript// Vue-компонент DataTable.vue
export default {
  props: ['initialData'],
  data() {
    return {
      users: this.initialData,
      vueMessage: 'Данные загружены!'
    }
  }
}

Частые ошибки

Смешивание синтаксиса без экранирования:

xml<!-- НЕПРАВИЛЬНО --> <div>{{ $laravelVar }} @{{ vueVar }}</div> 
xml<!-- ПРАВИЛЬНО --> <div>{{ $laravelVar }} <span>@{{ vueVar }}</span></div>

Передача сложных объектов без @json:

xml<!-- НЕПРАВИЛЬНО --> 
<vue-component :items="{{ $items }}"></vue-component> 
<!-- Сломается, если $items содержит кавычки -->

Игнорирование XSS-уязвимостей:
Всегда экранируйте данные через @json или htmlspecialchars, если они приходят от пользователей.

    Когда использовать?

    • Подходит:
      • Небольшие проекты с простой реактивностью (фильтры, сортировка таблиц).
      • Постепенная миграция с Blade на Vue.
    • Не подходит:
      • Крупные SPA-приложения (лучше использовать чистый Vue + API).
      • Когда нужен SSR (выбирайте Nuxt.js или Inertia.js).

    Альтернативы

    • Inertia.js: Позволяет использовать Vue компоненты как Blade-шаблоны, избегая ручной передачи данных.
    • Livewire: Пишите реактивные компоненты на PHP без погружения в JavaScript.

    Blade + Vue — мощный дуэт для гибридных приложений, но требует аккуратной работы с данными. Используйте @json, экранирование и разделяйте логику, чтобы избежать конфликтов. Для сложных проектов рассмотрите специализированные инструменты (Inertia, Livewire).

    Оцените статью
    Уроки программирования
    0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest
    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии
    0
    Оставьте комментарий! Напишите, что думаете по поводу статьи.x