am928 发表于 2025-4-22 04:16:57

小程序自定义tabbar实现教程:用户身份切换与vant组件应用指南

<p[]前言</p>   
在撰写公司项目时,遇到了这样一个需求:当用户登录后,如果该用户具备供应商身份,那么就在其个人资料下方显示切换按钮。用户点击切换按钮后,小程序的底部将会发生改变,变为其他样式。接下来,我将与大家分享我的实现方式,欢迎各位感兴趣的开发者阅读本文。

自定义

刚开始求助别人时,他们说我这个需求需要通过自定义实现。

安装vant/weap

此处使用的使用vant提供的,所以需要安装下。

<p><pre>    <code class="hljs bash" lang="bash">使用 yarn 命令添加 @vant/weapp 并且是在生产环境下添加
</code></pre></p>
<p><pre>    <code class="hljs bash" lang="bash">在本地的 npm 库中找到我们通过 yarn 安装的 vant-webapp 包。
在项目的根目录处创建 plguins 文件夹。接着,将第一步所找到的 vant-webapp 文件夹复制至该创建好的 plguins 文件夹中。
3. 安装完成,此时的目录结构是这样的
</code></pre></p>
配置-

根据小程序官网的内容,我们需要进行一些配置,这样小程序才能识别到我们的自定义。

<p><pre>    <code class="hljs javascript" lang="javascript"><span class="hljs-comment">// app.json</span>
{
<span class="hljs-comment">其他项被省略了。</span>
<span class="hljs-string">"tabBar"</span>: {
    <span class="hljs-comment">如果 custom 设置为 true,那么小程序就会在项目目录中寻找 custom-tab-bar 文件夹。</span>
    <span class="hljs-string">"custom"</span>: <span class="hljs-literal">true</span>,
    <span class="hljs-string">"color"</span>: <span class="hljs-string">"#CCCCCC"</span>,
    <span class="hljs-string">"selectedColor"</span>: <span class="hljs-string">"#1296db"</span>,
    <span class="hljs-string">"borderStyle"</span>: <span class="hljs-string">"black"</span>,
    <span class="hljs-string">"list"</span>: [
      {
      <span class="hljs-string">"pagePath"</span>: <span class="hljs-string">"pages/home/home"</span>,
      <span class="hljs-string">"text"</span>: <span class="hljs-string">"首页"</span>,
      <span class="hljs-string">"iconPath"</span>: <span class="hljs-string">"images/icon/vegetables.jpg"</span>,
      <span class="hljs-string">"selectedIconPath"</span>: <span class="hljs-string">"images/icon/所选蔬菜的图标.png"</span>
      },
      {
      <span class="hljs-string">"pagePath"</span>: <span class="hljs-string">"pages/shopping/shopping"</span>,
      <span class="hljs-string">"text"</span>: <span class="hljs-string">"购物车"</span>,
      <span class="hljs-string">"iconPath"</span>: <span class="hljs-string">"images/icon/shopping.png"</span>,
      <span class="hljs-string">"selectedIconPath"</span>: <span class="hljs-string">"images/icon/购物已选中.png"</span>
      },
      {
      <span class="hljs-string">"pagePath"</span>: <span class="hljs-string">"pages/user/user"</span>,
      <span class="hljs-string">"text"</span>: <span class="hljs-string">"我的"</span>,
      <span class="hljs-string">"iconPath"</span>: <span class="hljs-string"></span>,
      <span class="hljs-string">"selectedIconPath"</span>: <span class="hljs-string">"images/icon/my_selected.png"</span>
      }
    ]
},
<span class="hljs-string">"usingComponents"</span>: {
    <span class="hljs-string">"van-tabbar"</span>: <span class="hljs-string">"/plguins/vant-weapp/dist/tabbar" 目录下的 index 文件</span>,
    <span class="hljs-string">"van-tabbar-item"</span>: <span class="hljs-string">"/plguins/vant-weapp/dist/tabbar-item/index" 这个路径指向了某个特定的文件或资源。它可能与插件 vant-weapp 中的 tabbar-item 相关,用于在特定的应用或项目中展示或处理 tabbar 相关的内容。</span>
}
}
</code></pre></p>
<p><pre>    <code class="hljs html" lang="html"><span class="hljs-comment"></span>
<span class="hljs-tag"><<span class="hljs-name">van-tabbar</span>
<span class="hljs-attr">active</span>=<span class="hljs-string">"{{ active }}"</span>
<span class="hljs-attr">bind:change</span>=<span class="hljs-string">"onChange"</span>
></span>
<span class="hljs-tag"><<span class="hljs-name">van-tabbar-item</span> <span class="hljs-attr">icon</span>=<span class="hljs-string">"home-o"</span>></span>首页<span class="hljs-tag"></<span class="hljs-name">van-tabbar-item</span>></span>
<span class="hljs-tag"><<span class="hljs-name">van-tabbar-item</span> <span class="hljs-attr">icon</span>=<span class="hljs-string">"search"</span>></span>购物车<span class="hljs-tag"></<span class="hljs-name">van-tabbar-item</span>></span>
<span class="hljs-tag"><<span class="hljs-name">van-tabbar-item</span> <span class="hljs-attr">icon</span>=<span class="hljs-string">"friends-o"</span>></span>我的<span class="hljs-tag"></<span class="hljs-name">van-tabbar-item</span>></span>
<span class="hljs-tag"></<span class="hljs-name">van-tabbar</span>></span>
</code></pre></p>
<p><pre>    <code class="hljs javascript" lang="javascript">Page({
<span class="hljs-attr">data</span>: {
    <span class="hljs-attr">active</span>: <span class="hljs-number">0</span>,
},
onChange(event) {
    <span class="hljs-keyword">this</span>.setData({ <span class="hljs-attr">active</span>: event.detail });
    <span class="hljs-keyword">switch</span> ( event.detail) {
      <span class="hljs-keyword">case</span> <span class="hljs-number">0</span>:
      <span class="hljs-comment">// 首页</span>
      wx.switchTab({
          <span class="hljs-attr">url</span>:<span class="hljs-string">''</span>
      });
      <span class="hljs-keyword">break</span>;
      <span class="hljs-keyword">case</span> <span class="hljs-number">1</span>:
      <span class="hljs-comment">// 购物车</span>
      wx.switchTab({
          <span class="hljs-attr">url</span>:<span class="hljs-string">''</span>
      });
      <span class="hljs-keyword">break</span>;
      <span class="hljs-keyword">case</span> <span class="hljs-number">2</span>:
      <span class="hljs-comment">// 我的</span>
      wx.switchTab({
          <span class="hljs-attr">url</span>:<span class="hljs-string">''</span>
      });
      <span class="hljs-keyword">break</span>;
    }
}
});
</code></pre></p>
执行结果

