当前位置: 首页 > wzjs >正文

哪里能注册免费的网站武山县建设局网站

哪里能注册免费的网站,武山县建设局网站,电商设计师招聘,青岛房产备案价格查询官网在Vue应用开发中,处理响应式数据的变化是核心任务之一。Vue3提供了两种强大的工具:计算属性(Computed Properties)和侦听器(Watchers),它们以不同的方式响应数据变化,满足不同场景下的需求。本文将深入探讨这两种机制的工作原理、…

在Vue应用开发中,处理响应式数据的变化是核心任务之一。Vue3提供了两种强大的工具:计算属性(Computed Properties)侦听器(Watchers),它们以不同的方式响应数据变化,满足不同场景下的需求。本文将深入探讨这两种机制的工作原理、使用场景和最佳实践,帮助开发者写出更高效、更易维护的Vue代码。

一、计算属性(Computed Properties)

1.1 什么是计算属性

计算属性是基于响应式依赖进行缓存的派生值。它们只有在相关依赖发生改变时才会重新计算,否则会直接返回缓存值,这种机制可以显著提高性能。

1.2 基本用法

选项式API写法
export default {data() {return {firstName: '张',lastName: '三'}},computed: {fullName() {return this.firstName + ' ' + this.lastName}}
}

组合式API写法

import { ref, computed } from 'vue'export default {setup() {const firstName = ref('张')const lastName = ref('三')const fullName = computed(() => {return firstName.value + ' ' + lastName.value})return { firstName, lastName, fullName }}
}

1.3 计算属性的特点

  1. 缓存机制:只有依赖的响应式数据变化时才会重新计算

  2. 响应式:计算属性本身也是响应式的,可以在模板中使用

  3. 惰性求值:只有被使用时才会计算

1.4 可写的计算属性

计算属性默认是只读的,但可以通过提供getter和setter来创建可写计算属性:

// 组合式API
const firstName = ref('张')
const lastName = ref('三')const fullName = computed({get() {return firstName.value + ' ' + lastName.value},set(newValue) {[firstName.value, lastName.value] = newValue.split(' ')}
})// 选项式API
computed: {fullName: {get() {return this.firstName + ' ' + this.lastName},set(newValue) {const names = newValue.split(' ')this.firstName = names[0]this.lastName = names[1] || ''}}
}

1.5 计算属性 vs 方法

特性计算属性方法
缓存
调用方式作为属性访问(无括号)必须调用(带括号)
响应式依赖追踪自动需要手动处理
适用场景派生数据、复杂计算事件处理、非响应式操作
模板中的重新计算依赖变化时每次渲染都会执行

二、侦听器(Watchers)

2.1 什么是侦听器

侦听器允许我们观察数据的变化并在变化时执行异步操作或复杂逻辑。与计算属性不同,侦听器更适合执行有副作用的操作。

2.2 基本用法

