您现在的位置是:网站首页> 编程资料编程资料

vue3:vue2中protoType更改为config.globalProperties问题_vue.js_

2023-05-24 324人已围观

简介 vue3:vue2中protoType更改为config.globalProperties问题_vue.js_

protoType替换为config.globalProperties

原文地址

在main.js中:

vue2

Vue.prototype.$verson = '1.0.0'

使用

this.$verson

vue3

Vue.config.globalProperties.$verson = '1.0.0'

使用

Vue3 vs Vue2

Vue3 的新组件

Fragment

Vue2 中:组件必须有一个根标签

Vue3 中:可以没有根标签,内部会添加根标签

好处:减少标签层级,减少内存消耗

Teleport

用于将组件的 HTML 结构移动到指定位置

用法:

① 用 Teleport 标签将需要移动的 HTML 结构包裹住

② 设置 to 属性,属性值为 选择器,以指定移动到的位置

默认情况下,子组件的 HTML 结构会显示到父组件的 HTML 结构里面;

使用 Teleport 标签包裹子组件的 HTML 标签,则能将该 HTML 结构显示到指定的位置 

Suspense

等待异步组件时,渲染一些额外的内容,提升用户体验感

用法:

① 在父组件中,异步引入组件:defineAsyncComponent + 懒加载

② 在子组件中,配置 Suspense 标签

③ 在 Suspense 标签内,用 template 标签设置具名插槽

default 插槽的内容:为异步引入的组件

fallback 插槽的内容:为加载时显示的内容

此时,异步引入的组件中 setup 可以是 async 函数 

文件对比

main.js

Vue2

import Vue from 'vue' import App from './App.vue' import router from './router' import store from './store' Vue.config.productionTip = false new Vue({ router, store, render: h => h(App) }).$mount('#app') 

Vue3

引入的不再是 Vue 构造函数,而是工厂函数 createApp:

构造函数:通过 new 关键字调用,首字母大写

工厂函数:直接调用,首字母小写

createApp 返回:应用实例对象 (相当于 Vue2 中的 vm,但比 vm 轻)

可以在 createApp 之后链式调用其它方法

import { createApp } from 'vue' // 引入 createApp 方法 import App from './App.vue' import router from './router' import store from './store' createApp(App).use(store).use(router).mount('#app') // 链式调用

store 文件

Vue2

import Vue from 'vue' import Vuex from 'vuex' Vue.use(Vuex) export default new Vuex.Store({ state: {}, mutations: {}, actions: {}, modules: {} }) 

Vue3

import { createStore } from 'vuex' // 引入 createStore 方法 export default createStore({ state: {}, mutations: {}, actions: {}, modules: {} }) 

Vuex 的使用

先配置好 store 文件:

import { createStore } from 'vuex' export default createStore({ state: { name: "superman", arr: [1, 2, 3] }, mutations: { muModify(state, val) { console.log("commit muModify", val) state.name += val } }, actions: { acModify(context, val) { console.log("dispatch acModify", val) context.commit("muModify", val) } }, getters: { getArr(state) { return state.arr.map(item => item * 2) } }, modules: {} }) 

Vue3 中需要通过 useStore 方法使用 vuex

但是,通过该方法获取的数据不是响应式的

响应式数据设置如下:需要配合 computed 方法使用

let name = computed(() => store.state.name); let arr = computed(() => store.state.arr); let getArr = computed(() => store.getters.getArr); 

router 文件

Vue2

import Vue from 'vue' import VueRouter from 'vue-router' import Home from '../views/Home.vue' Vue.use(VueRouter) const routes = [{ path: '/', name: 'Home', component: Home }, { path: '/about', name: 'About', component: () => import('../views/About.vue') } ] const router = new VueRouter({ mode: 'history', // 设置路由模式为 history base: process.env.BASE_URL, // 根据 webpack 环境,设置 [根路径] routes }) export default router 

Vue3

import { createRouter, // 引入 createRouter 方法 createWebHistory // 引入 createWebHistory 方法 } from 'vue-router' import Home from '../views/Home.vue' const routes = [{ path: '/', name: 'Home', component: Home }, { path: '/about', name: 'About', component: () => import('../views/About.vue') } ] const router = createRouter({ history: createWebHistory(process.env.BASE_URL), routes }) export default router 
vue-router 的使用

先配置 router 文件

import { createRouter, createWebHistory } from 'vue-router' import Home from '../views/Home.vue' const routes = [{ path: '/', name: 'Home', component: Home }, { path: '/about', name: 'About', component: () => import('../views/About.vue') } ] const router = createRouter({ history: createWebHistory(process.env.BASE_URL), routes }) export default router 

Vue3 中需要通过 useRoute 方法使用 vue-router

全局 API

在 Vue3 中,全局和内部 API 都经过了重构

全局 API 现在只能作为 ES 模块构建的命名导出进行访问

import { nextTick } from 'vue' nextTick(() => { // 一些和DOM有关的东西 }) 

Vue.XXXapp.XXX

全局 directive

Vue2 - Vue.directive("自定义指令名", 配置对象)
import Vue from 'vue' import App from './App.vue' Vue.config.productionTip = false Vue.directive("focus", { bind() { console.log("指令与元素绑定时触发"); }, inserted(el) { console.log("指令所在元素插入页面时触发"); el.focus(); }, update(el) { console.log("模板重新渲染时触发"); el.focus(); } }); new Vue({ render: h => h(App) }).$mount('#app') 

也可以使用简写(回调函数执行完后,DOM 才会插入到页面中):

Vue.directive("focus
                
                

-六神源码网