Vue3常用插件

486 阅读1分钟

一、文档md

安装组件

npm i md-editor-v3

组件内使用

<script lang="ts" setup>
import { ref } from 'vue';
import MdEditor from 'md-editor-v3';
import 'md-editor-v3/lib/style.css';
import markdownTxt from '@/assets/md/README.md?raw'
const text = ref(markdownTxt)
</script>

<template>
    <MdEditor v-model="text" />
</template>

二、富文本tinymce

安装富文本

npm i @tinymce/tinymce-vue
npm i tinymce

封装组件

<script setup lang="ts">
import { ref, watch } from 'vue'
// 引入组件
import Editor from "@tinymce/tinymce-vue"
import { type RawEditorOptions } from "tinymce/tinymce"; 
// 引入编辑器
import "tinymce/tinymce"; 
import 'tinymce/themes/silver/theme'
import 'tinymce/icons/default/icons'
import 'tinymce/models/dom/model'

const props = defineProps({
    content: {
        type: String,
        default: "",
    },
})

//用于接收外部传递进来的富文本
const Content = ref(props.content)

// 以时间作为id
const ID = ref<string>(`#vue-tinymce-${new Date().getTime()}`)


// 增加外部数据变化监听器
const emits = defineEmits(["contentchange"])

//监听外部传递进来的的数据变化
watch(() => props.content, () => {
    // 监听外部内容变化
    Content.value = props.content
})

//监听富文本中的数据变化
watch(() => Content.value, () => {
    // 监听内部变量变化 回传给外部组件
    emits("contentchange", Content.value)
})

const init: RawEditorOptions = {
    //富文本编辑器的id,
    selector: ID.value,
    // 语言包的路径
    language_url: "/tinymce/langs/zh-Hans.js",
    language: "zh-Hans", //语言
    // skin路径
    skin_url: "/tinymce/skins/ui/oxide",
    //以css文件方式自定义可编辑区域的css样式,css文件需自己创建并引入
    content_css: '/tinymce/skins/content/default/content.css',
}

</script>

<template>
    <div>
        <Editor :id="ID" :init="init" v-model="Content" />
    </div>
</template>

组件内使用

<script setup lang="ts">
import HomeComponents from '@/views/home/components/HomeComponents.vue'
import TEditor from '@/components/ATinymce.vue'
import { ref } from "vue";
const content = ref('')
const Contentchange = (data: any) => {
    console.log('data', data)
}
</script>
<template>
   <div>
      <TEditor v-model="content" @contentchange="Contentchange" />
   </div>
</template>

<style lang="scss" ></style>

三、语言i18n

安装

npm install vue-i18n

编辑字段

//i18n/zh.ts
export default {
    login: {
        name: '中文'
    }
}
//i18n/en.ts
export default {
    login: {
        name: 'English'
    }
}
//i18n/index.ts
import { createI18n } from 'vue-i18n'
import zh from './zh'
import en from './en'
export default createI18n({
    locale: 'ja',
    fallbackLocale: 'zh',
    messages: {
        zh,
        en
    }
})

注册

//main.ts
import i18n from "@/i18n"
app.use(i18n)

切换按钮

<script setup lang="ts">
import { useI18n } from 'vue-i18n'
const { locale } = useI18n()
const seleLanguage = () => {
  if (locale.value == 'zh') {
    locale.value = 'en'
    return
  }
  if (locale.value == 'en') {
    locale.value = 'zh'
    return
  }
}
</script>
<template>
    <el-card>
        <el-button @click="seleLanguage">{{$t('login.name')}}</el-button>
    </el-card>
</template>

四、浏览器调用摄像头后扫码

import { reactive, toRefs } from 'vue'
import { QrStream, QrCapture, QrDropzone } from 'vue3-qr-reader'

const state = reactive({
  data: null
})

const onDecode = (data) => {
  state.data = data
}
toRefs(state)
 <div class="content">
    <qr-stream @decode="onDecode" class="mb"> 
            <div style="color: red;" class="frame"></div>
    </qr-stream>
    <span>将二维码放入框内,即可自动扫描</span>
    {{ data }}
 </div>

五、轮播图Swiper11

npm i swiper
  • slidesPerView 视图个数
  • spaceBetween 间隔
  • loop 重复
  • autoplay 自动
<script setup lang="ts">
// import function to register Swiper custom elements
import { register } from 'swiper/element/bundle'
// register Swiper custom elements
register()

const onSlideChange = () => {
    console.log('slide change');
};

const arr = [
    '789',
    '456',
    '123'
]

</script>
<template>
    <div>
        <swiper 
        :slidesPerView="1" 
        :spaceBetween="30" 
        :loop="true"
        :autoplay="{ delay: 1000, disableOnInteraction: false }"
        @slideChange="onSlideChange">
            <swiper-slide v-for="item of arr" :key="item">
                {{item}}
            </swiper-slide>
        </swiper>
    </div>
</template>