课程名称: 2022持续升级 Vue3 从入门到实战 掌握完整知识体系
课程章节: 商家展示功能开发(上)
主讲老师: Dell
今天学习的内容包括:
页面接收数据如果是引用数据类型(对象或数组)时,建议使用 reactive 包装
可选链操作符提供了一种方法来简化被连接对象的值访问,在一定程度上简化了写法
let obj = { children:{ name:"李四" } } // 这么写没毛病,但是假如obj.children为null或undefined呢? obj.children.name; // 一般我们这么来避免 if(obj.children)( // ... } // --------------------分割线--------------------------------- // 接着上面那个问题,那再次假如obj.children.name为null或undefined呢? // 一般来这么写 if(obj.children && obj.children.name){ // ... } // --------------------分割线--------------------------------- // 以上的写法就显得有点冗余了,试试可选链写法吧: // 当obj.children为undefined或null的时候,这时候访问会被截断,且不会继续访问obj.children.name if(obj.children?.name){ // 同等 if(obj.children && obj.children.name){} // ... }
reactive 接收数据建议使用const nearbyList = reactive({ list:[] })
setup(){ const nearbyList = reactive({ list:[] }) const getNearbyList - async ()=>{ const result-await axios.get("https://www.fastmock.com") if(result?.data?.errno=0){ nearbylist.list-result.data.data console.log(result,data,data) console.log(nearbyList.list) } getNearbyList() console.log(nearbyList.list) const {list}-toRefs(nearbyList) console.log(list) return{list} }
组件中样式的动态切换:根据父组件传入值的不同显示/隐藏样式
父组件:
<div> <ShopInfo v-for="item in list" :key="item._id" tem="item :item ="item" :hasBorderBottom="true" /> </div>
<ShopInfo :item="item" :hasBorderBottom="false" />
子组件:
props:["item","hasBorderBottom"]
<div class="nearby_content" :class="{'nearby_content--hasBorderBottom':hasBorderBottom?true: false}" />
router 和 route 的区别:
router 获取的是整个路由,通常用于页面跳转;route 获取的是某一个路由,通常用于获取路由参数
import { useRouter,useRoute } from "vue-router" export default { setup(){ const router = useRouter() const route = useRoute() console.log(route.params.id) }
当网速不好导致图片无法很快加载出来的时候,图片会先变成裂图,解决这个问题的方法是使用 v-show 或 v-if 判断是否有图片,当有图片的时候再展示
<ShopInfo :item="item" :hasBorderBottom="false" />
点击高亮显示,其他取消高亮:
用点击的tab值和每一个tab值对比,一样的话则当前tab值高亮显示
<div class="category_item" :class="['category__item--active': currentTab === item.tab)" v-for="item in categoryList" :key="item.id" @click="() => handleCategoryClick(item.tab)" > {{item.name}} </div>
函数传值写法:
const handleCategoryClick=(tab)=>{ console.log(tab) }
当其他模块需要用本模块里面的函数时,我们无法将本模块的函数导出让别的模块使用,这时候我们可以这样做:
1.将别的模块的参数导出出来,然后本模块接收。
2.当别的模块参数变化时,说明需要调用本模块的函数,这时候我们可以通过使用 watchEffect 巧妙的实现这个需求。因为 watchEffect 的作用就是监听,在页面加载进来的时候就开始监听,然后内部检测到依赖代码有变化了重新执行内部代码
watchEffect 内部监听了currentTab 的值,所以当 currentTab 的值发生变化的时候,watchEffect 就可以监听到然后执行 getContentData 函数,而且 watchEffect 还有一个好处是页面第一次加载进来的时候就会执行一次,让页面获取了数据展示出来
const usecontentEffect=(currontTat)=>{ const route-useRouto() const data·reactive({ contentList:[] ({ const getContentData·async()=>( const result=await axios.get(shop/$(route.parans.id)/products?tab=$currentTab.value if(result).data7.errno==0)( data.contentList-result.data.data watchEffect(()=>( getContentData() }) const(contentList}=toRefs(data) return{contentlist) }