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

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'));
import { onMounted } from 'vue';
export default {
mounted() {}, // options api
setup() {
onMounted(() => {}); // composition api
}
}
updated 的方法即会调用<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>

把 watchEffect 中的 flush 设置为 post 时,watch在 beforeUpdate 之后执行
watchEffect(() => {
console.log('watchEffect count value:', count.value);
}, {
flush: 'post'
});

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>

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>

<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>
import { nextTick } from 'vue'
function increment() {
state.count++
nextTick(() => {
// 访问更新后的 DOM
})
}