选项式API写法
export default {data() {return {question: '',answer: '请提出问题...'}},watch: {// 简单侦听question(newVal, oldVal) {this.getAnswer()}},methods: {async getAnswer() {this.answer = '思考中...'try {const res = await fetchApi(this.question)this.answer = res.data.answer} catch {this.answer = '获取答案失败'}}}
}
组合式API写法
import { ref, watch } from 'vue'export default {setup() {const question = ref('')const answer = ref('请提出问题...')watch(question, async (newVal, oldVal) => {answer.value = '思考中...'try {const res = await fetchApi(newVal)answer.value = res.data.answer} catch {answer.value = '获取答案失败'}})return { question, answer }}
}

2.3 侦听器的配置选项
Vue3的侦听器可以接受一个配置对象作为第三个参数:

watch(source, callback, {immediate: true,   // 立即执行回调deep: true,        // 深度侦听flush: 'post',     // 回调时机(post|sync|pre)onTrack(e) {       // 调试依赖追踪debugger},onTrigger(e) {     // 调试依赖触发debugger}
})

2.4 不同类型的侦听源
侦听单个ref

const count = ref(0)
watch(count, (newVal, oldVal) => {console.log(`count变化: ${oldVal} -> ${newVal}`)
})
侦听getter函数
const state = reactive({ count: 0 })
watch(() => state.count,(newVal, oldVal) => {console.log(`count变化: ${oldVal} -> ${newVal}`)}
)

侦听多个源

const firstName = ref('')
const lastName = ref('')watch([firstName, lastName],([newFirst, newLast], [oldFirst, oldLast]) => {console.log(`名字变化: ${oldFirst} ${oldLast} -> ${newFirst} ${newLast}`)}
)

侦听响应式对象

const state = reactive({ user: { name: '张三',age: 30}
})// 需要深度侦听才能捕获嵌套属性的变化
watch(() => state.user,(newVal, oldVal) => {console.log('用户信息变化', newVal)},{ deep: true }
)// 或者直接侦听特定嵌套属性
watch(() => state.user.name,(newName, oldName) => {console.log(`用户名变化: ${oldName} -> ${newName}`)}
)

2.5 watchEffect - 自动依赖追踪的侦听器

watchEffect会自动追踪其回调函数中的响应式依赖,并在依赖变化时重新执行:

import { ref, watchEffect } from 'vue'const count = ref(0)const stop = watchEffect((onInvalidate) => {console.log(`count的值是: ${count.value}`)// 清除副作用onInvalidate(() => {console.log('清理前一次effect的副作用')})
})// 停止侦听
stop()

watchEffect的特点:

  1. 立即执行:创建时会立即运行一次

  2. 自动依赖收集:不需要显式指定侦听源

  3. 更简洁:适合简单的副作用场景

三、计算属性与侦听器的对比与选择

3.1 核心区别

特性计算属性侦听器
目的派生新数据响应数据变化执行副作用
返回值必须返回一个值无返回值
缓存有缓存无缓存
异步操作不支持支持
执行时机同步可配置(pre/post/sync)
代码组织声明式命令式
适用场景模板中使用的派生数据数据变化时需要执行的操作(如API调用、DOM操作)

3.2 如何选择

使用计算属性当:

  • 需要从现有数据派生新数据

  • 结果需要在模板中渲染

  • 需要缓存优化性能

  • 计算逻辑是纯函数(无副作用)

使用侦听器当:

  • 需要在数据变化时执行异步操作

  • 需要执行有副作用的操作(如API调用、DOM操作)

  • 需要响应数据变化执行复杂逻辑

  • 需要更细粒度的控制(如防抖、取消请求等)

3.3 性能考量

  1. 计算属性的优势:缓存机制避免不必要的计算,适合频繁访问的派生数据

  2. 侦听器的开销:深度侦听(deep: true)会带来额外性能开销,应谨慎使用

  3. 防抖优化:对于高频变化的侦听源,可以结合防抖函数优化性能

import { debounce } from 'lodash-es'watch(query,debounce((newQuery) => {search(newQuery)}, 500)
)

四、高级技巧与最佳实践

4.1 计算属性的组合

计算属性可以基于其他计算属性构建:
 

const discount = ref(0.9)
const price = ref(100)
const discountedPrice = computed(() => price.value * discount.value)
const finalPrice = computed(() => {return discountedPrice.value > 50 ? discountedPrice.value - 10 : discountedPrice.value
})

4.2 侦听器的清理工作

对于执行异步操作的侦听器,应该清理未完成的异步任务:
 

watch(id, async (newId, oldId, onCleanup) => {let cancelled = falseonCleanup(() => cancelled = true)const data = await fetchData(newId)if (!cancelled) {// 处理数据}
})

4.3 使用watchPostEffectwatchSyncEffect

Vue3提供了两种特殊的侦听器变体:

import { watchPostEffect, watchSyncEffect } from 'vue'// DOM更新后执行(等同于flush: 'post')
watchPostEffect(() => {// 访问更新后的DOM
})// 同步执行(等同于flush: 'sync')
watchSyncEffect(() => {// 同步响应变化
})

4.4 避免无限循环

不当的使用计算属性和侦听器可能导致无限循环:
 

// 错误示例 - 计算属性中修改依赖
const count = ref(0)
const doubleCount = computed(() => {count.value++  // 这将导致无限循环return count.value * 2
})// 错误示例 - 侦听器中修改侦听源
watch(count, (newVal) => {count.value = newVal + 1  // 这将导致无限循环
})

五、实战案例

5.1 表单验证
 

// 使用计算属性
const form = reactive({username: '',password: '',confirmPassword: ''
})const isUsernameValid = computed(() => {return form.username.length >= 6
})const isPasswordValid = computed(() => {return form.password.length >= 8
})const doPasswordsMatch = computed(() => {return form.password === form.confirmPassword
})const isFormValid = computed(() => {return isUsernameValid.value && isPasswordValid.value && doPasswordsMatch.value
})

5.2 搜索功能
 

// 使用侦听器实现带防抖的搜索
import { ref, watch } from 'vue'
import { debounce } from 'lodash-es'export default {setup() {const searchQuery = ref('')const searchResults = ref([])const isLoading = ref(false)const search = debounce(async (query) => {if (!query.trim()) {searchResults.value = []return}isLoading.value = truetry {searchResults.value = await api.search(query)} catch (error) {console.error('搜索失败:', error)} finally {isLoading.value = false}}, 500)watch(searchQuery, search)return { searchQuery, searchResults, isLoading }}
}

5.3 路由参数变化监听
 

import { watch } from 'vue'
import { useRoute } from 'vue-router'export default {setup() {const route = useRoute()const productId = ref(null)const productData = ref(null)watch(() => route.params.id,async (newId) => {productId.value = newIdif (newId) {productData.value = await fetchProduct(newId)}},{ immediate: true }  // 立即执行一次)return { productId, productData }}
}

六、总结

Vue3的计算属性和侦听器是处理响应式数据变化的强大工具,它们各有特点,适用于不同的场景:

  1. 计算属性

    • 适合派生数据、模板渲染

    • 自动缓存、高效

    • 声明式、易于理解

  2. 侦听器

    • 适合执行副作用

    • 灵活控制响应时机

    • 支持异步操作

最佳实践建议:

  • 优先使用计算属性处理派生数据

  • 使用侦听器处理有副作用的操作

  • 对于高频变化的数据源,考虑使用防抖优化

  • 注意清理异步操作的副作用

  • 避免在计算属性中修改依赖或在侦听器中修改侦听源

希望这篇博客对你有所帮助,如果你有任何问题或改进建议,欢迎在评论区留言讨论!


文章转载自:

http://9TgTdfSq.ywpwq.cn
http://FLcYxOB2.ywpwq.cn
http://Q41yry5s.ywpwq.cn
http://5pA9FZIv.ywpwq.cn
http://6EMkcbIQ.ywpwq.cn
http://CcGa5dT1.ywpwq.cn
http://JGWnUyUd.ywpwq.cn
http://d59wJKFc.ywpwq.cn
http://RU3AWgGN.ywpwq.cn
http://c7jh4pt9.ywpwq.cn
http://5VE0MoL6.ywpwq.cn
http://oI37fQcl.ywpwq.cn
http://EcPY3zdx.ywpwq.cn
http://LGV1Fl5p.ywpwq.cn
http://hgcxoS3z.ywpwq.cn
http://J1ShvWCc.ywpwq.cn
http://UBleu5c2.ywpwq.cn
http://22Jxav5L.ywpwq.cn
http://7HifrGnN.ywpwq.cn
http://c6hq9Unj.ywpwq.cn
http://QqBTfm1w.ywpwq.cn
http://7yl06jfn.ywpwq.cn
http://Um9dBt70.ywpwq.cn
http://Zjw0wOwq.ywpwq.cn
http://WWpxqhZO.ywpwq.cn
http://zA1gGsPF.ywpwq.cn
http://FErk7Wt1.ywpwq.cn
http://s8qLsJPo.ywpwq.cn
http://HQFEuG3c.ywpwq.cn
http://uj35ucv5.ywpwq.cn
http://www.dtcms.com/wzjs/622360.html

相关文章:

  • 龙岗网站建设推广给我一个可以看片的
  • 如何查网站处罚过管理系统和网站哪个好做
  • 浏阳网站定制网页设计个人总结800字
  • 网站建设合同甲乙双方怎么确定施工企业安全生产管理体系案例
  • 空间购买后打不开网站快速搭建外贸网站
  • 电子商务网站建设策划案网站会员体系
  • 上海个人医疗网站备案淘宝建设网站的
  • 怎么做购物网站的购物车wordpress 设置导航栏
  • 做红酒网站个人网站设计模板中文
  • 网站推广宣传微信公司
  • 建立网站的三种方式濮阳创建网站公司
  • 手机网站收录搜索网页
  • 嘉兴南湖区优秀营销型网站建设免费3d动画制作软件
  • 网站转移后后台无法登陆wordpress企业内网主题
  • 网站微场景代码泰安房产网站建设
  • 南通经济开发区城乡建设局网站网站空间怎么使用
  • 网站在哪里实名认证wordpress 搬迁插件
  • php5 mysql网站开发实例精讲WordPress全球用户量2019
  • 天津重型网站建设推荐网站设计公司 知道万维科技
  • 株洲营销型网站建设代理平台登录
  • 富源县建设局的网站是什么做的比较好旅游网站
  • 外贸网站使用攻略公司网站开发费分录是
  • 服饰品牌网站建设做民宿推广都有哪些网站
  • 做门头上那个网站申报企业工商信息查询系统官网
  • 网站建设公司市场策划方案济南工程建设验收公示网
  • 免费的视频网站如何赚钱企业it外包服务公司
  • 移动端网站建设的请示朋友圈海报用什么网站做的
  • 怎样做网站标题的图标在线识别图片来源
  • 邢台做网站口碑好延安网站建设费用
  • 阿里云1m宽带做网站卡吗平台网站如何优化