我原本满心欢喜,觉得这个需求很简单,以为很容易就能实现。然而,编译之后,我的心态崩溃了,这用户体验实在太差了。我点击之后,页面虽然切换了,但我却没反应过来。

自定义组件

使用自定义形式来实现,用户体验不佳,所以只能去寻找另一种解决方案。经过一番查找后,答案指向了自定义组件,这种方案比较麻烦,需要对项目的原面进行重构,把原本的 Page 方式改成其他形式。

实现过程

<p><pre>    <code class="hljs html" lang="html"><span class="hljs-comment"></span>
<span class="hljs-tag"><<span class="hljs-name">view</span> <span class="hljs-attr">class</span>=<span class="hljs-string">'main-wrapper'</span> <span class="hljs-attr">style</span>=<span class="hljs-string">margin-bottom 的值为 tabbarHeight 像素。</span>></span>
<span class="hljs-tag"><<span class="hljs-name">Index</span> <span class="hljs-attr">wx:if</span>=<span class="hljs-string">'{{isLogin === false}}'</span>></span><span class="hljs-tag"></<span class="hljs-name">Index</span>></span>
<span class="hljs-comment"></span>
<span class="hljs-tag"><<span class="hljs-name">home</span> <span class="hljs-attr">wx:if</span>=<span class="hljs-string">当 activeIndex 等于 0 且 isLogin 为真且 isSupplier 为假时</span> <span class="hljs-attr">onShow</span>=<span class="hljs-string">"{{tabbar.selected}}"</span>></span><span class="hljs-tag"></<span class="hljs-name">home</span>></span>
<span class="hljs-comment"></span>
<span class="hljs-tag"><<span class="hljs-name">commodity</span> <span class="hljs-attr">wx:if</span>=<span class="hljs-string">如果 activeIndex 等于 0 并且 isLogin 为真并且 isSupplier 为真</span> <span class="hljs-attr">onShow</span>=<span class="hljs-string">"{{otherBar.selected}}"</span>></span><span class="hljs-tag"></<span class="hljs-name">commodity</span>></span>
<span class="hljs-comment"></span>
<span class="hljs-tag"><<span class="hljs-name">shopping</span> <span class="hljs-attr">wx:if</span>=<span class="hljs-string">如果 activeIndex 等于 1 并且 isLogin 为真并且 isSupplier 为假</span> <span class="hljs-attr">onShow</span>=<span class="hljs-string">"{{tabbar.selected}}"</span>></span><span class="hljs-tag"></<span class="hljs-name">shopping</span>></span>
<span class="hljs-comment"></span>
<span class="hljs-tag"><<span class="hljs-name">order</span> <span class="hljs-attr">wx:if</span>=<span class="hljs-string">如果 activeIndex 等于 1 并且 isLogin 为真并且 isSupplier 为真</span> <span class="hljs-attr">onShow</span>=<span class="hljs-string">"{{otherBar.selected}}"</span>></span><span class="hljs-tag"></<span class="hljs-name">order</span>></span>
<span class="hljs-comment"></span>
<span class="hljs-tag"><<span class="hljs-name">user</span> <span class="hljs-attr">wx:if</span>=<span class="hljs-string">如果 activeIndex 等于 2 并且 isLogin 等于 true</span> <span class="hljs-attr">onShow</span>=<span class="hljs-string">"{{tabbar.selected}}"</span>></span><span class="hljs-tag"></<span class="hljs-name">user</span>></span>
<span class="hljs-tag"></<span class="hljs-name">view</span>></span>
<span class="hljs-tag"><<span class="hljs-name">van-tabbar</span> <span class="hljs-attr">wx:if</span>=<span class="hljs-string">如果 isLogin 为真且 isSupplier 为假</span> <span class="hljs-attr">active</span>=<span class="hljs-string">"{{ activeIndex }}"</span> <span class="hljs-attr">bind:change</span>=<span class="hljs-string">"onChange"</span> <span class="hljs-attr">z-index</span>=<span class="hljs-string">"9999"</span>></span>
<span class="hljs-tag"><<span class="hljs-name">van-tabbar-item</span> <span class="hljs-attr">wx:for</span>=<span class="hljs-string">"{{tabbar}}"</span> <span class="hljs-attr">wx:key</span>=<span class="hljs-string">"index"</span> <span class="hljs-attr">info</span>=<span class="hljs-string">"{{item.tips}}"</span>></span>
    <span class="hljs-tag"><<span class="hljs-name">image</span>
            <span class="hljs-attr">slot</span>=<span class="hljs-string">"icon"</span>
            <span class="hljs-attr">src</span>=<span class="hljs-string">"{{item.imgSrc}}"</span>
            <span class="hljs-attr">mode</span>=<span class="hljs-string">"aspectFit"</span>
            <span class="hljs-attr">style</span>=<span class="hljs-string">"width: 30px; height: 18px;"</span>
    /></span>
    <span class="hljs-tag"><<span class="hljs-name">image</span>
            <span class="hljs-attr">slot</span>=<span class="hljs-string">"icon-active"</span>
            <span class="hljs-attr">src</span>=<span class="hljs-string">"{{item.selectImgSrc}}"</span>
            <span class="hljs-attr">mode</span>=<span class="hljs-string">"aspectFit"</span>
            <span class="hljs-attr">style</span>=<span class="hljs-string">"width: 30px; height: 18px;"</span>
    /></span>
    {{item.name}}
