前幾日使用Uniapp框架寫入項目,因此需要自訂vue導覽選單組件,並且完成選單動態高亮,簡而言之,tab組件內完成點哪哪個發生高亮。 【相關建議:《vue.js教學》】
這裡需要使用uniapp scroll-view元件,實現導覽選單的橫向滑動,這裡全部使用的是flex版面。
子元件tab.vue(自訂導覽功能表元件)如下
## 預設activeIndex的值為0,也就是預設是導航選單第一項高亮,循環的list數組是從主元件接收的,在子元件中可以使用props接收主元件的值:
<script> export default { name: "tab", data() { return { activeIndex:0 }; }, // 组件实例的作用域是孤立的。这意味着不能(也不应该)在子组件的模板中直接饮用父组件的数据。要让子组件使用父组件的数据,需要通过子组件的 props 选项。子组件要显示的用 props 声明它期望获得的数据 // 借助watch可以监听data或者 props 值的变化 watch:{ tabIndex(newVal,oldVal) { // console.log(newVal,oldVal); this.activeIndex = newVal } }, //接收来自主组件的值 list props: { list: { type: Array, default () { return [] } } }, methods:{ clickTab(item,index) { // console.log(item,index); this.activeIndex = index // tab是自定义事件名 派发给组件的调用者 index.vue this.$emit("tab",{ data:item, index:index }) } } } </script>
tab.vue樣式如下:
<style> .tab{ display: flex; width: 100%; border-bottom: 1px solid #f5f5f5; .tab-srcoll{ display: flex; overflow: hidden; box-sizing: border-box; .tab-srcoll-box{ display: flex; height: 45px; align-items: center; flex-wrap: nowrap; box-sizing: border-box; .tab-srcoll-item{ color: #333; flex-shrink: 0; font-size: 14px; padding: 0 10px; &.active{ color: $chloe-base-color; } } } } } </style>
在主元件index.vue頁中呼叫tab.vue元件,並接收子元件派發的tab事件
<template> <view class="home"> <tab :list="list" @tab="tab" ></tab> </view> </template>
<script> export default { data() { return { list: [], activeIndex:0 }; }, onLoad() { this.getTabList() }, onShow(){ }, methods: { tab({ data, index }) { // console.log(data.catname,index); this.activeIndex = index }, async getTabList() { const res = await this.$myRequest({ url: 'tab' }) const { data } = res this.list = data } } } </script>
在getTabList方法中使用的$myRequest是封裝的promise網路請求,內容如下:
const BASE_URL = 'http://inews.io/'这里可以换成你后端接口的域名 export const myRequest = (options) => { const { url, method, data, timeout } = options return new Promise((resolve, reject) => { uni.request({ url: BASE_URL + url, method: method || 'GET', data: data || {}, timeout:timeout || 3000, success: (res) => { if (res.statusCode !== 200) { uni.showToast({ title: '请求数据失败', duration: 1000, icon: 'none' }); } resolve(res) }, fail: (err) => { uni.showToast({ title: '请求接口失败', duration: 1000, icon: 'none' }); reject(err) } }) }) }
這樣就可以全域使用$myRequest發起網路請求了。
最終實現的效果如圖:
相關推薦:
以上是Uniapp自訂vue導覽選單元件完成選單動態高亮的詳細內容。更多資訊請關注PHP中文網其他相關文章!