如何实现双向绑定
面试官通常会问你一些Vue的实现原理。比如:如何实现双向绑定。可能大部分会说v-model。是的没错,这只是语法糖,但是然后呢?其实原理很简单:
Object.defineProperty数据劫持
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<input type="text" id="txt">
<span id="sp"></span>
<script>
var txt = document.getElementById('txt');
var sp = document.getElementById('sp');
var obj = {}
Object.defineProperty(obj, 'txt', {
Configurable: true,
Enumerable: true,
set: function(value) {
txt.value = value;
sp.innerText = value;
}
});
txt.addEventListener('input', function(e) {
obj.txt = e.target.value;
});
</script>
</body>
</html>
类似react实现
input 子组件
小知识: input事件当输入框改变会处罚change方法。
<template>
<div>
<input type="text" :value="value" @input="change">
</div>
</template>
<script>
export default {
props: ['value'],
methods: {
change(e) {
this.$emit('input', e.target.value)
}
}
};
</script>
父组件
<Iinput :value="value" @input="value = arguments[0]"></Iinput>{{value}}