引入wangEditor,第一次进入使用一切正常,一旦刷新,就会报错navigator is not defined或者document.getElementsByTagName is not a funciton.
为什么会出现这样的情况呢?
刷新的时候nuxt.js 会在服务器端渲染页面,而navigator和document是window对象,在客户端在可以访问的,所以会报错。
那该怎么解决呢?
其实非常简单,服务器端不能渲染,那等到服务器端渲染完了我们再加载组件就可以了。怎么做呢?可以用Vue的component标签,来动态的获取组件。
我们先看下官网文档,再根据官方文档进行修改。
官方文档例子如下:
<template>
<div style="border: 1px solid #ccc;">
<Toolbar
style="border-bottom: 1px solid #ccc"
:editor="editor"
:defaultConfig="toolbarConfig"
:mode="mode"
/>
<Editor
style="height: 500px; overflow-y: hidden;"
v-model="html"
:defaultConfig="editorConfig"
:mode="mode"
@onCreated="onCreated"
/>
</div>
</template>
<script>
import Vue from 'vue'
import { Editor, Toolbar } from '@wangeditor/editor-for-vue'
export default Vue.extend({
components: { Editor, Toolbar },
data() {
return {
editor: null,
html: '<p>hello</p>',
toolbarConfig: { },
editorConfig: { placeholder: '请输入内容...' },
mode: 'default', // or 'simple'
}
},
methods: {
onCreated(editor) {
this.editor = Object.seal(editor) // 一定要用 Object.seal() ,否则会报错
},
},
mounted() {
// 模拟 ajax 请求,异步渲染编辑器
setTimeout(() => {
this.html = '<p>模拟 Ajax 异步设置内容 HTML</p>'
}, 1500)
},
beforeDestroy() {
const editor = this.editor
if (editor == null) return
editor.destroy() // 组件销毁时,及时销毁编辑器
}
})
</script>
修改如下:
<template>
<div style="border: 1px solid #e8ecf0">
<component
:is="toolBarComponent"
style="border-bottom: 1px solid #ccc"
:mode="mode"
:editor="editor"
:default-config="toolbarConfig"
></component>
<component
:is="editorComponent"
v-model="html"
style="height: 500px; overflow-y: hidden"
:default-config="editorConfig"
:mode="mode"
@onCreated="onCreated"
></component>
</div>
</template>
<script>
import '@wangeditor/editor/dist/css/style.css'
export default {
data() {
return {
editor: null,
html: '<p>hello</p>',
toolbarConfig: {},
editorConfig: { placeholder: '请输入内容...' },
mode: 'default', // or 'simple'
toolBarComponent: null, // 工具栏
editorComponent: null, // 编辑组件
}
},
created() {
if (process.client) {
const editor = require('@wangeditor/editor-for-vue')
this.editorComponent = editor.Editor
this.toolBarComponent = editor.Toolbar
}
},
mounted() {
// 模拟 ajax 请求,异步渲染编辑器
setTimeout(() => {
this.html = '<p>模拟 Ajax 异步设置内容 HTML</p>'
}, 1500)
},
beforeDestroy() {
const editor = this.editor
if (editor == null) return
editor.destroy() // 组件销毁时,及时销毁编辑器
},
methods: {
onCreated(editor) {
this.editor = Object.seal(editor) // 一定要用 Object.seal() ,否则会报错
},
},
}
</script>
版权声明:本文为CSDN博主「半盏 · 花凋」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/gujian_peachblossom/article/details/125720174