【Vue3从零开始-实战】S17:使用watchEffect方法进行代码拆分

简介: 【Vue3从零开始-实战】S17:使用watchEffect方法进行代码拆分

@@DVBVTGC2D7ROIYF4YK_@O.png


前言


实战已经开始了!前面两篇文章中我们把详情页的样式和逻辑都写的差不多了,但是在写逻辑的部分,还是把所有的逻辑代码都写在了setup函数中。本篇文章主要是和大家一起使用之前学过的watchEffect方法对逻辑部分的代码进行拆分。


代码拆分


🌀 看到下图中的代码逻辑,其实是分为四个模块:静态数据、定义数据、获取列表数据、点击tab事件。再加上底部的执行方法和结构数据,代码量虽然不算大,但是阅读起来比较麻烦,代码不统一,每次看一段逻辑的时候,可能还需要上下翻动去找。所以就需要拆分代码逻辑,让setup函数更加简洁一点,也让代码更加统一。


L)UZ%UKT_`4LS~7O63HJA%K.png


静态数据


🌀 对于静态数据,其实可以不用放到setup函数中,直接放在外部也是可以的。


<script>
// import部分
const categories = [
  { name: '全部商品', tab: 'all' },
  { name: '秒杀', tab: 'seckill' },
  { name: '新鲜水果', tab: 'fruit' }
]
export default {
    setup(){
        // 逻辑部分
        return { categories }
    }
}
复制代码


因为categories属于一个常量,也是固定不会变化的,所以直接放在外部也是可以访问的。在setup函数中也是需要return给外部的。


tab栏相关逻辑


🌀 tab栏部分的逻辑根据上面的完整代码截图可以看出,主要就是定义了currentTab的值,并且在点击tab的时候将点击的数据值赋给currenttab。


😲 在点击事件里面其实还调用了获取数据的方法,但是这个获取数据和tab的逻辑并没有直接关系,可以放到获取数据的拆分代码中去。


👉 所以我们拆分出来的tab栏相关逻辑就是定义currentTab和点击tab栏时赋值而已。


// Tab 相关逻辑部分
const useTabEffect = () => {
  const currentTab = ref(categories[0].tab)
  const handleTabClick = (tab) => {
    currentTab.value = tab
  }
  return { currentTab, handleTabClick }
}
复制代码


👉 在setup函数中还要结构出useTabEffect函数


setup(){
    const { currentTab, handleTabClick } = useTabEffect()
    return { categories, currentTab, handleTabClick }
}
复制代码


👉 点击tab的时候调用的方法也得修改一下


@click="handleCategoryClick(item.tab)"
            ⬇️修改为⬇️
@click="handleTabClick(item.tab)"
复制代码

watchEffect方法拆分出获取列表数据逻辑


🌀 在获取列表的逻辑中,根据上面代码图示可以看出,首先是定义了一个数组用来接收获取的数据。


👉 拆分出定义数据的部分


// 获取数据相关逻辑
const useCurrentListEffect = () => {
  const content = reactive({ list: [] })
}
复制代码


🌀 在获取数据调用接口的时候,是根据tab的值改变来重新执行的,在我们以前学过的CompositionAPI篇章中有了解过一个侦听器函数:watchEffect


watchEffect:当页面首次加载时,以及它监听的数据发生变化时就会执行的函数。


👉 了解了原理,我们就可以在watchEffect函数中调用获取数据的方法


// 先引入watchEffect
import { watchEffect } from 'vue'
复制代码
const useCurrentListEffect = () => {
  const content = reactive({ list: [] })
  const getContentData = async (tab) => {
    const result = await get('/api/shop/1/products', { tab })
    if (result.data.code === 0 && result.data.data.length) {
      content.list = result.data.data
    }
  }
  // watchEffect函数监听获取数据方法
  watchEffect(() => {
    getContentData()
  })
}
复制代码


😲 此时watchEffect函数会分析getContentData方法中依赖的数据,如果依赖的数据发生变化或者首屏加载时,那么watchEffect侦听器函数就会重新执行。


🤔 知道了watchEffect函数需要依赖某个数据才能重新执行,那么在getContentData方法中,就需要定义一个可以让watchEffect函数依赖的值,也就是tab栏的数据值。


😲 tab栏的数据值在拆分Tab相关逻辑的时候,已经定义过了,而且在setup函数中结果出来了。所以我们就可以在setup函数中给useCurrentListEffect方法传递currentTab,

这样就可以让watchEffect函数监听到了。


👉 定义依赖数据值


const useCurrentListEffect = (currentTab) => {
  const content = reactive({ list: [] })
  const getContentData = async () => {
    const result = await get('/api/shop/1/products', { tab: currentTab.value })
    if (result.data.code === 0 && result.data.data.length) {
      content.list = result.data.data
    }
  }
  watchEffect(() => {
    getContentData()
  })
  const { list } = toRefs(content)
  return { list }
}
复制代码


  • 接收到currentTab之后,由于是用ref函数赋值的,所以需要用currentTab.value的方式取值


👉 从setup函数中获取依赖数据值


setup () {
    const { currentTab, handleTabClick } = useTabEffect()
    const { list } = useCurrentListEffect(currentTab)
    return { categories, currentTab, list, handleTabClick }
}
复制代码


👉 由于我们重新定义了获取数据的绑定值,所以页面上循环的contentList也需要改成list


v-for="item in contentList"
      ⬇️修改成⬇️
v-for="item in list"
复制代码

补充


在详情页获取店铺数据时,我们使用了 route.params 的方式获取到列表传递过来的id,那么我们在获取商品列表时,也可以用同样的方法去动态改变店铺id。


👉 引入useRoute


import { useRoute } from 'vue-router'
复制代码


👉 获取id


const route = useRoute()
const shopId = route.params.id
复制代码


👉 接口中动态使用id


const getContentData = async () => {
    const result = await get(`/api/shop/${shopId}/products`, { tab: currentTab })
    if (result.data.code === 0 && result.data.data.length) {
      content.list = result.data.data
    }
}
复制代码


PH9I)6A5LR(9[ALLO}CXH{J.png


完整拆分代码


`VRBY9Q2PYT3~W6GU_PPII5.png


