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

vue中的几个高级概念

时间:2023-03-31 16:13:02 vue.js

mixinintomixins官方解释Mixin(混入)提供了一种非常灵活的方式在Vue组件中分发可重用的功能。混合对象可以包含任意组件选项。当组件使用mixin时,mixin的所有选项都将“混合”到组件自己的选项中。简单来说,Mixins就是我们可以复用的代码块。在实际开发中,如果有些代码重复性很高,这时候就可以考虑Mixins的这个特性。简单的mixin示例exportdefault{data(){return{name:'namefrommixin',arr:[1,{arrName:'frommixin',arrMixin:'frommixin'},1233],obj:{name:'frommixin',value:'frommixin',mixin:'一个只能在mixin中可用的字段'}}},created(){console.log('我是由mixin创建的---')},mounted(){console.log('Iamamixinmounted---')this.getInfo()},methods:{getInfo(){console.log('Iamamixin,getInfo:',this.name)控制台。log('Iammixin'sobj:',this.obj)console.log('Iammixin'sarr:',this.arr)}}}组件使用importmixinDemofrom'./mixin.js'exportdefault{name:'',mixins:[mixinDemo],components:{},data(){return{name:'namefromcomponent',arr:[2,{arrName:'arrNamefromcomponent',title:'唯一字段标题'来自组件}],obj:{name:'来自组件名称',value:'来自组件值',title:'只有组件的title字段'}}},computed:{},watch:{},创建(){console.log('---我是创建的组件---')},mounted(){console.log('---我是安装的组件---')this.getInfo()},methods:{getInfo(){console.log('我是一个组件,getInfo:',this.name)console.log('我是一个组件的obj:',this.obj)console.log('我是一个componentarr:',this.arr)}}}控制台结果从上面的结果我们可以发现,生命周期钩子函数会结合起来,先执行mixin的钩子函数,再执行组件的钩子函数。数据同名的数据要具体情况具体讨论。如果是基本类型,mixin的数据会被组件的同名数据覆盖。但如果是对象,内部会递归合并数据对象,发生冲突时组件数据优先。类似于Object.assign(mixinObj,componentObj);对于数组,直接用组件中的数据优先方法的方法是一样的,组件的方法会覆盖mixin的同名方法。除了上述之外,还有方法、组件和指令,它们将被合并到同一个对象中。当两个对象的键名冲突时,取组件对象的键值对,覆盖同名的,组件优先。全局mixinsMixins也可以全局注册。谨慎使用!一旦使用全局混合,它将影响此后创建的每个Vue实例。如果使用得当,它可用于为自定义选项注入处理逻辑。mix-in引起的问题用多了容易混。后期维护时,不容易找到变量或方法。自定义指令directive介绍除了核心功能默认内置的指令(v-model和v-show),Vue还允许注册自定义指令。注意,在Vue2.0中,代码复用和抽象的主要形式是组件。但是,在某些情况下,您仍然需要对普通DOM元素进行低级操作,这时就会用到自定义指令。比如项目中常用的水印功能。我们将水印样式添加到div范围。可以使用自定义指令。先看效果图生成水印的方法有很多种。我们现在通过自定义指令进行操作,熟悉自定义指令的使用。先上传代码方法文件value,el)},update:function(el,binding){if(binding.oldValue!==binding.value){addWaterMarker(binding.value,el)}}}导出默认waterMarker注册自定义指令importVuefrom'vue'importwaterMarkerfrom'./watermark.js'Vue.directive(waterMarker.name,waterMarker)main.js全局调用import'./directive.js'。组件中使用的指令需要通过v-+指令名引用

