当前位置: 首页 > Web前端 > vue.js

Vue3的不同之处:全局API

时间:2023-03-31 23:00:51 vue.js

Vue2.x版本有很多全局API和配置,它们会全局改变Vue的行为。例如,常见的全局API包括:Vue.component/Vue.mixin/Vue.extend/Vue.nextTick;常见的全局配置包括:Vue.config.silent/Vue.config.devtools/Vue.config.productionTip(官方示例),如果要创建全局组件,可以使用Vue.component:Vue.component('trump-糟透了',{data:()=>({position:'Americapresident',}),template:`

Trumpistheworst${position}

`;});或者声明一个全局指令:Vue.directive('focus',{inserted:el=>{console.log('focus!');el.focus();},});这样确实比较方便,但是会带来一些问题。首先要明确的是,Vue2.x在设计上并没有app(应用)的概念。开发人员在使用Vue2.x时所说的app只是一个用newVue()创建的Vue实例(哦,仅此而已)。由同一个Vue构造函数创建的Vue实例将共享构造函数的全局配置。这会导致:在测试过程中,由于全局配置的存在,测试用例很容易被“污染”。开发者需要注意找一个地方保存全局配置,每次测试后恢复,比如Vue.config.errorHandler;一些API,例如Vue.use和Vue.mixin甚至没有办法避免它的影响。一旦插件参与测试,这会使整个过程变得棘手。实际上,为了解决这个问题,vue-test-utils不得不引入一个特殊的API:createLocalVue:import{createLocalVue,mount}from'@vue/test-utls';constlocalVue=createLocalVue();localVue.use(我的插件);安装(组件,{localVue});另一个无法回避的问题是,一旦页面上有多个Vue实例,它们的全局配置自然是共享的,但很多时候开发者并不想得到这样的东西Vue.mixin({mounted:()=>{console.日志('wubbalubbadubdub');},});constrick=newVue({el:'#rick'});constmorty=newVue({el:'#morty'});因此,为了避免这些问题,Vue3引入了应用实例的概念。全局API:createApp调用createApp会返回一个应用实例,没错,应用实例的概念是Vue3新引入的。import{createApp}from'vue';constapp=createApp();应用程序实例将公开当前全局API的一个子集。在这次重构工作中,Vue团队遵循了一条经验法则:任何影响Vue全局行为的API都将迁移到应用程序实例中。2.x的全局API3.x的应用实例APIVue.configapp.configVue.config.productionTip去掉Vue.config.ignoredElementsapp.config.isCustomElementVue.componentapp.componentVue.directiveapp.directiveVue.mixinapp.mixinVue.useapp.useOthers不会影响Vue的APIbehaviorglobals都改成了namedexports,就像优雨熙优达之前在直播中说的:为了支持TreeShaking。挂载一个应用实例使用createApp(VueInstance)得到一个应用实例后,这个应用实例可以用来挂载整个Vue和实例到页面:import{createApp}from'vue';importMyAppfrom'./MyApp.vue';constapp=createApp(MyApp);app.mount('#app');完成这些改造后,我们一开始提到的例子将被改写为:app.component('trump-sucks',{data:()=>({position:'Americapresident',}),template:`

是最糟糕的${position}

`;});app.directive('focus',{inserted:el=>{console.log('focus!');el.focus();},});//至此,app包含的组件树中创建的所有Vue实例都是组件trump-sucks,directivefocus将被共享,Vue构造函数没有被污染。多个应用实例的配置共享上面提到的“不是所有开发者都想要的全局配置共享”在Vue3中可以通过工厂函数来实现:import{createApp}from'vue';从'./CXK.vue'导入蔡徐坤;从'./WYF.vue'导入吴亦凡;constcreateIdolApp=(IdolInstance)=>{constidolApp=createApp(IdolInstance);idolApp.directive('sing-and-dance',{inserted:()=>{console.log('我很酷!');},});}createIdolApp(CaiXuKun).mount('#caixukun');createIdolApp(吴亦凡).mount('#wuyifan');这样就可以共享多个应用实例的配置:蔡徐坤和吴亦凡都有一个Vue自定义命令叫“唱歌跳舞”。更多内容请访问官网:https://v3.vuejs.org/guide/mi...(暂无中文版)文章首发于我的卫星攻击账号,请点击:这里