如何在Vue.js中更改分隔符?

12

我正在使用 Laravel 和 Vue.js 进行项目开发。当我使用 Vue.js 语法像 {{var_name}} 这样的时候,会出现错误,因为 Laravel 的定界符也是 {{ }}。我该如何更改 Vue.js 的定界符,以免与 Laravel 冲突?

下面是我在 layout.app.blade.php 中使用的代码:

<!DOCTYPE html>
<html lang="{{ app()->getLocale() }}">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <!-- CSRF Token -->
    <meta name="csrf-token" content="{{ csrf_token() }}">

    <title>{{ config('app.name', 'Laravel') }}</title>

    <!-- Styles -->
    <link href="{{ asset('css/app.css') }}" rel="stylesheet">
     <script src="{{ asset('js/vue.min.js') }}"></script>
  <link rel="stylesheet" href="{{asset('js/style.css') }}">
</head>
<body>
    <div id="app">
        <nav class="navbar navbar-default navbar-static-top">
            <div class="container">
                <div class="navbar-header">

                    <!-- Collapsed Hamburger -->
                    <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#app-navbar-collapse">
                        <span class="sr-only">Toggle Navigation</span>
                        <span class="icon-bar"></span>
                        <span class="icon-bar"></span>
                        <span class="icon-bar"></span>
                    </button>

                    <!-- Branding Image -->
                    <a class="navbar-brand" href="{{ url('/') }}">
                        {{ config('app.name', 'Laravel') }}
                    </a>
                </div>

                <div class="collapse navbar-collapse" id="app-navbar-collapse">
                    <!-- Left Side Of Navbar -->
                    <ul class="nav navbar-nav">
                        &nbsp;
                    </ul>

                    <!-- Right Side Of Navbar -->
                    <ul class="nav navbar-nav navbar-right">
                        <!-- Authentication Links -->
                        @if (Auth::guest())
                            <li><a href="{{ route('login') }}">Login</a></li>
                            <li><a href="{{ route('register') }}">Register</a></li>
                        @else
                            <li class="dropdown">
                                <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">
                                    {{ Auth::user()->name }} <span class="caret"></span>
                                </a>

                                <ul class="dropdown-menu" role="menu">
                                    <li>
                                        <a href="{{ route('logout') }}"
                                            onclick="event.preventDefault();
                                                     document.getElementById('logout-form').submit();">
                                            Logout
                                        </a>

                                        <form id="logout-form" action="{{ route('logout') }}" method="POST" style="display: none;">
                                            {{ csrf_field() }}
                                        </form>
                                    </li>
                                </ul>
                            </li>
                        @endif
                    </ul>
                </div>
            </div>
        </nav>

        @yield('content')
    </div>

    <!-- Scripts -->
    
<script src="{{ asset('js/grid/grid.js') }}"></script>
    
</body>
</html>

我主页的代码:

@extends('layouts.app')

@section('content')
 <link rel="stylesheet" href="{{asset('js/style.css')}}">
<div class="container">
    <div class="row">
        <div class="col-md-8 col-md-offset-2">
            <div class="panel panel-default">
                <div class="panel-heading">Dashboard</div>

                <div class="panel-body">
                    @if (session('status'))
                        <div class="alert alert-success">
                            {{ session('status') }}
                        </div>
                    @endif

                   <div id="app">
                    <div class="container col-lg-offset-4 col-lg-4">
                        <br>

                            <div class="row">
                                


 <!-- component template -->
    <script type="text/x-template" id="grid-template">
      <table v-if="filteredData.length">
        <thead>
          <tr>
            <th v-for="key in columns"
              @click="sortBy(key)"
              :class="{ active: sortKey == key }">
              {{ key | capitalize }}
              <span class="arrow" :class="sortOrders[key] > 0 ? 'asc' : 'dsc'">
              </span>
            </th>
          </tr>
        </thead>
        <tbody>
          <tr v-for="entry in filteredData">
            <td v-for="key in columns">
              {{entry[key]}}
            </td>
          </tr>
        </tbody>
      </table>
      <p v-else>No matches found.</p>
    </script>

    <!-- demo root element -->
    <div id="demo">
      <form id="search">
        Search <input name="query" v-model="searchQuery">
      </form>
      <demo-grid
        :data="gridData"
        :columns="gridColumns"
        :filter-key="searchQuery">
      </demo-grid>
    </div>

















                            </div>

                    </div>
    </div>
                </div>
            </div>
        </div>
    </div>
