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

vue开发技巧2

时间:2023-03-31 20:02:31 vue.js

8.功能组件是无状态的,不能被实例化。没有内部生命周期函数。一切都通过上下文参数传递。上下文属性有:1.props:提供所有prop对象2.children:VNode子节点的数组3.slots:返回包含所有槽的对象的函数4.scopedSlots:(2.6.0+)暴露的对象传入的作用域插槽。还将普通插槽公开为函数。5.data:传递给组件的整个数据对象,作为createElement的第二个参数传入组件6.parent:父组件的引用7.listeners:(2.3.0+)一个包含所有父组件作为当前组件注册事件监听器的一个对象。这是data.on的别名。8.injections:(2.3.0+)如果使用了inject选项,对象包含应该被注入的属性{{item}}

components和Vue.component本地注册exportdefault{components:{home}}全局注册Vue.component('home',home)Vue.extend有时需要挂载一些元素到On元素,需要使用extend//创建构造函数varProfile=Vue.extend({template:'

{{extendData}}
实例传入的数据为:{{propsExtend}}

',//模板对应的label最外层必须只有一个labeldata:function(){return{extendData:'Thisistheextendeddata',}},props:['propsExtend']})//创建构造函数可以挂载在元素上,也可以通过组件注册或者Vue.component()//挂载在元素上。可以通过propsData.newProfile({propsData:{propsExtend:'我是实例传入的数据'}}).$mount('#app-extend')//通过组件或者Vue注册Vue。component().component('Profile',Profile)11.mixins的部分组件有重复的js逻辑校验可以放入mixinsconstmixin={created(){this.dealTime()},methods:{dealTime(){console.log('这是mixin的dealTime中的方法');}}}exportdefault{mixins:[mixin]}extends一次只能扩展一个组件constextend={created(){this.dealTime()},methods:{dealTime(){console.log('Thisismixin的dealTime中的方法');}}}exportdefault{extends:extend}Vue.use()会触发安装函数install第一个参数是Vue的构造函数,第二个参数是一个可选的options对象varMyPlugin={}MyPlugin.install=function(Vue,options){//添加全局资源Vue.directive('click',{bind(el,binding,vnode,oldVnode){//准备绑定,添加时间监听console.log('命令的绑定my-directivehasbeenexecuted');},inserted:function(el){//获取绑定元素console.log('my-directive插入的指令被执行')},update:function(){//初始化会调用一次,更新也会调用useconsole.log('执行my-directive的更新命令');},componentUpdated:function(){console.log('执行my-directive的componentUpdated命令');},unbind:function(){//做清理工作//例如事件监听器console.log('命令my-directive的unbind被执行');}})//混入组件Vue.mixin({created:function(){console.log('createdoftheinjectedcomponentiscalled');console.log('options的值为',options)}})Vue.prototype.$myMethod=function(methodOptions){console.log('调用实例方法myMethodCalled');}}Vue.use(MyPlugin,{someOption:true})Vue.nextTick页面加载完成后需要获取焦点,dom更新完成后立即调用事件mounted(){//因为mounted阶段dom没有渲染完成,所以需要$nextTickthis.$nextTick(()=>{this.$refs.inputs.focus()//通过$refs获取dom并绑定焦点方法})}Vue.directive,for例如,将颜色转换为指令你可以使用//全局定义Vue.directive("change-color",function(el,binding,vnode){el.style["color"]=binding.value;})//使用1.bind只调用一次,当指令第一次绑定到元素时,这个钩子可以用来定义一个初始化绑定动作时执行一次2.inserted:绑定元素插入父节点时调用(如果父节点存在即可调用,文档中不需要存在)3.update:绑定元素所在模板时调用被更新,并且不管绑定值是否存在变化,通过比较更新前后的绑定值,忽略不必要的模板更新4.componentUpdate:当绑定元素所在的模板完成一个更新更新周期时调用17.Vue.filter将时间戳转换成年月日的公共方法//使用//在双花括号中{{message|capitalize}}//in`v-bind`
//全局注册Vue.filter('stampToYYMMDD',(value)=>{//处理logic})//本地注册过滤器:{stampToYYMMDD:(value)=>{//处理逻辑}}//全局注册多个过滤器///src/common/filters.jsletdateServer=value=>value.replace(/(\d{4})(\d{2})(\d{2})/g,'$1-$2-$3')export{dateServer}///src/main.jsimport*ascustomfrom'./common/filters/custom'Object.keys(custom).forEach(key=>Vue.filter(key,custom[key]))Vue.compile渲染模板中的编译字符串仅在独立构建时有效varres=Vue.compile('
{{msg}}
')newVue({data:{msg:'hello'},render:res.render,staticRenderFns:res.staticRenderFns})Vue.version获取vue版本以兼容varversion=Number(Vue.version.split('.')[0])if(version===2){//Vuev2.x.x}elseif(version===1){//Vuev1.x.x}else{//不支持的Vue版本}20.Vue.set()使用索引直接设置数组项或修改数组长度时,由于Object.defineprototype()方法的限制,数据不会响应式更新//使用setthis.$set(arr,index,item)//使用数组push(),splice()21.Vue.config.keyCodes自定义key修改别名//定义keycodeas113asf2Vue.config.keyCodes.f2=113;22.Vue.config.performance监控性能只适用于开发模式和支持的浏览器performance.markapi23.Vue.config.errorHandler1。场景:指定组件渲染和观察过程中未捕获错误的处理函数2.规则:从2.2.0开始,该钩子也会捕获组件生命周期钩子中的错误。同样,当这个钩子未定义时,捕获到的错误会通过console.error输出,避免应用崩溃。从2.4.0开始,这个钩子也会捕获Vue自定义事件处理程序内部的错误。从2.6.0开始,这个钩子也会捕获内部v-onDOM监听器抛出的错误。此外,如果任何被覆盖的钩子或处理程序返回一个Promise链(例如异步函数),来自其Promise链的错误也将被处理3.使用Vue.config.errorHandler=function(err,vm,info){//handleerror//`info`是Vue特有的错误信息,比如错误所在的生命周期钩子//2.2.0+才有}捕捉全局异常24.Vue.config.warnHandler是Vue的runtimewarning自定义处理只在开发模式有效Vue.config.warnHandler=function(msg,vm,trace){//`trace`是组件的继承关系跟踪}25.v-pre不编译{{thiswillnotbecompiled}}显示{{thiswillnotbecompiled}}{{msg}}即使在数据中定义了msg,它仍然是此处显示{{msg}}26。v-cloak防止网速慢时变量闪烁。当元素与示例关联时,编译CSS规则,例如[v-cloak]{display:none}。一起使用时,该指令可以隐藏未编译的Mustache标签,直到实例准备就绪//intemplate