<span class="hljs-tag"></<span class="hljs-name">van-tabbar-item</span>></span>
<span class="hljs-tag"></<span class="hljs-name">van-tabbar</span>></span>
<span class="hljs-tag"><<span class="hljs-name">van-tabbar</span> <span class="hljs-attr">wx:if</span>=<span class="hljs-string">如果 isLogin 为真且 isSupplier 也为真</span> <span class="hljs-attr">active</span>=<span class="hljs-string">"{{ activeIndex }}"</span> <span class="hljs-attr">bind:change</span>=<span class="hljs-string">"onChange"</span> <span class="hljs-attr">z-index</span>=<span class="hljs-string">"9999"</span>></span>
<span class="hljs-tag"><<span class="hljs-name">van-tabbar-item</span> <span class="hljs-attr">wx:for</span>=<span class="hljs-string">"{{otherBar}}"</span> <span class="hljs-attr">wx:key</span>=<span class="hljs-string">"index"</span> <span class="hljs-attr">info</span>=<span class="hljs-string">"{{item.tips}}"</span>></span>
    <span class="hljs-tag"><<span class="hljs-name">image</span>
            <span class="hljs-attr">slot</span>=<span class="hljs-string">"icon"</span>
            <span class="hljs-attr">src</span>=<span class="hljs-string">"{{item.imgSrc}}"</span>
            <span class="hljs-attr">mode</span>=<span class="hljs-string">"aspectFit"</span>
            <span class="hljs-attr">style</span>=<span class="hljs-string">"width: 30px; height: 18px;"</span>
    /></span>
    <span class="hljs-tag"><<span class="hljs-name">image</span>
            <span class="hljs-attr">slot</span>=<span class="hljs-string">"icon-active"</span>
            <span class="hljs-attr">src</span>=<span class="hljs-string">"{{item.selectImgSrc}}"</span>
            <span class="hljs-attr">mode</span>=<span class="hljs-string">"aspectFit"</span>
            <span class="hljs-attr">style</span>=<span class="hljs-string">"width: 30px; height: 18px;"</span>
    /></span>
    {{item.name}}
