Конфликт по шаблону Twig и Vue.js

46

Я делаю программу, используя Slim 2, которая использует Twig в качестве моего шаблонизатора. поэтому он использует синтаксис {{ foo }} в php файле. С другой стороны, я использую vue.js, он также использует {{ bar }}.

например.

Я собираюсь сделать двустороннюю привязку, ниже мой html-код.

<div class="container">
    Label Value: <label>{{ foo }}</label><br>
    Field Value: <input v-model="foo">
</div>

и вот мой код vue js.

new Vue({

    el: '.container',
    data: {
        foo: 'Hello world.'
    }
});

Итак, мир Hello должен быть в значении метки.

Вывод - это изображение ниже.

Изображение 631

Что это не сработало, возможно, система считала это переменной веточки. Поэтому я проверил, передавая переменную в виде.

$app->get('/', function() use ($app) {
    $app->render('login.php', [
        'foo' => 'FROM PHP FILE'
    ]);
})->name('login');

Итак, я проверил, значение метки: показывает переменную, которую я передал из файла PHP, а не код VUE.

Трудно объяснить, но вы понимаете. Интересно, как обходить шаблон ветки и использовать {{ }} из vue.

Изображение 632

Теги:
vue.js
twig

10 ответов

89
Лучший ответ

Просто измените разделители по умолчанию для vue. Вот как:

Vue.js 1.0

Определите разделители по всему миру.

Vue.config.delimiters = ['${', '}']

Документы


Vue.js 2.0

Определите разделитель на основе каждого компонента.

new Vue({
    delimiters: ['${', '}']
})

Документы

45

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

{% verbatim %}
    new Vue({

        el: '.container',
        data: {
            foo: 'Hello world.'
        }
    });
{% endverbatim %}

В документах twig:

Стеновый тег отмечает разделы как сырые тексты, которые не должны быть разобран. Например, чтобы привести синтаксис Twig в качестве примера в шаблон, вы может использовать этот фрагмент:

  • 0
    Оу! Я тоже это видел, но не стал пытаться, вместо этого я попытался autoescape, и это не сработало. Хахаха. Теперь я попробовал это, и это сработало, я поместил этот синтаксис дословно между моим vue "{% verbatim%} {{foo}} {% endverbatim%}, и это работает! Спасибо! :)
  • 0
    Да уж. Это правильный путь. Рад, что это сработало. ;)
11

Я читал в другом подобном вопросе:

{{"{{vue.js variable here}}"}} 

чтобы сделать его короче. Он работает в НЕКОТОРЫХ случаях для меня. Но, подумал, что вам все равно может понравиться...

Мне еще не удалось заставить его работать во всех областях моего кода.

  • 0
    Здравствуйте, я попробую это и дам вам знать, если это работает. :)
  • 0
    Предыдущий ответ от felipsmartins лучше ... он работает во всех случаях. Представленное выше, похоже, имеет ограниченное применение ... насколько мне показали мои тесты.
Показать ещё 1 комментарий
6

Для Vue JS 2 (не уверен насчет 1). Ты можешь использовать:

<span v-text="msg"></span>
<!-- same as -->
<span>{{msg}}</span>

Согласно документации: https://vuejs.org/v2/api/#v-text

3

Просто голова. На Vue JS 2. Способ сделать это - добавить объект в Vue.

new Vue({
    el: '#app',
    delimiters: ['${', '}'],
}
0

Вместо того, чтобы менять разделители, делать компоненты менее пригодными для повторного использования или использовать странные механизмы двойного экранирования, вы можете использовать функцию source Twig.

Функция источника возвращает содержимое шаблона без его рендеринга:

{{ source('template.html') }}
{{ source(some_var) }}

Пример:

<!-- path/to/twig_template.html.twig -->
<script type="text/x-template" id="my-template">
    {{ source('path/to/vue-template.html') }}
</script>

<script>
    Vue.component('my-component', {
        template: '#my-template'
    });
</script>
  • 0
    За что было проголосовать против? Пожалуйста, прокомментируйте, когда проголосовали против!
0

Это проверено и работает - vue js vars в шаблоне ветки:

    new Vue({
       el: '#app',
       delimiter: ['{}'], // any delimiter you would like
    })
0

Лучшее решение - не менять ни один из разделителей.

Вы можете использовать разметку vuejs в ветке, как это

{{mytwigvar}} {{'{{'}} myvuevar {{'}}'}}

Это явно отстой, так что.... переопределите ваш загрузчик веток для предварительной обработки файлов и замените {{{{{'{{'}} и}}} {{'}}'}}, тогда вы можете написать разметку как

{{mytwigvar}} {{{myvuevar}}}

Гораздо приятнее.

0

Кроме того, для тех, кто не хочет изменять разделитель VUE, вы можете изменить разделитель Twig (используя в этом примере фреймворк Silex):

$app->before(function() use ($app){
    $app['twig']->setLexer( new Twig_Lexer($app['twig'], [
        'tag_comment'   => ['[#', '#]'],
        'tag_block'     => ['[%', '%]'],
        'tag_variable'  => ['[[', ']]'],
        'interpolation' => ['#[', ']'],
    ]));
});

https://twig.symfony.com/doc/2.x/recipes.html#customizing-the-syntax

0

Я использую VueJs v2 с синтаксисом ниже:

<img id="bookCover" style="border:none;width:200px" :src="book.cover">

Где book.cover является одним из полей myVueInstance. $data.book.

Здесь документы

Ещё вопросы

Сообщество Overcoder
Наверх
Меню