参考vue实战视频讲解:进入钩子学习指令的功能指令定义对象可以提供以下钩子函数(都是可选的):bind:只调用一次,当指令第一次绑定到元素时。可以在这里进行一次性的初始化设置。inserted:绑定元素插入到父节点时调用(只保证父节点存在,不一定插入到文档中)。update:组件的VNode更新时调用,但也有可能发生在其子VNode更新之前。指令的值可能已更改,也可能未更改。但是可以通过比较更新前后的值来忽略不必要的模板更新(钩子函数参数详见下文)。componentUpdated:命令所在组件的VNode及其子VNode全部更新后调用。unbind:仅在指令与元素解除绑定时调用一次。命令钩子函数会传入以下参数:el:命令绑定的元素,可以用来直接操作DOM。binding:包含以下属性的对象:name:指令的名称,不包括v-前缀。value:指令的绑定值,例如:在v-my-directive="1+1"中,绑定值为2。oldValue:指令绑定的前一个值,仅在update和componentUpdated钩子中可用。无论值是否已更改均可用。expression:字符串形式的指令表达式。例如,在v-my-directive="1+1"中,表达式为"1+1"。arg:传递给命令的参数,可选。例如,在v-my-directive:foo中,参数是“foo”。修饰符:包含修饰符的对象。例如:在v-my-directive.foo.bar中,修饰符对象为{foo:true,bar:true}。vnode:Vue编译生成的虚拟节点。移至VNodeAPI了解更多详情。oldVnode:前一个虚拟节点,仅在update和componentUpdatedhooks中可用。组件中的本地自定义指令exportdefault{directives:{waterMarker:{//当前指令的hook函数略bind(){}}}}filterfilterVuefilter本质上是一个接受一个值并进行处理的函数,Then返回处理后的值。过滤器可以用在两个地方:双花括号插值和v-bind表达式(后者从2.1.0+开始支持)。过滤器应添加在JavaScript表达式的末尾,由组件中使用的“竖线(|)”符号指示{{btn|btnFilter}}
id
过滤器定义在组件中constfilterList=[{key:1,text:'submit'},{key:2,text:'view'},{key:3,text:'Edit'},{key:4,text:'Delete'}]exportdefault{过滤器:{btnFilter(val){returnfilterList.find(item=>item.key===val).text}},data(){return{btn:1,btn2:3}}}全局定义过滤器importVuefrom'vue'Vue.filter('btnFilter',function(value){//逻辑代码...})--------//然后可以参考main.js。该过滤器可以串联使用{{btn|btn过滤器|newBtnFilter}}将上面的btn作为参数传递给btnFilter,然后继续调用newBtnFilter,此时btnFilter的结果会作为参数。过滤器是一个JavaScript函数,因此它可以接收参数{{btn|btnFilter('arg1','arg2')}}其中btnFilter相当于一个接收三个参数的函数。其中btn是第一个参数,'arg1'是第二个参数,'arg2'是第三个参数。TransitionVue提供了多种不同的方式来在插入、更新或删除DOM时应用过渡效果。包括以下工具:自动在CSS过渡和动画中应用类可以与第三方CSS动画库结合使用,例如Animate.css在过渡钩子函数中使用JavaScript直接操作DOM可以与第三方结合使用JavaScript动画库,如Velocity.jsVue提供了带过渡的封装组件,在以下情况下,您可以为任意元素和组件添加进入/退出过渡条件。渲染(使用v-if)条件显示(使用v-show)动态组件组件根节点示例{{btn|btnFilter}}
过渡动画

exportdefault{data(){return{isShow:true}},方法:{show(){this.isShow=!this.isShow}}}.a-enter-active,.a-leave-active{transition:opacity0.5s;}.a-enter,.a-leave-to{opacity:0;}当插入或删除transition组件中包含的元素时,Vue将执行以下操作:自动嗅探CSS是否应用于目标元素Transitions或animations,如果是,则在适当的地方添加/删除CSS类名。如果过渡组件提供了JavaScript钩子函数,这些钩子函数将在适当的时候被调用。如果没有找到JavaScript钩子并且没有检测到CSS转换/动画,则在下一帧中立即执行DOM操作(插入/删除)。(注意:这里指的是浏览器的逐帧动画机制,与Vue的nextTick概念不同。)过渡的类名在进入/离开的过渡过程中会有6个类切换。v-enter:定义进入转换的开始状态。元素插入前生效,元素插入后下一帧移除。v-enter-active:定义进入转换激活时的状态。在整个进入过渡阶段应用,在插入元素之前应用,并在过渡/动画完成后移除。此类可用于将处理时间、延迟和曲线函数定义为转换。v-enter-to:2.1.8及以上版本定义了enter过渡的结束状态。在插入元素后应用下一帧(同时移除v-enter),在过渡/动画完成后移除。v-leave:定义离开转换的开始状态。退出转换被触发后,它会立即在下一帧被删除。v-leave-active:定义离开转换激活时的状态。在整个退出过渡阶段应用,在触发退出过渡时立即应用,并在过渡/动画完成后移除。此类可用于定义离开转换的处理时间、延迟和曲线函数。v-leave-to:2.1.8及以上版本定义了离开过渡的结束状态。在离开过渡被触发后应用下一帧(同时v-leave被移除),在过渡/动画完成后被移除。中的名字对应上面类名的v,如:name="a"对应类名a-enter等。如果使用没有名字的,则默认v-这些类名的前缀。这样我们就可以通过编写不同的css动画样式,配合实现不同的效果。JavaScript钩子这个时候我们可以在不同的hooks中使用Velocity等动画库来实现我们需要的动画效果。