导航


HTML

CSS

JavaScript

浏览器 & 网络

版本管理

框架

构建工具

TypeScript

性能优化

软实力

算法

UI、组件库

Node

业务技能

针对性攻坚

AI


getCurrentInstance 获取当前组件实例

<template>
</template>
<script>
import { getCurrentInstance } from 'vue';
export default {
  name: 'App',
  setup() {
    const instance = getCurrentInstance();
    console.log(instance);
  }
}
</script>

Untitled

setup 读取值

import { getCurrentInstance, ComponentInternalInstance } from 'vue';
 
const { appContext } = <ComponentInternalInstance>getCurrentInstance();
 
console.log(appContext.config.globalProperties.$env);
 
// 推荐第二种方式
 
import {ref,reactive,getCurrentInstance} from 'vue';
const app = getCurrentInstance();
console.log(app?.proxy?.$filters.format('js'));

options api 和 composition api 区别

import { onMounted } from 'vue';
export default {
  mounted() {}, // options api
  setup() {
    onMounted(() => {}); // composition api
  }
}

beforeCreate 和 created 由 setup 代替

onBeforeMount、onMounted 和 onBeforeUpdate、onUpdated

<template>
  <div>{{ count }}</div>
</template>
<script>
import {
  getCurrentInstance,
  ref,
  onBeforeMount,
  onMounted,
  onBeforeUpdate,
  onUpdated,
  watchEffect
  } from 'vue';
export default {
  name: 'App',
  setup() {
    const count = ref(0);
    setTimeout(() => {
      count.value = 1;
    }, 1000);
    watchEffect(() => {
      console.log('watchEffect count value:', count.value);
    });
    onBeforeMount(() => console.log('onBeforeMount'));
    onMounted(() => console.log('onMounted'));
    onBeforeUpdate(() => console.log('onBeforeUpdate'));
    onUpdated(() => console.log('onUpdated'));
    return {
      count
    }
  }
}
</script>

Untitled

把 watchEffect 中的 flush 设置为 post 时,watch在 beforeUpdate 之后执行

watchEffect(() => {
  console.log('watchEffect count value:', count.value);
}, {
  flush: 'post'
});

Untitled

onBeforeUnmount 和 onUnmounted

App.vue

<template>
  <div>
    <Item
      v-for="item of data"
      :key="item.id"
      :item="item"
      @remove="remove"
    />
  </div>
</template>
<script>
import { ref } from 'vue';
import Item from '@/components/Item.vue';
export default {
  name: 'App',
  components: {
    Item
  },
  setup() {
    const data = ref([
      {
        id: 1,
        title: 'Lance'
      },
      {
        id: 2,
        title: 'GC'
      }
    ]);
    const remove = (id) => {
      data.value = data.value.filter(v => v.id !== id);
    }
    return {
      data,
      remove
    }
  }
}
</script>

Item.vue

<template>
  <li>
    <span>{{ item.title }}</span>
    <button @click="remove(item.id)">remove</button>
  </li>
</template>
<script>
import { onBeforeUnmount, onUnmounted } from '@vue/runtime-core';
export default {
  name: 'Item',
  props: {
    item: Object
  },
  emits: ['remove'],
  setup(props, ctx) {
    const remove = (id) => {
      ctx.emit('remove', id);
    }

    onBeforeUnmount(() => {
      console.log(`'onBeforeUnmount': ID为${props.item.id}的项「即将」被删除`);
    });
    onUnmounted(() => {
      console.log(`'onUnmounted': ID为${props.item.id}的项「正在」被删除`);
    });

     return {
      remove
    }
  }
}
</script>

Untitled

onErrorCaptured

Item.vue 注释掉 props item 的声明

<template>
  <li>
    <span>{{ item.title }}</span>
    <button @click="remove(item.id)">remove</button>
  </li>
</template>
<script>
import { onBeforeUnmount, onUnmounted } from '@vue/runtime-core';
export default {
  name: 'Item',
  // props: {
  //   item: Object
  // },
  emits: ['remove'],
  setup(props, ctx) {
    const remove = (id) => {
      ctx.emit('remove', id);
    }

    onBeforeUnmount(() => {
      console.log(`'onBeforeUnmount': ID为${props.item.id}的项「即将」被删除`);
    });
    onUnmounted(() => {
      console.log(`'onUnmounted': ID为${props.item.id}的项「正在」被删除`);
    });

     return {
      remove
    }
  }
}
</script>

App.vue 监听 onErrorCaptured

<template>
  <div>
    <Item
      v-for="item of data"
      :key="item.id"
      :item="item"
      @remove="remove"
    />
  </div>
</template>
<script>
import { onErrorCaptured, ref } from 'vue';
import Item from '@/components/Item.vue';
export default {
  name: 'App',
  components: {
    Item
  },
  setup() {
    const data = ref([
      {
        id: 1,
        title: 'Lance'
      },
      {
        id: 2,
        title: 'GC'
      }
    ]);
    const remove = (id) => {
      data.value = data.value.filter(v => v.id !== id);
    }
    onErrorCaptured((e) => {
      console.log(e);
    });
    return {
      data,
      remove
    }
  }
}
</script>

Untitled

onRenderTracked 和 onRenderTriggered

<template>
  <div>
    <Item
      v-for="item of data"
      :key="item.id"
      :item="item"
      @remove="remove"
    />
  </div>
</template>
<script>
import { onErrorCaptured, onRenderTracked, onRenderTriggered, ref } from 'vue';
import Item from '@/components/Item.vue';
export default {
  name: 'App',
  components: {
    Item
  },
  setup() {
    const data = ref([
      {
        id: 1,
        title: 'Lance'
      },
      {
        id: 2,
        title: 'GC'
      }
    ]);
    const remove = (id) => {
      data.value = data.value.filter(v => v.id !== id);
    }
    onRenderTracked((e) => {
      debugger;
    });
    onRenderTriggered((e) => {
      debugger;
    });
    return {
      data,
      remove
    }
  }
}
</script>

DOM 更新时机

import { nextTick } from 'vue'

function increment() {
  state.count++
  nextTick(() => {
    // 访问更新后的 DOM
  })
}