{{value.name}}

//[v-cloak]incss{display:none;}v-once一些模板中的静态dom没有改变。此时只需要渲染一次,可以减少开销`此时只需要加载一次的标签`28.事件修饰符.stop防止冒泡.prevent防止默认行为.self只绑定元素本身触发.once只触发一次.passive滚动事件触发的默认行为29.键修饰符和键码有时需要监听的行为键盘,比如回车查询界面等//对应键盘上的关键字。enter.tab.delete(捕获“删除”和“退格”键).esc.space.up.down.left.right30.Vue-router1。缓存和动画//或者include="a,b":include="/a|b/",a和b代表组件名//因为有些页面,比如试数据统计,需要实时刷新,所以不需要缓存//路由标签//c表示组件的name值匹配首先检查组件本身的name选项,如果name选项不存在,则匹配其本地注册名称(key值父组件组件选项),匿名组件不可用2、全局路由钩子router.beforeEachrouter.beforeEach((to,from,next)=>{console.log('全局前卫:beforeEach--next需要调用')//一般登录拦截就用这个,也叫navigationhookguardif(path==='/login'){next()return}if(token){next();}})router.beforeResolve类似于router.beforeEach,区别在th之前e导航确认,在all组件中的guard和异步路由组件解析后,在router.afterEach全局post-hook路由跳转后调用afterrouter.beforeEach。3、组件路由钩子beforeRouteEnter在渲染组件对应的路由之前被调用。接下来需要手动调用。给next一个vm来访问example,执行beforeRouteEnter(to,from,next){//这里还不能访问组件实例,this===undefinednext(vm=>{//通过`vm`访问组件实例})}beforeRouterUpdate当当前路由发生变化,组件被复用时,调用beforeRouterLeave4。Routemodemodeattributehashorhistory5.Vue.$routerbeforeRouteEnter(to,from,next){//这里组件实例还不能访问,this===undefinednext(vm=>{//通过`访问组件实例vm`})}6、vue.$route表示当前跳转的路由对象,属性为:name:路由名称path:路径query:传参接收值params:传参接收值fullPath:解析后的URL,包括查询参数和hash匹配的完整路径:路由记录的副本redirectedFrom:如果有重定向,则为重定向源路由名称this.$route.params.id:获取通过的参数paramsor/:idthis.$route.query.id:获取通过query传递的参数router-viewkey因为vuerestorewiththesame组件将不再执行创建和挂载的hook``31.Object.freeze冻结属性newVue({data:{//vue不会为列表中的对象绑定list和getter和setter:Object.freeze([{value:1},{value:2}])},mounted(){//接口不会respondbecauseasinglepropertyisfrozenthis.list[0].value=100;//接口会响应下面两个方法this.list=[{value:100},{value:200}];this.list=Object.freeze([{value:100},{value:200}]);}})32.开发环境调试模板挂载日志//main.jsVue.prototype.$log=window.console.log;//组件内部
{{$log(info)}}
33.vue-loadertipspreserveWhitespaceremovespaces{vue:{preserveWhitespace:false}}transformToRequire自动配置//vue-cli2.x在vue-loader.conf.js中默认配置是transformToRequire:{video:['src','poster'],source:'src',img:'src',image:'xlink:href'}//配置文件,如果是vue-cli2.x在vue-loader.conf.js中修改头像:['default-src']//vue.config.js中的vue-cli3.x//vue-cli3.x将transformToRequire属性替换为transformAssetUrlsmodule.exports={pages,chainWebpack:config=>{config.module.rule('vue').use('vue-loader').loader('vue-loader').tap(options=>{options.transformAssetUrls={avatar:'img-src',}returnoptions;});}}//页面代码可以简化为34.在webpack.base.config.js中为路径//resolve配置项设置别名,为其别名添加别名resolve:{extensions:['.js','.vue','.json'],alias:{'vue$':'vue/dist/vue.esm.js','@':resolve('src'),}},vue3.0//在根目录下创建vue.config.jsvarpath=require('path')functionresolve(dir){console.log(__dirname)returnpath.join(__dirname,dir)}module.exports={chainWebpack:config=>{config.resolve.alias.set(key,value)//key和value是自己定义的,比如.set('@@',resolve('src/components'))}}35.img加载失败//页面代码36csspartialstylescopeddeep属性