Laravel - Vue 组件渲染两次因为 app.js
Laravel - Vue component rendering twice because of app.js
我有一个 Laravel 7 项目并安装了 bootstrap 以及 ui vue auth 包。我正在尝试修改扩展 app.blade.php 的主页 (home.blade.php),但我发现 app.blade.php 中的 <div id="app">
不知何故] 正在渲染两次。我在 app.blade.php 的底部放置了一个带有 console.log()
的脚本标签,就在 div 标签关闭之前,它输出了两次。但是,当我将脚本标记放在这个 div 之外时,它会正常运行并且只输出一次。
我发现这是由于 app.blade.php:
头部的脚本标记造成的
<script src="{{ asset('js/app.js') }}" defer></script>
当我评论那一行时,一切正常!所以,我的问题是:
为什么这个脚本标签在这里?为什么它使一切 运行 两次?我真的需要它吗?没有了以后会不会出问题?
webpack.mix.js:
const mix = require('laravel-mix');
mix.js('resources/js/app.js', 'public/js')
.sass('resources/sass/app.scss', 'public/css');
resources/js/app.js:
require('./bootstrap');
window.Vue = require('vue');
Vue.component('example-component', require('./components/ExampleComponent.vue').default);
const app = new Vue({
el: '#app',
});
app.blade.php:
<!doctype html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head>
<meta charset="utf-8">
<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>
<!-- Scripts -->
<script src="{{ asset('js/app.js') }}" defer></script>
<!-- Fonts -->
<link rel="dns-prefetch" href="//fonts.gstatic.com">
<link href="https://fonts.googleapis.com/css?family=Nunito" rel="stylesheet">
<!-- Styles -->
<link href="{{ asset('css/app.css') }}" rel="stylesheet">
<!-- Icons -->
<script src="https://kit.fontawesome.com/36a988e261.js" crossorigin="anonymous"></script>
</head>
<body>
<div id="app">
<script type="application/javascript">console.log('app')</script>
</div>
</body>
</html>
编辑:由于几个小时后仍未得到答复,我决定设置一个 repo 以防有人想亲眼看到问题所在。
我发现这是因为在 Vue 组件之外有脚本标签。我删除了 app.blade.php 中的脚本标签,并将安装 vue 时出现的 ExampleComponent 与 laravel 放在了 mounted() 方法中,它有一个 console.log 并且它只被调用一次。
不过,我还是不知道为什么会这样。如果有人能阐明这件事,那就太棒了。也许我会 post 有了这个新见解再问一个问题。
我遇到了同样的问题,在我的情况下,这是由于页面中的某些 iframe
s 指向 #
src url。我意识到它在控制台中多次写入该消息:
[控制台中的 Vue devtools 消息][1]
所以,我创建了一条新的特殊路线
Route::get('/frame', [PagesController::class, 'frame'])->name('frame');
其中 return 一个空字符串,如
/**
* Used for iframes to override dowloadinf twice page content
*/
public function frame() {
return "";
}
它解决了我的问题。也许对于在 "#"
获取的所有资源来说都是一样的
.
[1]: https://i.stack.imgur.com/Z55BX.png
我有一个 Laravel 7 项目并安装了 bootstrap 以及 ui vue auth 包。我正在尝试修改扩展 app.blade.php 的主页 (home.blade.php),但我发现 app.blade.php 中的 <div id="app">
不知何故] 正在渲染两次。我在 app.blade.php 的底部放置了一个带有 console.log()
的脚本标签,就在 div 标签关闭之前,它输出了两次。但是,当我将脚本标记放在这个 div 之外时,它会正常运行并且只输出一次。
我发现这是由于 app.blade.php:
头部的脚本标记造成的<script src="{{ asset('js/app.js') }}" defer></script>
当我评论那一行时,一切正常!所以,我的问题是: 为什么这个脚本标签在这里?为什么它使一切 运行 两次?我真的需要它吗?没有了以后会不会出问题?
webpack.mix.js:
const mix = require('laravel-mix');
mix.js('resources/js/app.js', 'public/js')
.sass('resources/sass/app.scss', 'public/css');
resources/js/app.js:
require('./bootstrap');
window.Vue = require('vue');
Vue.component('example-component', require('./components/ExampleComponent.vue').default);
const app = new Vue({
el: '#app',
});
app.blade.php:
<!doctype html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head>
<meta charset="utf-8">
<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>
<!-- Scripts -->
<script src="{{ asset('js/app.js') }}" defer></script>
<!-- Fonts -->
<link rel="dns-prefetch" href="//fonts.gstatic.com">
<link href="https://fonts.googleapis.com/css?family=Nunito" rel="stylesheet">
<!-- Styles -->
<link href="{{ asset('css/app.css') }}" rel="stylesheet">
<!-- Icons -->
<script src="https://kit.fontawesome.com/36a988e261.js" crossorigin="anonymous"></script>
</head>
<body>
<div id="app">
<script type="application/javascript">console.log('app')</script>
</div>
</body>
</html>
编辑:由于几个小时后仍未得到答复,我决定设置一个 repo 以防有人想亲眼看到问题所在。
我发现这是因为在 Vue 组件之外有脚本标签。我删除了 app.blade.php 中的脚本标签,并将安装 vue 时出现的 ExampleComponent 与 laravel 放在了 mounted() 方法中,它有一个 console.log 并且它只被调用一次。
不过,我还是不知道为什么会这样。如果有人能阐明这件事,那就太棒了。也许我会 post 有了这个新见解再问一个问题。
我遇到了同样的问题,在我的情况下,这是由于页面中的某些 iframe
s 指向 #
src url。我意识到它在控制台中多次写入该消息:
[控制台中的 Vue devtools 消息][1]
所以,我创建了一条新的特殊路线
Route::get('/frame', [PagesController::class, 'frame'])->name('frame');
其中 return 一个空字符串,如
/**
* Used for iframes to override dowloadinf twice page content
*/
public function frame() {
return "";
}
它解决了我的问题。也许对于在 "#"
获取的所有资源来说都是一样的
.
[1]: https://i.stack.imgur.com/Z55BX.png