vue3+ts 自定义指令mounted 修改dom的padding 执行了 但padding一开始没有修改,第二次进入才修改
时间: 2023-11-09 20:07:44 浏览: 100
在 Vue3 中,自定义指令的钩子函数与 Vue2 有所不同,其中 `bind` 钩子已经被废弃,取而代之的是 `beforeMount`、`mounted`、`beforeUpdate`、`updated`、`beforeUnmount`、`unmounted` 等钩子函数,它们的执行时机也有所不同。
如果你在 `mounted` 钩子中修改 DOM 样式,那么样式修改会在组件挂载到页面后才生效。如果你希望样式修改能够在页面初始化时就生效,可以考虑在 `beforeMount` 钩子中执行修改操作。例如:
```typescript
import { DirectiveBinding } from 'vue';
// 定义自定义指令
const myDirective = {
beforeMount(el: HTMLElement, binding: DirectiveBinding) {
// 修改 DOM 样式
el.style.padding = binding.value;
}
};
// 在组件中使用自定义指令
<template>
<div v-my-directive="padding">Hello World</div>
</template>
<script lang="ts">
import { defineComponent } from 'vue';
export default defineComponent({
data() {
return {
padding: '10px'
};
},
directives: {
myDirective
}
});
</script>
```
如果在 `beforeMount` 钩子中修改样式仍然无法立即生效,可以考虑使用 `this.$nextTick()` 方法,在下一个 DOM 更新周期中再进行样式修改,例如:
```typescript
import { DirectiveBinding } from 'vue';
// 定义自定义指令
const myDirective = {
beforeMount(el: HTMLElement, binding: DirectiveBinding) {
this.$nextTick(() => {
el.style.padding = binding.value;
});
}
};
// 在组件中使用自定义指令
<template>
<div v-my-directive="padding">Hello World</div>
</template>
<script lang="ts">
import { defineComponent } from 'vue';
export default defineComponent({
data() {
return {
padding: '10px'
};
},
directives: {
myDirective
}
});
</script>
```
在这个例子中,我们在 `beforeMount` 钩子中使用 `this.$nextTick()` 方法,将样式修改操作放到下一个 DOM 更新周期中执行,确保 DOM 已经被渲染。
阅读全文