工作中常用的Vue知识点(一)

避免click事件的多次点击

有两种方式:①通过自定义指令;②通过mixin混入preventReClick方法;
①自定义指令:
// 新建preventReClick.js文件
import Vue from 'vue'
const preventReClick = Vue.directive('preventReClick', {
  inserted: function (el, binding) {
    el.addEventListener('click', () => {
      if (!el.disabled) {
        el.disabled = true
        setTimeout(() => {
          el.disabled = false
        }, binding.value || 3000) // 传入绑定值就使用,默认3000毫秒内不可重复触发
      }
    })
  }
})
export { preventReClick }

// main.js文件下引用
import preventReClick from '@/.../preventReClick.js'

// 使用方式

// 或


// 是不是很简单,但是有个问题,这种方式只适用于按钮标签元素

②mixin混入preventReClick方法:

// 新建mixin.js文件
const mixin = {
 // provide这种也可以,适用于全局引入,组件就直接使用:inject: ['preventReClick'],
  // provide() {
    // return {
      // preventReClick: this.preventReClick,
    // };
  // },
  data() {
    return {
      isClick: true,
    };
  },
  methods: {
    preventReClick(fn) { // 避免多次点击
      if (!this.isClick) return;
      this.isClick = false;
      fn();
      setTimeout(() => {
        this.isClick = true;
      }, 1000);
    },
  },
};
export default mixin;

// 使用方式
import mixin from './mixin'; // 引入路径
export default {
    mixins: [mixin],
}

// 原本写法:

// 更改后写法:

$on('hook:')监听移除事件

$on('hook:')方法,你可以仅使用一种生命周期方法(而不是两种)来定义/删除事件。

原本写法:
mounted () {
    window.addEventListener('resize', this.resizeHandler);
},
beforeDestroy () {
    window.removeEventListener('resize', this.resizeHandler);
}
 
优化写法:
mounted () {
  window.addEventListener('resize', this.resizeHandler);
  this.$on("hook:beforeDestroy", () => {
    window.removeEventListener('resize', this.resizeHandler);
  })
}

使用immediate:true,在初始化时触发watcher

如果你需要 wather 在实例初始化后立即运行,那么你所要做的就是将 wather 转换为具有 handler(newVal, oldVal) 函数以及即时 immediate: true 的对象。

watch: {
    title: {
      immediate: true,
      handler(newTitle, oldTitle) {
        console.log("Title changed from " + oldTitle + " to " + newTitle)
      }
    }
}

动态指令参数

假设你有一个按钮组件,并且在某些情况下想监听单击事件,而在其他情况下想监听双击事件。这就是这些指令派上用场的地方:



重用相同路由的组件

Vue出于性能原因,默认情况下共享组件将不会重新渲染,如果你尝试在使用相同组件的路由之间进行切换,则不会发生任何变化。

const routes = [
  {
    path: "/a",
    component: MyComponent
  },
  {
    path: "/b",
    component: MyComponent
  },
];

如果仍然希望重新渲染这些组件,则可以通过在 router-view 组件中提供 :key 属性来实现。


你可能感兴趣的:(工作中常用的Vue知识点(一))