<span class="hljs-tag"></<span class="hljs-name">van-tabbar-item</span>></span>
<span class="hljs-tag"></<span class="hljs-name">van-tabbar</span>></span>
</code></pre></p>
<p><pre>    <code class="hljs javascript" lang="javascript"><span class="hljs-comment">// main/index.js</span>
<span class="hljs-comment">/*
此处小程序的授权登录页面在 main 里进行引导,所以我们对这个文件进行了如下操作:
   1. 我们需要在app.js创建一个全局变量isLogin
   2. 在此处监听isLogin是否改变
如果改变 data 中定义的 isLogin 属性,那么 wxml 页面就会显示对应的 tabbar 并且进入 home 组件。
*/</span>
<span class="hljs-keyword">const</span> app = getApp();
Page({
<span class="hljs-attr">data</span>: {
    <span class="hljs-attr">tabbar</span>: [
      {
      <span class="hljs-attr">name</span>: <span class="hljs-string">"首页"</span>,
      <span class="hljs-attr">tips</span>:<span class="hljs-string">''</span>,
      <span class="hljs-attr">selected</span>: <span class="hljs-literal">false</span>,
      <span class="hljs-attr">imgSrc</span>:<span class="hljs-string">"/images/icon/vegetables.jpg"</span>,
      <span class="hljs-attr">selectImgSrc</span>:<span class="hljs-string">"/images/icon/vegetables_selected.png" 表示与蔬菜相关的选中图标。这个图标通常用于在界面或文档中标识选中的蔬菜相关元素或选项。它可能出现在各种与蔬菜相关的应用程序、网站或文档中,帮助用户快速识别和操作选中的蔬菜内容。</span>
      },
      {
      <span class="hljs-attr">name</span>: <span class="hljs-string">"购物车"</span>,
      <span class="hljs-attr">tips</span>:<span class="hljs-string">''</span>,
      <span class="hljs-attr">selected</span>: <span class="hljs-literal">false</span>,
      <span class="hljs-attr">imgSrc</span>:<span class="hljs-string">"/images/icon/shopping.png"</span>,
      <span class="hljs-attr">selectImgSrc</span>:<span class="hljs-string">这是一个图片路径,其具体为“/images/icon/shopping_selected.png”。</span>
      },
      {
      <span class="hljs-attr">name</span>: <span class="hljs-string">"我的"</span>,
      <span class="hljs-attr">tips</span>: <span class="hljs-string">''</span>,
      <span class="hljs-attr">selected</span>: <span class="hljs-literal">false</span>,
      <span class="hljs-attr">imgSrc</span>:<span class="hljs-string">"/images/icon/my.jpg"</span>,
      <span class="hljs-attr">selectImgSrc</span>:<span class="hljs-string">"/images/icon/我所选的.png"</span>
      }
    ],
    <span class="hljs-attr">otherBar</span>:[
      {
      <span class="hljs-attr">name</span>: <span class="hljs-string">"商品"</span>,
      <span class="hljs-attr">tips</span>: <span class="hljs-string">''</span>,
      <span class="hljs-attr">selected</span>: <span class="hljs-literal">false</span>,
      <span class="hljs-attr">imgSrc</span>:<span class="hljs-string">"/images/icon/commodity.png"</span>,
      <span class="hljs-attr">selectImgSrc</span>:<span class="hljs-string">"/images/icon/商品已选中.png"</span>
      },
      {
      <span class="hljs-attr">name</span>: <span class="hljs-string">"订单"</span>,
      <span class="hljs-attr">tips</span>: <span class="hljs-string">''</span>,
      <span class="hljs-attr">selected</span>: <span class="hljs-literal">false</span>,
      <span class="hljs-attr">imgSrc</span>:<span class="hljs-string">"/images/icon/order.png"</span>,
      <span class="hljs-attr">selectImgSrc</span>:<span class="hljs-string">"/images/icon/order_selected.png" 这个图片标识为选中订单的图标。它在相关界面或操作中用于表示特定订单已被选中。</span>
      },
      {
      <span class="hljs-attr">name</span>: <span class="hljs-string">"我的"</span>,
      <span class="hljs-attr">tips</span>: <span class="hljs-string">''</span>,
      <span class="hljs-attr">selected</span>: <span class="hljs-literal">false</span>,
      <span class="hljs-attr">imgSrc</span>:<span class="hljs-string">"/images/icon/my.jpg"</span>,
      <span class="hljs-attr">selectImgSrc</span>:<span class="hljs-string">"/images/icon/my_selected.png"</span>
      }
    ],
    <span class="hljs-attr">tabbarHeight</span>: app.isIPhoneX ? <span class="hljs-number">84</span> : <span class="hljs-number">50</span>, <span class="hljs-comment">// 底部tabbar高度</span>
    activeIndex: <span class="hljs-number">0</span>,<span class="hljs-comment">// 选中的tab</span>
    scrollTopArray: [], <span class="hljs-comment">// 记录每个页面的滚动位置</span>
app.globalData._isLogin 即为 isLogin
    <span class="hljs-attr">isSupplier</span>: app.globalData._isSupplier,
},
<span class="hljs-comment">/**
   * 生命周期函数--监听页面加载
   */</span>
onLoad: <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">options</span>) </span>{
    <span class="hljs-keyword">this</span>.data.tabbar.forEach(<span class="hljs-function">(<span class="hljs-params">item, index, arr</span>) =></span> {
      <span class="hljs-keyword">this</span>.data.scrollTopArray = <span class="hljs-number">0</span>;
      <span class="hljs-comment">// item.isFirstLoad = true</span>
    });
    wx.setNavigationBarTitle({
      <span class="hljs-attr">title</span>: <span class="hljs-keyword">this</span>.data.tabbar[<span class="hljs-number">0</span>].name,
    })
},
<span class="hljs-comment">//定义监听回调方法</span>
<span class="hljs-comment">//app 监听回调方法</span>
watchBack: <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">value</span>) </span>{<span class="hljs-comment">这里的 value 是 app.js 中 watch 方法里的 set ,并且它会返回整个 globalData 。</span>
    <span class="hljs-keyword">this</span>.setData({
      <span class="hljs-attr">isLogin</span>: value._isLogin,
      <span class="hljs-attr">isSupplier</span>: value._isSupplier
    });
},
<span class="hljs-comment">/**
   * 生命周期函数--监听页面显示
   */</span>
