引言:在上一章节中,我们详细介绍了页面路由与导航的相关知识点。今天我们讨论的是数据绑定与事件处理,深入研究数据是如何流动、用户交互如何响应的问题。我们平时用的app比如说输入框中打字,下方实时显示输入内容。这个看似简单的交互背后,隐藏着前端框架的核心思想——数据驱动视图。
对比:传统DOM操作 vs 数据驱动
在传统开发中,我们需要:
// 传统方式
const input = document.getElementById('myInput');
const display = document.getElementById('display');
input.addEventListener('input', function(e) {
// 手动更新DOM
display.textContent = e.target.value;
});
而在 uni-app 中:
<template>
<input v-model="message">
<div>{
{ message }}</div>
</template>
<script>
export default {
data() {
return {
// 只需关注数据,DOM自动更新
message: ''
}
}
}
</script>
这种模式的转变,正是现代前端框架的核心突破。下面让我们深入研究其实现原理。
一、响应式数据绑定
1.1 数据劫持
Vue 2.x 使用 Object.defineProperty 定义对象属性实现数据响应式,让我们通过一段代码来加深理解这个机制:
// 响应式原理
function defineReactive(obj, key, val) {
// 每个属性都有自己的依赖收集器
const dep = new Dep()
Object.defineProperty(obj, key, {
enumerable: true,
configurable: true,
get: function reactiveGetter() {
console.log(`读取属性 ${
key}: ${
val}`)
// 依赖收集:记录当前谁在读取这个属性
dep.depend()
return val
},
set: function reactiveSetter(newVal) {
console.log(`设置属性 ${
key}: ${
newVal}`)
if (newVal === val) return
val = newVal
// 通知更新:值改变时通知所有依赖者
dep.notify()
}
})
}
// 测试
const data = {
}
defineReactive(data, 'message', 'Hello')
data.message = 'World' // 控制台输出:设置属性 message: World
console.log(data.message) // 控制台输出:读取属性 message: World
1.2 完整的响应式系统架构
原理说明
- 当对响应式数据进行赋值操作时,会触发通过Object.defineProperty定义的setter方法。
- setter首先比较新旧值是否相同,如果相同则直接返回,避免不必要的更新。
- 如果值发生变化,则更新数据,并通过依赖收集器(Dep)通知所有观察者(Watcher)进行更新。
- 这个过程是同步的,但实际的DOM更新是异步的,通过队列进行批量处理以提高性能。
1.3 v-model 的双向绑定原理
v-model 不是魔法,而是语法糖:
<!-- 这行代码: -->
<input v-model="username">
<!-- 等价于: -->
<input
:value="username"
@input="username = $event.target.value"
>
原理分解:
1.4 不同表单元素的双向绑定
文本输入框
<template>
<view class="example">
<text class="title">文本输入框绑定</text>
<input
type="text"
v-model="textValue"
placeholder="请输入文本"
class="input"
/>
<text class="display">实时显示: {
{ textValue }}</text>
<!-- 原理展示 -->
<view class="principle">
<text

最低0.47元/天 解锁文章
2234

被折叠的 条评论
为什么被折叠?



