Nuxt.js开发中碰到的问题(一)window 或 document is not defined
2022-02-12 09:59:59
前言
从这一期开始,我会逐渐将一些在开发博客系统是碰到的问题做一些总结,首先是Nuxt.js;
考虑到博客虽然主要做为自己的笔记总结留存用,但也希望能够让更多人能够看到,还是决定上SEO优化;由于详情页是动态的,无法使用
prerender-spa-plugin
进行预渲染,所以最后还是选了Nuxt.js window或document is not defined
碰到这种报错,是由于nuxt.js会在服务端渲染页面,而服务端并没有window或document
- 官方给出的解决方案如下:
官方解决方案链接
- 我的解决方案:
- 写一个返回顶部的vue组件
export default {
props: ['step', 'scroll'],
data () {
return {
isShow: false
}
},
created () {
const $this = this
window.onscroll = function () {
if (document.documentElement.scrollTop + document.body.scrollTop > $this.scroll) {
$this.isShow = true
} else {
$this.isShow = false
}
}
},
methods: {
goTop () {
const $this = this
let timer = setInterval(function () {
if (document.body.scrollTop) {
document.body.scrollTop -= $this.step
if (document.body.scrollTop <= 0) {
document.body.scrollTop = 0
clearInterval(timer)
}
} else {
document.documentElement.scrollTop -= $this.step
if (document.documentElement.scrollTop <= 0) {
document.documentElement.scrollTop = 0
clearInterval(timer)
}
}
}, 23)
}
}
}
#go-top {
position: fixed;
bottom: 100px;
right: 50px;
cursor: pointer;
height: 50px;
width: 50px;
line-height: 50px;
text-align: center;
border: 2px solid #333;
color: #333;
font-size: 20px;
border-radius: 5px;
transition: all .5s;
&:hover {
border-radius: 50%;
color: #fff;
background: #333;
}
}
复制代码
- 写一个插件放入
plugins
文件夹中
/**
* 将goTop组件挂载到全局
*/
import Vue from 'vue'
import GoTop from '~/components/GoTop'
Vue.component('GoTop', GoTop)
复制代码
- 将插件写入配置文件
nuxt.config.js // 将插件写进引入 nuxt.config.js,并将ssr选项设置为false,这样服务端渲染时就不会渲染这个组件了 plugins: [ { src: '~plugins/go-top', ssr: false } ] 复制代码
- 总结
至此, 一个简单的返回顶部组件已经完成,一般碰到服务端无法渲染的组件都可以这样处理;
后续会添加
requestanimationframe
版本的返回顶部来提升效果,setInterval
版本就作为兼容低版本浏览器使用
関連
-
[解決済み】ある要素を別の要素に移動させるには?
-
[解決済み】document.body.innerHTML から javascript で HTML を生成する。
-
[解決済み] 私はjavascriptで簡単なトグルボタンを作ろうとしています。
-
[解決済み] セッション変数にアクセスし、javascriptでそれらを設定する方法は?
-
[解決済み] swfobject.embedSWFが動作していない?
-
[解決済み] JSデコレータでESLintが予期しない文字'@'を使用する
-
[解決済み] Javascript IE エラー: メソッドまたはプロパティアクセスへの予期せぬ呼び出し
-
[解決済み] ハンドルバーでアクセス配列の項目にインデックスでアクセスするにはどうしたらいいですか?
-
[解決済み] Javascriptでonclickを変更するには?
-
macOS npm run build を実行するとエラーが発生する フィールド 'browser' に有効なエイリアス構成が含まれていない
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】React.jsの配列の子要素のユニークキーを理解する
-
[解決済み】javascriptの古典的な継承とプロトタイプの継承の比較
-
[解決済み] HTML5 <video> のクリックによる再生/一時停止/全画面表示を無効にする(YouTube用
-
[解決済み] Uncaught TypeError: 未定義のプロパティ 'toLowerCase' を読み取れませんでした。
-
[解決済み] <input type="number" />の値を通貨に設定する。
-
[解決済み] Uncaught (in promise) TypeError.を修正する方法。Cloudflare worker の 'Uncaught (in promise) TypeError: Cannot read property 'method' of undefined'' を修正するには?
-
[解決済み] jQueryの子要素を数える
-
[解決済み] ローカルファイルを開くことができません - Chrome: ローカルリソースの読み込みが許可されていません
-
[解決済み] AngularJSのコントローラ作成時にパラメータを渡すことは可能ですか?
-
[解決済み] Chart.jsでチャートの高さを設定する