面试题答案
一键面试实现思路
- 创建自定义指令:使用Vue.js(假设基于Vue,也可类比到其他框架)的
directive
API来创建一个自定义指令。 - 数据获取:在指令的
inserted
钩子函数(元素插入到DOM后触发)中,通过async/await
或Promise来处理异步数据获取,例如使用fetch
获取外部数据源数据。 - 动态渲染:获取到数据后,更新指令绑定元素的
innerHTML
或使用Vue的响应式数据更新机制来渲染数据。 - 数据变化监听:使用Vue的依赖追踪机制(例如计算属性或watch)来监听数据源数据变化,当数据变化时重新获取并更新渲染。
核心代码(基于Vue.js)
<template>
<div v-get-data="url"></div>
</template>
<script>
export default {
data() {
return {
url: 'https://example.com/api/data'
};
},
directives: {
getData: {
inserted: async function (el, binding) {
try {
const response = await fetch(binding.value);
const data = await response.json();
el.innerHTML = JSON.stringify(data);
} catch (error) {
el.innerHTML = `Error: ${error.message}`;
}
}
}
}
};
</script>
若要处理数据源数据变化自动更新,可如下修改:
<template>
<div v-get-data="dynamicUrl"></div>
</template>
<script>
export default {
data() {
return {
dynamicUrl: 'https://example.com/api/data'
};
},
watch: {
dynamicUrl: {
immediate: true,
async handler(newUrl) {
const el = this.$el.querySelector('[v-get-data]');
try {
const response = await fetch(newUrl);
const data = await response.json();
el.innerHTML = JSON.stringify(data);
} catch (error) {
el.innerHTML = `Error: ${error.message}`;
}
}
}
},
directives: {
getData: {
inserted: async function (el, binding) {
try {
const response = await fetch(binding.value);
const data = await response.json();
el.innerHTML = JSON.stringify(data);
} catch (error) {
el.innerHTML = `Error: ${error.message}`;
}
}
}
}
};
</script>