You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vue3程序化创建组件时vue3-highlightjs失效报错问题

问题原因

你在程序化生成组件时,每次循环都用createApp()创建了全新的Vue应用实例,但这些子实例没有安装vue3-highlightjs插件,导致v-highlightjs指令不存在,触发了Cannot read properties of undefined (reading 'deep')错误——这个错误是Vue在找不到指令时,内部处理指令绑定的逻辑抛出的。

修复方案一:复用主应用上下文(推荐)

不要手动创建DOM元素再挂载新应用,改用Vue的h函数和render函数动态渲染组件,这样组件会复用主应用已安装的插件和指令:

import { h, render } from 'vue'
import CodeSnippet from './CodeSnippet.vue'

// 你的组件方法中修改为:
renderCodeSnippet() {
  const container = this.$refs.container
  container.innerHTML = '';
  
  codeSnippetSysthem.codeSnippetarray.forEach((item, i) => {
    const currentPosition = i;
    const _setTop = this.startX + (currentPosition % this.rowAmount) * 300;
    const _setLeft = this.startY + Math.floor(currentPosition / this.rowAmount) * 300;

    // 定义组件props
    const componentProps = {
      setTop: _setLeft.toString(),
      setLeft: _setTop.toString(),
      title: item.title,
      codeContent: item.codeContent,
      codeSnippetPosition: currentPosition,
      // 直接在props中绑定事件,比手动addEventListener更符合Vue规范
      onMouseup: this.RenderCodeSnippet
    }

    // 创建虚拟节点并渲染到容器
    const vnode = h(CodeSnippet, componentProps)
    render(vnode, container)
  })
}
修复方案二:直接使用原生highlight.js(更稳定)

放弃vue3-highlightjs指令,直接在组件内调用highlight.js的API,彻底避免指令上下文问题:

  1. 安装依赖(如果没装的话):
npm install highlight.js
  1. 修改CodeSnippet.vue:
<template>
  <div :style="{ top: setTop, left: setLeft }"> <!-- 假设你需要定位样式 -->
    <h3>{{ title }}</h3>
    <pre><code :class="`language-${language}`" ref="codeElement">{{ codeContent }}</code></pre>
  </div>
</template>

<script setup>
import { ref, onMounted, watch, defineProps } from 'vue'
import hljs from 'highlight.js'
import 'highlight.js/styles/solarized-light.css'

// 定义组件接收的props
const props = defineProps({
  setTop: String,
  setLeft: String,
  title: String,
  codeContent: String,
  codeSnippetPosition: Number,
  language: {
    type: String,
    default: 'javascript'
  }
})

const codeElement = ref(null)

// 高亮代码的函数
const highlightCode = () => {
  if (codeElement.value) {
    hljs.highlightElement(codeElement.value)
  }
}

// 挂载时高亮,代码更新时重新高亮
onMounted(highlightCode)
watch(() => props.codeContent, highlightCode)
</script>

这种方式不需要在main.js中全局安装插件,组件完全独立,不管是静态引用还是程序化渲染都能正常工作。

内容的提问来源于stack exchange,提问作者swompy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 19:25:41