从零开始三天学会微信小程序开发(三)

看到不少入门的小程序开发者不断的问重复性的问题,我们从实战角度开发了这个课程,希望能够帮助大家了解小程序开发。

课程分三天:

第三天:完善我的小程序

(一)如何在页面之间传递参数

1. 传递参数

我们已经实现了首页到内容页面之间的跳转,但并没有区分到底是从哪个分类跳转过去的。为此,我们还需要从index页面传递分类名到detail页面。

修改index.wxml文件中的navigator组件代码如下:

<navigator style="border-color: {{link.color}};" class="btn" url="/pages/detail/detail?name={{link.name}}" wx:for="{{columnlinks}}" wx:for-item="link">{{link.name}}</navigator>

即,在原来的url尾部加上了"?name={{link.name}"。

2. 接收参数

回到detail.js文件,修改onLoad方法如下:

 onLoad(options) {
    this.setData({
      name:options.name
    })
  },

options对象会存放从上一个页面传递过来的参数,在这里options.name就是index页面传递过来的分类名,我们通过this.setData()方法把它绑定到name这个变量中去。

现在你在detail.wxml文件中加上{{name}},可以看到分类名成功地传递过来了。

(二)获取一条评语内容

从Comment评语内容表的设计和数据添加我们可以看到,每个分类下都有很多的评语,而我们这个小程序每次只需要显示其中一个。所以,我们需要编写一个从Comment表指定分类中获取一条记录的代码。

  • 首先,在detail.js的数据初始化代码中定义一个index变量,初始值为0,表示要获取的那条数据在Comment表指定分类中属于第几条。代码如下:

    data: {
    index:0
    },

  • 接着,在onLoad()方法中编写如下的代码:

    onLoad(options) {
    this.setData({
    name:options.name,
    content:''
    })

      const query = wx.Bmob.Query("Comment");
      query.equalTo("categoryname","==",this.data.name);
      query.skip(this.data.index)
      query.limit(1)
      query.find().then(res => {
        this.setData({
          content:res[0].content,
          index:this.data.index + 1
    
        });
      })
    },
    

这里需要说明几点:

  1. query.equalTo方法是Bmob SDK提供的条件查询方法。在这个例子中,我们要查询的条件是categoryname字段的值等于this.data.name(传递过来的分类名)的值。注意:这里用的是==号,而不是=号。

  2. query.skip(m)和query.limit(n)方法经常配合一起使用,skip方法表示跳过前面m条数据,limit方法表示最多获取n条数据。

  3. this.setData绑定数据的时候别忘记了index:this.data.index+1,表示我们接下来要获取的是下一条数据。

现在,数据已经获取到了,我们还要把它呈现在界面中。修改detail.wxml文件,代码如下:

<textarea value="{{content}}" class="txt"></textarea>
<view class="row-btn">
  <button class="bt">换一个</button>
  <button class="bt">复制</button>
  <button class="bt">分享</button>
</view>

修改dtail.wxss文件,给组件添加样式,代码如下:

page{
  padding: 20rpx;
}
.txt{
  width: 95%;
  height: 30vh;
  border-radius: 16rpx ;
  background: rgb(240, 240, 240);
  box-sizing: border-box;
  padding: 20rpx;
}
.row-btn{
  display: flex;
  justify-content:space-between;
  margin-top: 20rpx;
  margin-right: 20rpx;
}
.bt{
  color: white;
  width: 100px !important;
  background-color: green;
  margin-right: 10rpx;
}

这里需要了解的是,page样式是针对整个页面的。比如,这里通过padding: 20rpx控制页面内部的组件离边框20rpx。

完成后预览的效果如下:

(三)封装成一个方法

现在,点击"换一个"按钮,textarea的内容并不会有任何变化,我们还需要给这个按钮添加点击事件。

打开detail.js文件,添加getContent()方法,并在onLoad()方法中用this.getContent()调用这个方法。代码如下:

onLoad(options) {
    this.setData({
      name:options.name,
      content:''
    })
    this.getContent();
  },

  getContent(){
    const query = wx.Bmob.Query("Comment");
    query.equalTo("categoryname","==",this.data.name);
    query.skip(this.data.index);
    query.limit(1);
    query.find().then(res => {
      this.setData({
        content:res[0].content,
        index:this.data.index + 1
      });
    });
  },

这里需要说明的是:

  1. getContent()方法是我们自定义的方法,名称可以改变。

  2. getContent()方法可以放在detail.js文件里面和onLoad()、onReady()等方法同级的任何地方。

  3. 不要漏掉getContent(){ }, 这个方法最后的英文逗号。

