vue实现响应式界面
Vue实现响应式界面的方法
数据绑定
Vue通过数据绑定实现响应式界面。在Vue实例中,data对象的所有属性都会被转换为getter/setter,使得数据变化时视图自动更新。
<template>
<div>{{ message }}</div>
</template>
<script>
export default {
data() {
return {
message: 'Hello Vue!'
}
}
}
</script>
计算属性
计算属性基于依赖的响应式数据进行缓存,只在相关依赖发生变化时重新计算。
<template>
<div>{{ reversedMessage }}</div>
</template>
<script>
export default {
data() {
return {
message: 'Hello'
}
},
computed: {
reversedMessage() {
return this.message.split('').reverse().join('')
}
}
}
</script>
侦听器
使用watch选项可以对数据变化执行异步或开销较大的操作。
<script>
export default {
data() {
return {
question: '',
answer: 'Waiting for you to ask...'
}
},
watch: {
question(newVal) {
this.getAnswer(newVal)
}
},
methods: {
getAnswer(question) {
// 模拟异步操作
setTimeout(() => {
this.answer = 'Answer to: ' + question
}, 500)
}
}
}
</script>
条件渲染
v-if和v-show指令可以根据条件显示或隐藏元素。
<template>
<div v-if="isVisible">显示内容</div>
<div v-show="isActive">活动内容</div>
</template>
列表渲染
v-for指令可以基于数组渲染列表,并保持响应式更新。
<template>
<ul>
<li v-for="(item, index) in items" :key="item.id">
{{ index }} - {{ item.text }}
</li>
</ul>
</template>
表单输入绑定
v-model指令实现表单输入和应用状态之间的双向绑定。
<template>
<input v-model="message" placeholder="编辑我">
<p>输入的消息是: {{ message }}</p>
</template>
组件系统
Vue组件是自包含的UI单元,通过props和events实现父子组件通信。
// 子组件
<template>
<button @click="increment">{{ count }}</button>
</template>
<script>
export default {
props: ['initialCount'],
data() {
return {
count: this.initialCount
}
},
methods: {
increment() {
this.count++
this.$emit('increment', this.count)
}
}
}
</script>
// 父组件
<template>
<counter :initial-count="0" @increment="handleIncrement"/>
</template>
响应式原理
Vue使用Object.defineProperty或Proxy实现响应式。对于数组,Vue重写了数组的变异方法(push, pop等)来触发视图更新。
// 对象响应式
const data = { foo: 'bar' }
Object.defineProperty(data, 'foo', {
get() {
console.log('get foo')
return val
},
set(newVal) {
console.log('set foo')
val = newVal
}
})
// 数组响应式
const arrayProto = Array.prototype
const arrayMethods = Object.create(arrayProto)
const methodsToPatch = ['push', 'pop', 'shift', 'unshift', 'splice', 'sort', 'reverse']
methodsToPatch.forEach(function(method) {
const original = arrayProto[method]
arrayMethods[method] = function(...args) {
const result = original.apply(this, args)
console.log('array method called')
return result
}
})
组合式API
Vue 3的组合式API提供更灵活的代码组织方式,特别是对于复杂逻辑。
<template>
<div>
<p>{{ count }}</p>
<button @click="increment">+</button>
</div>
</template>
<script>
import { ref, onMounted } from 'vue'
export default {
setup() {
const count = ref(0)
function increment() {
count.value++
}
onMounted(() => {
console.log('component mounted')
})
return {
count,
increment
}
}
}
</script>