</div>
@endsection

<script src="{{ asset('js/grid/grid.js') }}"></script>

不确定为什么你会被踩。我正在使用Django,并希望将Vue放入Django模板中,而不会与插值标签发生冲突。感谢你提出这个问题。 - Brylie Christopher Oxley
4个回答

18

要在vue.js中更改分隔符,请像这样使用

new Vue({
    delimiters: ['{%', '%}'],
}

深入了解 Vue.js文档中的分隔符

var data = {
    message: 'Hello Vue.js!'
}

var demo = new Vue({
    el: '#demo',
    delimiters: ['{%', '%}'],
    data: data
});
<script src="https://vuejs.org/js/vue.min.js"></script>
<div id="demo">
    <p> {% message %} </p>
    <input v-model="message">
</div>


请问我应该把这段代码放在哪里 Vue.config.delimiters = ['<vue', 'vue>'];。 - Anil Kumar Sahu
更好的位置就在上面,就在你使用 var app = new Vue 的地方。 - Niklesh Raut
Vue.config.delimiters = ['<%', '%>'];// 启动演示 var demo = new Vue({ el: '#demo', data: { searchQuery: '', gridColumns: ['name', 'power'], gridData: [ { name: 'Chuck Norris', power: Infinity }, { name: 'Bruce Lee', power: 9000 }, { name: 'Jackie Chan', power: 7000 }, { name: 'Jet Li', power: 8000 } ] } }) 我已经使用了,但仍然得到相同的结果 - Anil Kumar Sahu
你正在使用 Webpack 或其他编译工具吗?能否分享一个实时演示呢? - Niklesh Raut

4
如果你正在使用Vue 3.x,你可以根据文档更改分隔符:
Vue.createApp({
  // Delimiters changed to ES6 template string style
  delimiters: ['${', '}']
})

3
推荐在Blade中使用VueJS的方法是在VueJS分隔符后添加一个@符号: @{{ 变量 }}

0

简而言之:似乎自Vue 3.1版本以来,旧的分隔符已被弃用,并且我无法在源代码中将此选项内联。我的目标是使用Flask与Vue 3。我在vue.config.js中设置了options.compilerOptions

我还将我的答案复制到了一个GitHub关闭的问题上:vuejs/vue-next #1679:在Vue3中更改模板大括号的功能,分隔符不再起作用

过去两天我有一些进展。 :))

我一遍又一遍地阅读了下面的内容https://v3.vuejs.org/api/application-config.html#compileroptions

重要提示:仅在使用完整构建时才会考虑此配置选项(..)对于vue-loader:通过compilerOptions加载器选项传递(打开新窗口)。还请参阅如何在vue-cli中进行配置(打开新窗口)。

之后我在Stackoverflow上阅读了一些内容。

在我重新安装以下Vue 3包之前,如果我从stackoverflow上复制粘贴时犯了错误,我只会安装它们。我假设它们已经安装好了。

npm i --save vue@next (I assume Vue 3 is yet installed (vue@next), it's only if I copy paste vue@latest by mistake
npm install -g @vue/cli) 

我安装了Vue 3:

npm i --save vue-loader@next
npm i --save vue-template-compiler@latest 
nom i --save vue-server-renderer@latest

我创建了以下的vue.config.js

module.exports = {
  chainWebpack: config => {
    config.module
      .rule('vue')
      .use('vue-loader')
      .loader('vue-loader')
      .tap(options => {
        options.compilerOptions = {
          delimiters: ['${', '}']
        };
        return options;
      });
  }
}

使用我修改过的vue create中的App.vue

<template>
   <img alt="Vue logo" src="./assets/logo.png">
   <div id="list-rendering" class="demo">
      <ol>
         <li v-for="todo in todos" v-bind:key="todo" >
            new delimiter for flask:  ${todo.text} <br>
            initial vue delimiter:  {{todo.text}} 
         </li>
      </ol>
   </div>
</template>
<script>
   export default {
     name: 'App',
   
   data() {
       return {
         todos: [
           { text: 'Learn JavaScript' },
           { text: 'Learn Vue' },
           { text: 'Build something awesome' }
         ]
       } 
     }
   }
</script>
<style>
   #app {
   font-family: Avenir, Helvetica, Arial, sans-serif;
   -webkit-font-smoothing: antialiased;
   -moz-osx-font-smoothing: grayscale;
   text-align: center;
   color: #2c3e50;
   margin-top: 60px;
   }
</style>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接