vue3集成prismjs

vue3集成prismjs

1.下载
# prismjs 
npm i prismjs -S

# prismjs 类型
npm i  @types/prismjs -D

# vite
npm install vite-plugin-prismjs -D

2.配置
  • vite.config.ts
    import { defineConfig } from "vite";
    import vue from "@vitejs/plugin-vue";
    import { resolve } from "path";
    import prismjs from "vite-plugin-prismjs";
    
    // https://vitejs.dev/config/
    export default defineConfig({
      plugins: [
        vue(),
        prismjs({
          languages: ["json", "js"],
          //  languages: 'all',
          plugins: ["line-numbers"], //配置显示行号插件
          theme: "solarizedlight", //主题名称
          css: true,
        }),
      ],
      resolve: {
        alias: {
          "@": resolve("src"),
          comps: resolve("src/components"),
          api: resolve("src/api"),
          views: resolve("src/views"),
          utils: resolve("src/utils"),
          router: resolve("src/router"),
        },
      },
      base: "./",
      server: {
        port: 8066,
        open: true,
        cors: true,
      },
    });
    
    
3.封装
<template>
  <pre :class="'hx-scroll ' + lineNumbers">
    <code :class="'language-'+ type" v-html="Prism.highlight(code, Prism.languages[type], type)"></code>
 </pre>
</template>

<script setup lang="ts">
import { onMounted, computed } from "vue";
import Prism from "prismjs";

const props = defineProps({
  code: {
    type: String,
    default: "",
  },
  type: {
    type: String,
    default: "html",
  },
  isShowlineNumbers: {
    type: Boolean,
    default: false,
  },
});
const lineNumbers = computed(() => {
  return props.isShowlineNumbers ? "line-numbers" : "";
});
onMounted(() => {
  Prism.highlightAll(); //切换菜单重新渲染
});
</script>

4.使用
<template>
  <div class="formula-content">
    <preview-code v-if="flag" :code="code" :type="type"> </preview-code>
    <span class="description">{{ description }}</span>
  </div>
</template>

<script setup lang="ts">
import { reactive, ref, defineProps, PropType, watch, nextTick } from "vue";
import PreviewCode from "comps/prismjs/Index.vue";

const props = defineProps({
  code: {
    type: String,
    default: `console.log('hello world);`,
  },
  type: {
    type: String,
    default: "js",
  },
  description: {
    type: String,
    default: "你好,世界!",
  },
});
let flag = ref(true);
watch(
  () => props.code,
  () => {
    flag.value = false;
    nextTick(() => {
      flag.value = true;
    });
  }
);
</script>

<style lang="scss" scoped>
.formula-content {
  margin: 10px;
}
</style>

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值