【微信小程序-插件开发实战】学校选择器 11.9更新
发布于 3 年前 作者 lhao 656 次浏览 来自 分享

插件使用效果图:

学校选择器,起源于我个人开发的项目中的一个实际需求:从列表中选择高校。本质上只是一个选择列表,有很多种呈现方法,而我想让这一环节呈现的更舒适一点(就是带图片咯~),于是开发了这个组件。但我觉得应该有其他开发者会用到同样的需求,那何不分享出来?把它插件化并开源。

一、插件的配置

首先新建一个插件,而不是小程序,如下图。

微信提供的插件模板分为两个模块,一个是miniprogram,是用于模拟业务环境的,你可以在这里模拟下使用插件的小程序业务页面;另一个模块是plugin,这就是插件的实际开发环境了,最新的基础库已经支持插件里面有自定义组件和多个page页面。

改动改动一些模板的变量名,如plugin.json的参数(如要插件的页面、自定义组件等)后,后面就可以开始在plugin里面写插件代码!
{
  "pages": {
    "chooseSchool""pages/chooseSchool"
  },
  "main""index.js"
}
在插件的配置方面,官方文档介绍的非常详细,我就不再赘述了:<a href="https://developers.weixin.qq.com/miniprogram/dev/framework/plugin/development.html#%E5%88%9B%E5%BB%BA%E6%8F%92%E4%BB%B6%E9%A1%B9%E7%9B%AE" rel="noopener noreferrer" target="_blank">https://developers.weixin.qq.com/miniprogram/dev/framework/plugin/development.html\#%E5%88%9B%E5%BB%BA%E6%8F%92%E4%BB%B6%E9%A1%B9%E7%9B%AE</a>

二、学校选择器

下面开始写插件的业务代码。

学校选择器主要由三部分组成:一个固定的搜索框、懒加载的列表、搜索失败的提示框。

1、固定的搜索框

  <view class="search_view_fixed">
    <view class="search_view">
      <image class="search_image" src="/images/search.png"></image>
      <input class="search_input" type="text" bindblur="" bindinput="search_school" value="" placeholder="找不到?搜一搜" />
    </view>
  </view>
input配置了bindinput,让每次键入字符时,都将包含该字符的学校名加入渲染的列表里
  /**
   * 搜索学校
   */
  search_school(e){
    var value = e.detail.value
    var schoolList = this.data.schoolList
    var schoolList_now = []
    for(var i = 0; i < schoolList.length; i++){
      if(schoolList[i].name.indexOf(value) != -1){
        schoolList_now.push(schoolList[i])
      }
    }
    this.setData({
      schoolList_now:schoolList_now
    })
  }

2、懒加载的列表

    <block wx:for="{{schoolList_now}}" wx:key="name">
      <view class="school_item" hover-class="hover_item" hover-stay-time="50" catchtap="choose" data-item="{{item}}">
        <image class="school_image" data-index="{{index}}" src="http://www.ming13.cn:5000/schoolImages/{{item.name}}.jpg" lazy-load="true" ></image>
        <view class="school_right_view">
          <view class="school_name">{{item.name}}</view>
          <view class="school_info">
            <view class="school_985" wx:if="{{item.is985}}">985</view>
            <view class="school_211" wx:if="{{item.is211}}">211</view>
          </view>
        </view>
      </view>
    </block>
其中的image配置了lazy-load以允许懒加载,这样可以加快渲染速度。

3.搜索失败的提示框

    <view class="no_tip" wx:if="{{schoolList_now.length == 0}}">
      <view class="no_tip_0">没有搜索到结果</view>
      <view class="no_tip_1">可能是尚未收录该学校</view>
      <view class="no_tip_2">你可以自己输入学校名字</view>
    </view>
配置了wx:if,当待渲染列表长度为0时就渲染出现。

三、插件的调用

如何调用插件呢(这是你必须要告知插件使用者的一件事),微信小程序提供的插件模板已经为你配置好了:你只需要在小程序端的app.json中配置plugin的值如下:"choose-school"是插件的名字,provider填写插件的appId,version是版本号(开发时使用的是dev,但正式版需要正式的版本号)

  "plugins": {
    "choose-school": {
      "version""dev",
      "provider""wxddd52601ccb94739"
    }
  }
如果插件中还使用了自定义组件,小程序端的对应页面的json中也需要配置对应的usingComponents,我这个插件是没有用到自定义组件的。