(四)给"换一个"按钮绑定方法

现在,我们可以给"换一个"按钮绑定(bind:tap)刚写的getContent方法。修改detail.wxml文件如下:

<button class="bt" bind:tap="getContent">换一个</button>

现在点击"换一个"按钮,已经会不断切换评语内容。

(五)学会看调试器

我们点击多几次之后,会发现页面内容一直保持不变。

观察开发工具中的"调试器",看到下面的错误提示信息:

这是因为我们已经翻看到这个分类下的最后一条记录了。为了解决这个问题,需要简单修改getContent()方法:

getContent(){
    const query = wx.Bmob.Query("Comment");
    query.equalTo("categoryname","==",this.data.name);
    query.skip(this.data.index);
    query.limit(1);
    query.find().then(res => {
      if(res.length<=0){
        this.setData({
          index:0
        })
        this.getContent()
      }
      else{
        this.setData({
          content:res[0].content,
          index:this.data.index + 1
        });
      }
    });
  },

即,查询结果回来之后,我们先判断这个结果是否有内容。如果没有的话,设置index为0,并再次获取。

为了让界面效果更具有动感,我们还可以和之前一样,在请求时加上wx.showLoading()和wx.hideLoading()方法。这个自行尝试添加。

(六)实现更多的功能(复制、分享和客服)

为了实现复制的功能,我们像上面一样,添加一个copy()方法,代码如下:

opy(){
    wx.setClipboardData({
      data: this.data.content,
    })
  },

这个代码很容易理解,即把this.data.content的内容复制到剪切板中去。

我们再把copy()方法绑定到"复制"按钮中去:

<button class="bt" bind:tap="copy">复制</button>

完成之后,预览效果如下:

小程序还内置了其他的方法,让我们不需要编写额外的代码,下面我们给"分享"按钮绑定内置的分享功能:

<button class="bt" open-type="share">分享</button>

预览效果如下:

联系"客服"的事件和分享的事件类似,代码如下:

<button open-type="contact" class="bt">客服</button>

(七)如何选择小程序的开发主题

开发并不难,只要你肯耐心点,花时间按这个课程的步骤一步一步去实践,很快就会掌握小程序开发的经验。

等你掌握好小程序开发技术,可能会更让你困惑的是:我应该选择什么样的开发主题?中国人口那么多,为什么我开发出来的应用没有人用?

这是因为我们开发产品前没有好好地进行调研。这里,我们推荐一个小程序:微信指数。

当你有一个好想法或者想给小程序取名的时候,建议打开这个小程序,查看和你想法相关的各种关键词对应的指数热度。如果指数热度很低,那你就要好好审视你这个想法或者名字到底是不是一个好的创意,好的名字。在一个很多鱼的大池塘里面钓鱼,虽然钓的人多,但机会也更多。在一个连小鱼小虾都没有几个的野池塘,虽然没有什么人来竞争,但你也很难钓到鱼。

我们的课程到此为止,有任何问题欢迎大家一起交流技术(wechat: xiaowon12),享受写程序的乐趣。

源码请查看:https://gitee.com/zhang-ming-123/threedaystudyminiprogram

相关推荐
然后就去远行吧20 分钟前
小程序配置文件 —— 14 全局配置 - tabbar配置
小程序·apache
Kika写代码1 小时前
【微信小程序】4|搜索框-历史搜索 | 我的咖啡店-综合实训
前端·微信小程序·小程序·notepad++
橘子海全栈攻城狮3 小时前
【源码+文档+调试讲解】电影交流平台小程序
java·开发语言·servlet·微信小程序·小程序
陶然同学3 小时前
【小程序】wxss与rpx单位以及全局样式和局部样式
java·微信小程序·小程序
丁总学Java3 小时前
要查询 `user` 表中 `we_chat_subscribe` 和 `we_chat_union_id` 列不为空的用户数量
数据库·mysql·微信小程序
罗_三金4 小时前
微信小程序打印生产环境日志
javascript·微信小程序·小程序·bug
杨天天.4 小时前
微信小程序原生,tdesign时间选择器,t-date-time-picker封装成组件,开始时间结束时间
微信小程序·小程序·tdesign
Bruce_Liuxiaowei19 小时前
农历节日倒计时:基于Python的公历与农历日期转换及节日查询小程序
python·小程序·节日
然后就去远行吧1 天前
小程序基础 —— 02 微信小程序账号注册
微信小程序·小程序
爱吃鱼的酱酱仔1 天前
uniapp实现APP、小程序与webview页面间通讯
小程序·uni-app