生命周期

inserted

被插入父节点

bind

第一次被绑定

  1. created() {
  2. console.log('created')
  3. },
  4. mounted() {
  5. console.log('mounted')
  6. },
  7. directives:{
  8. focus:{
  9. inserted(el){
  10. console.log('inserted-el',el)
  11. },
  12. bind(el) {
  13. console.log('bind-el',el)
  14. },
  15. update(el) {
  16. console.log('directives-update',el)
  17. }
  18. }
  19. },
  20. updated() {
  21. console.log('updated')
  22. }


钩子函数的执行顺序如下:
bind ==> inserted ==> updated ==> componentUpdated ==> bind

官网描述:
https://cn.vuejs.org/guide/reusability/custom-directives.html#directive-hooks

安装使用

初始化

  1. import { createApp } from "vue";
  2. // directives
  3. import copy from "@/directives/copy";
  4. import numberOnly from "@/directives/numberOnly";
  5. .....
  6. var app = createApp(App);
  7. app
  8. .use(copy)
  9. .use(numberOnly)
  10. .use(globalComponents)
  11. .mount("#app");

复制粘贴

  1. export default {
  2. install: app => {
  3. app.directive("copy", {
  4. mounted(el, { value }) {
  5. if (typeof value === "object") {
  6. el.$value = value.text;
  7. } else {
  8. el.$value = value;
  9. }
  10. el.handler = () => {
  11. if (!el.$value) {
  12. // 值为空的时候,给出提示。可根据项目UI仔细设计
  13. if (typeof value === "object" && typeof value.err === "function") {
  14. value.err();
  15. }
  16. return;
  17. }
  18. // 动态创建 textarea 标签
  19. const textarea = document.createElement("textarea");
  20. // 将该 textarea 设为 readonly 防止 iOS 下自动唤起键盘,同时将 textarea 移出可视区域
  21. textarea.readOnly = "readonly";
  22. textarea.style.position = "absolute";
  23. textarea.style.left = "-9999px";
  24. // 将要 copy 的值赋给 textarea 标签的 value 属性
  25. textarea.value = el.$value;
  26. // 将 textarea 插入到 body 中
  27. document.body.appendChild(textarea);
  28. // 选中值并复制
  29. textarea.select();
  30. const result = document.execCommand("Copy");
  31. if (
  32. result &&
  33. typeof value === "object" &&
  34. typeof value.success === "function"
  35. ) {
  36. value.success();
  37. }
  38. document.body.removeChild(textarea);
  39. };
  40. // 绑定点击事件,就是所谓的一键 copy 啦
  41. el.addEventListener("click", el.handler);
  42. },
  43. // 当传进来的值更新的时候触发
  44. updated(el, { value }) {
  45. if (typeof value === "object") {
  46. el.$value = value.text;
  47. } else {
  48. el.$value = value;
  49. }
  50. },
  51. // 指令与元素解绑的时候,移除事件绑定
  52. unmounted(el) {
  53. el.removeEventListener("click", el.handler);
  54. }
  55. });
  56. }
  57. };

指定number类型输入

  1. export default {
  2. install: app => {
  3. app.directive("numberOnly", {
  4. updated(el) {
  5. el.value = el.value.replace(/[^\d.]/g, ""); //清除非数字.
  6. el.value = el.value
  7. .replace(".", "$#$")
  8. .replace(/\./g, "")
  9. .replace("$#$", "."); //只保留首个.
  10. if (el.value.length > 1 && el.value[0] === "0" && el.value[1] !== ".") {
  11. el.value = el.value.replaceAll("0", "");
  12. }
  13. }
  14. });
  15. }
  16. };