zoukankan      html  css  js  c++  java
  • VUE3——如何挂载全局属性和方法

    前言

    之前看过VUE3的文档,现在是实操进行记录下,相关文档如下:
    provide/inject: https://v3.vuejs.org/guide/component-provide-inject.html#working-with-reactivity
    provide/inject: https://v3.vuejs.org/guide/composition-api-provide-inject.html#using-provide
    provide/inject: https://v3.vuejs.org/guide/migration/global-api.html#provide-inject
    config.globalProperties: https://v3.vuejs.org/guide/migration/global-api.html#vue-prototype-replaced-by-config-globalproperties
    getCurrentInstance: https://v3.vuejs.org/api/composition-api.html#getcurrentinstance

    内容

    全局方法

    • storage.ts
    const storage = {
        set(k: string, v: any) {
            localStorage.setItem(k, JSON.stringify(v))
        },
        get(k: string) {
            return localStorage.getItem(k)
        },
        remove(k: string) {
            localStorage.removeItem(k)
        }
    }
    
    export default storage
    

    provide/inject

    挂载属性

    • mian.ts
    import { createApp } from 'vue'
    import App from './App.vue'
    import router from './router'
    import { errorHandler } from './utils/error'
    import ElementPlus from 'element-plus'
    import 'element-plus/theme-chalk/index.css'
    // 引入需要挂载的文件
    import packageInfo from '../../package.json'
    
    const app = createApp(App)
    app.use(router)
    app.use(ElementPlus)
    errorHandler(app)
    // provide进行挂载
    app.provide('$version', packageInfo.version)
    
    app.mount("#app")
    
    • index.vue
    <template>
        <div class="title">V{{state.version}}</div> 
    </template>
    
    <script lang="ts">
    
    import {inject, reactive} from 'vue'
    
    export default {
      name: "dashBoard",
    
      setup() {
        // 进行注入
        let version = inject('$version')
        const state = reactive({
          // 使用
          version: version,
        })
    
        onMounted(() => {
          console.log('onMounted打印全局属性version:',version)
        })
    
        return {
          state,
        }
        
      }
    
    }
    
    </script>
     
    
    <style>
     .title {
        font-size: 24px;
        font-weight: 800;
      }
      .margin-top-10 {
        margin-top: 20px
      }
      .windth-320 {
        320px;
      }
    </style>
    

    挂载方法

    • main.ts
    import { createApp } from 'vue'
    import App from './App.vue'
    import router from './router'
    import { errorHandler } from './utils/error'
    import ElementPlus from 'element-plus'
    import 'element-plus/theme-chalk/index.css'
    // 引入方法
    import storage from './utils/storage'
    import packageInfo from '../../package.json'
    
    const app = createApp(App)
    app.use(router)
    app.use(ElementPlus)
    errorHandler(app)
    app.provide('$version', packageInfo.version)
    // 挂载方法
    app.provide('$storage', storage)
    
    app.mount("#app")
    
    • index.vue
    <template>
        <div class="title">欢迎进入本助手 | {{state.time}} | V{{state.version}}</div> 
    </template>
    
    <script lang="ts">
    
    import {inject, onMounted, reactive} from 'vue'
    import { format } from 'date-fns'
    
    export default {
      name: "dashBoard",
    
      setup() {
        const version = inject('$version')
        const storage = inject('$storage')
        const state = reactive({
          time: format(new Date(), "yyyy/MM/dd HH:mm"),
          version: version,
        })
    
        onMounted(() => {
          console.log('onMounted打印全局方法storage', storage)
        })
    
        return {
          state,
        }
        
      }
    
    }
    
    </script>
     
    
    <style>
     .title {
        font-size: 24px;
        font-weight: 800;
      }
      .margin-top-10 {
        margin-top: 20px
      }
      .windth-320 {
        320px;
      }
    </style>
    

    config.globalProperties

    挂载属性

    • main.ts
    import { createApp } from 'vue'
    import App from './App.vue'
    import router from './router'
    import { errorHandler } from './utils/error'
    import ElementPlus from 'element-plus'
    import 'element-plus/theme-chalk/index.css'
    import packageInfo from '../../package.json'
    
    const app = createApp(App)
    app.use(router)
    app.use(ElementPlus)
    errorHandler(app)
    // 挂载
    app.config.globalProperties.$version = packageInfo.version
    
    app.mount("#app")
    
    • index.vue
    <template>
        <div class="title">V{{state.version}}</div> 
    </template>
    
    <script lang="ts">
    
    import {getCurrentInstance, onMounted, reactive} from 'vue'
    
    export default {
      name: "dashBoard",
    
      setup() {
        const internalInstance = getCurrentInstance() 
        const version = internalInstance.appContext.config.globalProperties.$version
        const state = reactive({
          version: version,
        })
    
        onMounted(() => {
          console.log('onMounted打印全局属性version:',version)
        })
    
        return {
          state,
        }
        
      }
    
    }
    
    </script>
     
    
    <style>
     .title {
        font-size: 24px;
        font-weight: 800;
      }
      .margin-top-10 {
        margin-top: 20px
      }
      .windth-320 {
        320px;
      }
    </style>
    

    挂载方法

    • main.ts
    import { createApp } from 'vue'
    import App from './App.vue'
    import router from './router'
    import { errorHandler } from './utils/error'
    import ElementPlus from 'element-plus'
    import 'element-plus/theme-chalk/index.css'
    // 引入全局方法
    import storage from './utils/storage'
    import packageInfo from '../../package.json'
    
    const app = createApp(App)
    app.use(router)
    app.use(ElementPlus)
    errorHandler(app)
    app.config.globalProperties.$version = packageInfo.version
    // 挂载全局方法
    app.config.globalProperties.$storage = storage
    
    app.mount("#app")
    
    • index.vue
    <template>
        <div class="title">欢迎进入本助手 | {{state.time}} | V{{state.version}}</div> 
    </template>
    
    <script lang="ts">
    
    import { getCurrentInstance, onMounted, reactive} from 'vue'
    import { format } from 'date-fns'
    
    export default {
      name: "dashBoard",
    
      setup() {
        const internalInstance = getCurrentInstance() 
        const version = internalInstance.appContext.config.globalProperties.$version
        // 引入方法
        const storage = internalInstance.appContext.config.globalProperties.$storage
        const state = reactive({
          time: format(new Date(), "yyyy/MM/dd HH:mm"),
          version: version,
        })
    
        onMounted(() => {
          console.log('onMounted打印全局方法storage', storage)
        })
    
        return {
          state,
        }
        
      }
    
    }
    
    </script>
     
    
    <style>
     .title {
        font-size: 24px;
        font-weight: 800;
      }
      .margin-top-10 {
        margin-top: 20px
      }
      .windth-320 {
        320px;
      }
    </style>
    

    学无止境,谦卑而行.
  • 相关阅读:
    BZOJ3420[POI2013]Triumphal arch&BZOJ5174[Jsoi2013]哈利波特与死亡圣器——树形DP+二分答案
    BZOJ3417[Poi2013]Tales of seafaring——BFS
    BZOJ3750[POI2015]Pieczęć——链表
    bzoj 3594 方伯伯的玉米田
    Cocos2dx学习之SimpleGame
    新旧版本的quick-x项目移植
    cocos2dx 2.2.1 下面创建新项目测试运行
    VS2012下面编译Cocos2dx的HelloLua项目时报错>>> 项目文件"" 已被重命名或已不在解决方案中
    cocos2dx-lua or quick 2dx 中的图片资源加密
    关于对quick-2dx项目中的Lua代码的加密
  • 原文地址:https://www.cnblogs.com/wangyang0210/p/15624101.html
Copyright © 2011-2022 走看看