总结


本篇文章主要是带着大家一起把详情页中的逻辑代码拆分出来,并且重新回顾了一下watchEffect侦听器的使用方法,结合实战案例之后,相信大家对watchEffect侦听器方法的使用有了进一步的理解。



相关文章
|
28天前
|
缓存 JavaScript UED
Vue3中v-model在处理自定义组件双向数据绑定时有哪些注意事项?
在使用`v-model`处理自定义组件双向数据绑定时,要仔细考虑各种因素,确保数据的准确传递和更新,同时提供良好的用户体验和代码可维护性。通过合理的设计和注意事项的遵循,能够更好地发挥`v-model`的优势,实现高效的双向数据绑定效果。
128 64
|
2天前
|
JavaScript API 数据处理
vue3使用pinia中的actions,需要调用接口的话
通过上述步骤,您可以在Vue 3中使用Pinia和actions来管理状态并调用API接口。Pinia的简洁设计使得状态管理和异步操作更加直观和易于维护。无论是安装配置、创建Store还是在组件中使用Store,都能轻松实现高效的状态管理和数据处理。
16 3
|
28天前
|
前端开发 JavaScript 测试技术
Vue3中v-model在处理自定义组件双向数据绑定时,如何避免循环引用?
Web 组件化是一种有效的开发方法,可以提高项目的质量、效率和可维护性。在实际项目中,要结合项目的具体情况,合理应用 Web 组件化的理念和技术,实现项目的成功实施和交付。通过不断地探索和实践,将 Web 组件化的优势充分发挥出来,为前端开发领域的发展做出贡献。
32 8
|
27天前
|
存储 JavaScript 数据管理
除了provide/inject,Vue3中还有哪些方式可以避免v-model的循环引用?
需要注意的是,在实际开发中,应根据具体的项目需求和组件结构来选择合适的方式来避免`v-model`的循环引用。同时,要综合考虑代码的可读性、可维护性和性能等因素,以确保系统的稳定和高效运行。
30 1
|
27天前
|
JavaScript
Vue3中使用provide/inject来避免v-model的循环引用
`provide`和`inject`是 Vue 3 中非常有用的特性,在处理一些复杂的组件间通信问题时,可以提供一种灵活的解决方案。通过合理使用它们,可以帮助我们更好地避免`v-model`的循环引用问题,提高代码的质量和可维护性。
36 1
|
JavaScript
vue实战中的一些技巧《一》
vue实战中的一些技巧《一》
815 0
vue实战中的一些技巧《一》
|
1月前
|
JavaScript API 开发者
Vue是如何进行组件化的
Vue是如何进行组件化的
|
7天前
|
JavaScript 关系型数据库 MySQL
基于VUE的校园二手交易平台系统设计与实现毕业设计论文模板
基于Vue的校园二手交易平台是一款专为校园用户设计的在线交易系统,提供简洁高效、安全可靠的二手商品买卖环境。平台利用Vue框架的响应式数据绑定和组件化特性,实现用户友好的界面,方便商品浏览、发布与管理。该系统采用Node.js、MySQL及B/S架构,确保稳定性和多功能模块设计,涵盖管理员和用户功能模块,促进物品循环使用,降低开销,提升环保意识,助力绿色校园文化建设。
|
1月前
|
JavaScript 前端开发 开发者
vue学习第一章
欢迎来到我的博客!我是瑞雨溪,一名热爱前端的大一学生,专注于JavaScript与Vue,正向全栈进发。博客分享Vue学习心得、命令式与声明式编程对比、列表展示及计数器案例等。关注我,持续更新中!🎉🎉🎉
41 1
vue学习第一章
|
1月前
|
JavaScript 前端开发 索引
vue学习第三章
欢迎来到瑞雨溪的博客,一名热爱JavaScript与Vue的大一学生。本文介绍了Vue中的v-bind指令,包括基本使用、动态绑定class及style等,希望能为你的前端学习之路提供帮助。持续关注,更多精彩内容即将呈现!🎉🎉🎉
30 1