zoukankan      html  css  js  c++  java
  • vue使用技巧,及遇到的问题

    这里给大家分享一下vue中的一些技巧,希望对大家有用处。(话不多说上代码)

    1,vue路由拦截浏览器后退实现表单保存类似需求(为了防止用户突然离开,没有保存已输入的信息。)

    //在路由组件中:
    mounted(){
    },
    beforeRouteLeave (to, from, next) {
      if(用户已经输入信息){
        //出现弹窗提醒保存表单,或者自动后台为其保存
        
      }else{
        next(true);//用户离开
      }
    

    请参考vue文档全局钩子和组件钩子

    2,路由懒加载写法:

        // 我所采用的方法,个人感觉比较简洁一些,少了一步引入赋值。
        const router = new VueRouter({
          routes: [
            path: '/app',
            component: () => import('./app'),  // 引入组件
          ]
        })
        // Vue路由文档的写法:
        const app = () => import('./app.vue') // 引入组件
        const router = new VueRouter({
          routes: [
            { path: '/app', component: app }
          ]
        })

    3,路由的项目启动页和404页面

    一般项目都会设置这个,如果默认进入地址会跳到login页面,如果你输入的是一个没有用的路由或者是空路由会跳转到notFind页面(你自己设置的404页面)

        export default new Router({
          routes: [
            {
              path: '/', // 项目启动页
              redirect:'/login'  // 重定向到下方声明的路由 
            },
            {
              path: '*', // 404 页面 
              component: () => import('./notFind') // 或者使用component也可以的
            },
          ]
        })

    4,setInterval路由跳转继续运行并没有销毁问题

    beforeDestroy(){
         //我通常是把setInterval()定时器赋值给this实例,然后就可以像下面这么暂停。
        clearInterval(this.intervalid);
    },

    beforeDestroy方法是生命周期里组件销毁前执行的钩子函数,在离开的时候会触发这个方法,这个方法在其他的地方也会有妙用,希望大家可以去了解一下。

    5,setTimeout/setInterval this指向改变,无法用this访问VUe实例

    这个地方大家的默认方法肯定是:

        //使用变量访问this实例
        let self=this;
            setTimeout(function () {  
              console.log(self);//使用self变量访问this实例
            },1000);

    其实这个地方我们可以用箭头函数,因为箭头函数会改变this的指向,而指向的刚好是自己的父级this,所以我们可以这样用:

        //箭头函数访问this实例 因为箭头函数本身没有绑定this
         setTimeout(() => { 
           console.log(this);
        }, 500);

    这样我们的this就是指向我们的vue实例了。

    6,Vue 数组/对象更新 视图不更新

    方法一:直接使用最简单也是最有效的方法,深拷贝对象或者数组,视图会进行更新,不过会有一个缺点,深拷贝后的数组或者对象不是原来的那个数组或者对象,是你现在改变了之后的值。

    上代码:

    你的对象或者数组=JSON.parse(JSON.stringify(你的对象或者数组))

    先进行转字符串,再转回对象,这个就进行了一个拷贝的过程,会触发视图的改变,同时也进行了一个数组的替换,有利有弊。

    方法二:this.$set(你要改变的数组/对象,你要改变的位置/key,你要改成什么value)

    this.$set(this.arr, 0, "OBKoro1"); // 改变数组
    this.$set(this.obj, "c", "OBKoro1"); // 改变对象

    这个是vue专门为改变不了数组设定的一个方法,使用也很简单(如果还是不懂请参考vue文档)

    7,深度watch与watch立即触发回调

    watch很多人都在用,但是这watch中的这两个选项deepimmediate,或许不是很多人都知道,我猜。

    选项:deep

    在选项参数中指定 deep: true,可以监听对象中属性的变化。

    选项:immediate

    在选项参数中指定 immediate: true, 将立即以表达式的当前值触发回调,也就是默认触发一次。

        watch: {
            obj: {
              handler(val, oldVal) {
                console.log('属性发生变化触发这个回调',val, oldVal);
              },
              deep: true // 监听这个对象中的每一个属性变化
            },
            step: { // 属性
              //watch
              handler(val, oldVal) {
                console.log("默认触发一次", val, oldVal);
              },
              immediate: true // 默认触发一次
            },
          },

    8,关于bus传参问题,如果通过路由跳转触发bus不生效问题解决

    //页面1
      beforeDestroy () {
            bus.$emit('dataFromBus1',this.dataFromBus1);
      },
    //页面2
         beforeCreate () {
            bus.$on('dataFromBus1',function(url){
                bus.dataFromBus1 = url
            });        
        },    
        mounted () {
            this.dataFromBus1 = bus.dataFromBus1;       
        },

    在页面1通过$emit方法传递数据然后跳转路由的时候,其实页面2的$on监听还没有建立,因此无法得到数据!

    so

    在页面1的beforeDestroy或者destroyed钩子函数中emit数据,在页面2的beforeCreate、created或者beforeMount钩子函数中建立$on监听事件,然后在页面2的mounted钩子函数中$on得到的数据赋值给页面2的变量中。

    这样就可以解决路由传值不触发问题(主要还是生命周期执行顺序的问题)

    暂时先更新这些,后续还会继续更新,希望会对你们有帮助,(还有就是关注走一波,哈哈)

  • 相关阅读:
    ESP8266 在线构建 固件
    NodeMCU 物联网开发快速上手
    vofaplus-plugins dtantdir
    欧拉角
    DebugView 简单使用
    Intrusion Detection Evaluation Dataset (CIC-IDS2017)
    ureport
    how to ignore server cert error in javamail
    465和587区别
    JavaMail 发送邮件阻塞问题解决——设置 smtp 超时时间
  • 原文地址:https://www.cnblogs.com/luozhixiang/p/9133386.html
Copyright © 2011-2022 走看看