小程序端(也就是插件的使用者)该如何进入插件页面呢?进入插件有两种方法,一种是wxml中的navigator组件,模板中自带,你只需要改动一下跳转的路径即可,如下图:
<navigator id="nav" url="plugin://choose-school/chooseSchool">
  Go to Plugin page
</navigator>

另一种方法是使用wx.navigateTo,我比较推荐这一种方法,因为我是用这种方法才能拿到回传。如下所示,你只要把navigateTo绑定在任意一个组件的事件上就行,它需要配置两个参数,url需要按插件的规则配置:plugin: // + 插件名 + 插件页面。events需要配置acceptDataFromOpenedPage这个参数以获取返回值。

    wx.navigateTo({
      url'plugin://choose-school/chooseSchool',
      events: {
        // 监听返回数据
        acceptDataFromOpenedPage: function(res) {
          console.log('回调成功:',res)
          that.setData({
            school:res.data
          })
        },
      },
    })


到这一步,插件的调用就结束了,下面是获取它的返回值。

四、插件的返回

当插件的业务逻辑和调用都准备就绪时,这个时候最关键的一步来了,小程序调用你的插件后,总是要获取返回值的,那如何传递这个值呢?

微信官方给我们提供了EventChannel这个路由方法,它是页面间事件通信通道。我们在插件页面的学校view上绑定一个点击事件choose,点击后获取该学校的数据并返回给上一个页面,如下图所示:

  choose(e){
    var item = e.currentTarget.dataset.item
    var school = this.data.school
    school.name = item.name
    school.is985 = item.is985
    school.is211 = item.is211
    this.setData({
      school:school
    })
    const eventChannel = this.getOpenerEventChannel()
    eventChannel.emit('acceptDataFromOpenedPage', {data: school});
    wx.navigateBack({
      delta: 1,
    })
  },

想要将值返回,就新建一个通信信道eventChannel,并且用它发射(emit)一次数据给小程序端开放的信道监控事件acceptDataFromOpenedPage,并把数据school作为data的值传入。然后再调用navigateBack返回小程序端,传值完毕。

五、本插件的实机调用

11.8号我的插件就通过审核啦,我用另一款我已上线的小程序作为例子,给大家分享一下如何调用“学校选择器”。

第一步:登录小程序后台——设置——第三方设置

第二步:点击添加插件,搜索“高校选择器”,点击添加,即可发送申请

第三步:等待申请审核通过(是我审核,如果我没有及时通过,你可以直接私信我)

第四步:点击“详情”——开发文档,查看插件的使用说明

第五步:插件申请通过后,在小程序app.json里面如下配置:(version需要填写1.0.1)(provider一定是填我的插件id:wxddd52601ccb94739,不是小程序的appId),插件名字写“choose-school”(我甚至忘了是在哪里设置这个名字的,以至于我都改不了)

"plugins": {
  "choose-school": {
    "version": "1.0.1",
    "provider": "wxddd52601ccb94739"
  }
},

第六步:打开开发者工具的详情,查看插件信息里是否有“高校选择器”,如果没有就重启一下开发者工具

第七步:在任意地方绑定如图函数,函数触发后就会跳转到插件,选择学校后数据可回调到res里。

wx.navigateTo({
  url: 'plugin://choose-school/chooseSchool',
  events: {
    // 监听返回数据
    acceptDataFromOpenedPage: function(res) {
      console.log('回调成功:',res)
    },
  },
})

第八步:测试是否能拿到回调。

第九步:上线使用~,有任何建议都可以在任何联系到我的地方反馈,我会及时回复!

六、项目源码

组件的源码放在了Gitee上,欢迎下载。

https://gitee.com/cao-mengliang98/school/tree/master

七、其他

如果你想用自己的呈现方式,甚至不使用在微信小程序上,你可以通过这个url来获得学校的logo:<a href="http://www.ming13.cn:5000/schoolImages/" rel="noopener noreferrer" style="color: rgb(16, 174, 255);" target="_blank">http://www.ming13.cn:5000/schoolImages/</a><span style="color: rgb(16, 174, 255);">学校的名字.jpg</span> 不要漏掉.jpg,这是我个人的服务器,个人开发者可以直接使用。以及从源码仓库中获取学校名单.xlxs<span style="font-size: 16px;">。</span>

(logo和名字均暂时只有985211高校,后续会补充完整国内高校)

 

6 回复

写的真好! 通俗易懂

棒棒棒!!很透彻讲得

先码住了😀

太强了,码住先

码下来!真的很棒哟😍

get,感谢分享

回到顶部