onShow: <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params"></span>) </span>{
    <span class="hljs-keyword">const</span> self = <span class="hljs-keyword">this</span>;
    <span class="hljs-keyword">this</span>.updateSubPageShowHide(<span class="hljs-keyword">this</span>.data.activeIndex);
    <span class="hljs-comment">// 监听全局变量的改变</span>
获取 App 并对其进行监听,监听的对象是 self.watchBack 。
},
<span class="hljs-comment">/**
   * 生命周期函数--监听页面隐藏
   */</span>
onHide: <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params"></span>) </span>{},
onChange(event) {
    <span class="hljs-keyword">if</span> (event.detail == <span class="hljs-keyword">this</span>.data.activeIndex) <span class="hljs-keyword">return</span>;
    <span class="hljs-keyword">this</span>调用 updateSubPageShowHide 并传入 event.detail 。
    <span class="hljs-keyword">this</span>.setData({
      <span class="hljs-attr">activeIndex</span>: event.detail,
      <span class="hljs-attr">pageName</span>: <span class="hljs-keyword">this</span>4. 要求分句越短越好,同时保留原意。
    });
    <span class="hljs-comment">// 还原子页面的滚动位置</span>
    wx.pageScrollTo({
      <span class="hljs-attr">duration</span>: <span class="hljs-number">0</span>,
      <span class="hljs-attr">scrollTop</span>: <span class="hljs-keyword">this</span>data 中的 scrollTopArray 数组,其中的元素是 event.detail 所对应的内容。
    })
},
<span class="hljs-comment">// 记录每个子页面的滚动位置</span>
onPageScroll(e) {
    <span class="hljs-keyword">this</span>.data.scrollTopArray[<span class="hljs-keyword">this</span>.data 的 activeIndex 被设置为 e 的 scrollTop 。
},
<span class="hljs-comment">// 更新组件的show hide 生命周期</span>
更新子页面的显示隐藏状态,传入当前索引值 currentIndex 。
    <span class="hljs-keyword">this</span>.data.tabbar.forEach(<span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">value, i</span>) </span>{
      <span class="hljs-keyword">if</span> (i == currentIndex) {
      value.selected = <span class="hljs-literal">true</span>;
      wx.setNavigationBarTitle({
          <span class="hljs-attr">title</span>: value.name,
      })
      } <span class="hljs-keyword">else</span> {
      value.selected = <span class="hljs-literal">false</span>;
      }
    });
    <span class="hljs-keyword">this</span>.setData({
      <span class="hljs-attr">tabbar</span>: <span class="hljs-keyword">this</span>.data.tabbar,
    })
},
});
</code></pre></p>
<p><pre>    <code class="hljs javascript" lang="javascript"><span class="hljs-comment">main/index.json 这里使用 tabbar 对应的组件进行声明。</span>
{
<span class="hljs-string">"usingComponents"</span>: {
    <span class="hljs-string">"home"</span>:<span class="hljs-string">"/pages/home/home"</span>,
    <span class="hljs-string">"shopping"</span>: <span class="hljs-string">"/pages/shopping/shopping"</span>,
    <span class="hljs-string">"user"</span>: <span class="hljs-string">"/pages/user/user"</span>,
    <span class="hljs-string">"Index"</span>: <span class="hljs-string">"/pages/index/index"</span>,
    <span class="hljs-string">"commodity"</span>: <span class="hljs-string">"/pages/commodity/commodity"</span>,
    <span class="hljs-string">"order"</span>: <span class="hljs-string">/pages/commodityOrder/commodityOrder 这个路径用于展示商品订单相关的页面内容。它是一个特定的页面链接,指向商品订单的相关界面。通过这个链接,用户可以进行与商品订单相关的操作,如查看订单详情、修改订单信息等。</span>
}
}
</code></pre></p>
<p><pre>    <code class="hljs javascript" lang="javascript"><span class="hljs-comment">// app.js</span>
<span class="hljs-comment">/*
因为在 main/index.js 里使用了全局变量 isLogin 和 isSupplier,所以我们需要进行如下操作。
      1. 在app.js中添加对应的全局变量
      2. 创建监听方法,监听这两个全局变量的改变
*/</span>

