推荐答案
-- -------------------- ---- ------- ----- --------- - -------------------- - ------------- - -------- ---------- - ------------- ---------------------------- -------------------------- - ---------------- - --- ---- --- -- ----- - --------------------------- ---- - ----- - ------ ---------- -- ------------- - --------- - --------- -------------------- ---------- - --- - - ------------ - ----- ------- - --------------------------- ----- -------- - ----------------- --- ---- - - -- - - ---------------- ---- - ----- ----- - ------------ -- ------------------------------- - ----- --- - ------------------------------ ----------- - ---------------- ------------------------------- -- -- - --------- - ------------ --- - - - --------------- ------ - ----- -------- - ------------------------------------------------ ------------------------ -- - ------------- - ------ --- - - -- ---- ----- --- - --- ----------- --- ------- ----- - -------- ------- ----- - ---
本题详细解读
1. 实现思路
双向数据绑定的核心是通过 Object.defineProperty
来劫持数据的 get
和 set
操作。当数据发生变化时,自动更新视图;当视图发生变化时,自动更新数据。
2. 代码解析
_proxyData
方法:遍历data
对象中的每个属性,使用Object.defineProperty
将其代理到SimpleVue
实例上。这样,当访问或修改这些属性时,会触发get
和set
方法。_compile
方法:遍历指定元素的所有子元素,查找带有v-model
属性的元素。将这些元素的值初始化为data
中对应的值,并为其添加input
事件监听器。当输入框内容发生变化时,更新对应的数据。_updateDOM
方法:当数据发生变化时,更新所有绑定该数据的 DOM 元素的值。
3. 使用示例
在 HTML 中,可以通过以下方式使用:
<div id="app"> <input type="text" v-model="message"> <p>{{ message }}</p> </div>
当输入框内容发生变化时,message
数据会自动更新,并且页面中所有绑定 message
的地方都会同步更新。
4. 注意事项
- 该实现是一个简化版本,仅支持
v-model
指令,并且只处理了文本输入框的情况。 - 实际应用中,Vue.js 等框架会处理更多的指令和复杂的场景,如列表渲染、条件渲染等。