面试题答案
一键面试实现思路
- 指令定义:使用
Vue.directive
定义自定义指令,指令名为dynamic-eval
。 - 钩子函数:使用
bind
和update
钩子函数。bind
钩子函数在指令第一次绑定到元素时调用,用于初始化操作。update
钩子函数在组件更新时调用,用于根据插值表达式的变化更新DOM。 - 获取和解析插值表达式:从指令的参数或绑定值中获取插值表达式,使用
new Function('vm', 'return ' + expression)
来解析并执行表达式,其中vm
为Vue实例,这样就可以访问Vue实例的数据。 - 与Vue响应式系统集成:通过Vue的依赖收集机制,在
update
钩子函数中重新解析和更新DOM,确保当插值表达式依赖的数据发生变化时,DOM能实时更新。
代码示例
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
</head>
<body>
<div id="app">
<div v-dynamic-eval="dynamicExpression"></div>
</div>
<script>
Vue.directive('dynamic-eval', {
bind: function (el, binding, vnode) {
this.update(el, binding, vnode);
},
update: function (el, binding, vnode) {
const expression = binding.value;
const fn = new Function('vm', 'return ' + expression);
const result = fn(vnode.context);
el.textContent = result;
}
});
new Vue({
el: '#app',
data: {
dynamicExpression: '1 + 2'
}
});
</script>
</body>
</html>
在上述代码中,定义了一个 dynamic-eval
自定义指令。在 bind
钩子函数中调用 update
钩子函数进行初始化。在 update
钩子函数中,获取绑定的值作为插值表达式,通过 new Function
解析并执行表达式,将结果更新到DOM的 textContent
中。Vue实例中的 dynamicExpression
数据变化时,会触发指令的 update
钩子函数,从而实时更新DOM。