globalData: {
    <span class="hljs-attr">userInfo</span>: <span class="hljs-literal">null</span>,
    <span class="hljs-comment">// 是否登录</span>
    _isLogin:<span class="hljs-literal">false</span>,
    <span class="hljs-comment">// 是否供应商</span>
    _isSupplier:<span class="hljs-literal">false</span>,
    <span class="hljs-attr">data</span>:{
    }
},
<span class="hljs-attr">watch</span>: <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">method</span>) </span>{
    <span class="hljs-keyword">let</span> obj = <span class="hljs-keyword">this</span>.globalData;
    <span class="hljs-built_in">Object</span>.defineProperty(obj, <span class="hljs-string">"data"</span>, {<span class="hljs-comment">这里的 data 与上面 globalData 中的 data 相对应。</span>
      configurable: <span class="hljs-literal">true</span>,
      <span class="hljs-attr">enumerable</span>: <span class="hljs-literal">true</span>,
      <span class="hljs-attr">set</span>: <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">value</span>) </span>{<span class="hljs-comment">动态进行赋值操作,将对象进行传递,给 globalData 里的对应变量赋予相应的值。</span>
      <span class="hljs-keyword">this</span>._isLogin = value.isLogin;
      <span class="hljs-keyword">this</span>_isSupplier 的值与 value.isSupplier 的值相同。
      method(value);
      },
      <span class="hljs-attr">get</span>: <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params"></span>) </span>{<span class="hljs-comment">//获取全局变量值,直接返回全部</span>
      <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>.globalData;
      }
    })
}
</code></pre></p>
<p><pre>    <code class="hljs javascript" lang="javascript">
<span class="hljs-comment">// tabbar对应的页面改造成组件的示例</span>
<span class="hljs-keyword">import</span> base <span class="hljs-keyword">from</span> <span class="hljs-string">"../../api/base"</span>;
<span class="hljs-keyword">var</span> app = getApp();
Component({
<span class="hljs-comment">/**
   * 组件的属性列表
   */</span>
properties: {
    <span class="hljs-attr">height</span>: {
      <span class="hljs-attr">type</span>: <span class="hljs-built_in">Number</span>,
      <span class="hljs-attr">value</span>: app.homePageHeight
    },
    <span class="hljs-attr">onShow</span>: {
      <span class="hljs-attr">type</span>: <span class="hljs-built_in">Boolean</span>,
      <span class="hljs-attr">value</span>: <span class="hljs-literal">false</span>,
      <span class="hljs-attr">observer</span>: <span class="hljs-string">'onShowHideChange'</span>
    },
},
<span class="hljs-comment">/**
   * 页面的初始数据
   */</span>
data: {
    <span class="hljs-attr">total</span>: <span class="hljs-number">0</span>,
    <span class="hljs-attr">size</span>: <span class="hljs-number">0</span>,
    <span class="hljs-attr">shoppingList</span>: {},
    <span class="hljs-attr">baseUrl</span>:base.defaultBaseUrl
},
<span class="hljs-comment">/**
   * 组件的方法列表
   */</span>
methods: {
    onShowHideChange(show) {
      <span class="hljs-keyword">if</span>(show){
       <span class="hljs-comment">// 组件显示时执行这里</span>
      <span class="hljs-keyword">this</span>.onShow();
      }<span class="hljs-keyword">else</span>{
      }
    },
    },
    <span class="hljs-attr">onShow</span>: <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params"></span>) </span>{
      <span class="hljs-keyword">this</span>.initData();
    },
}
});
</code></pre></p>
执行结果

执行后,效果还不错,功能都实现了,但是还有一些遗留bug:

实现

当我带着遗留的关于自定义组件形式的问题去寻求他人帮助时,群友告知我这个动态设置的需求借助微信官方的 api 就能够达成。此刻,我的内心十分失落,昨天我怎么就没有发现这个解决方案呢?白白折腾了一整天。为了不让昨天的折腾白费,所以大家就看到了这篇文章的分享,这也算是对自己的一种安慰。

然而,仔细对微信提供的 api 进行观察后可以发现,此 api 仅仅能够改变 bar 的图标以及名字,却无法改变其跳转的路径。那么,我获取这个 api 又有什么用处呢?

我摊牌了,我搞不定了,谁行谁上吧,换一种方式实现吧。

写在最后
页: [1]
查看完整版本: 小程序自定义tabbar实现教程:用户身份切换与vant组件应用指南