草庐IT

微信小程序之天气查询小案例

编程搬砖我最强 2023-05-14 原文

本次小项目是关于微信小程序-动态查询天气(墨迹天气Api)

此次案例分为以下几个准备方面:

一.准备方面:

(1)如何发起请求?查看文档:RequestTask | 微信开放文档

(2)如何获取定位信息?查看文档:wx.getLocation(Object object) | 微信开放文档

(3)如何控制页面来实现数据实时渲染?查看文档:Page | 微信开放文档

(4)WXML语法条件参考:WXML | 微信开放文档

(5)墨迹天气api提供:https://autodev.openspeech.cn/csp/api/v2.1/weather

(6)对微信开发者工具的设置:查看下图:

 

二.当前页面的js代码解析(从内向外解析):

定义第一个函数,向墨迹天气api发起请求,并获取天气数据

>形参:location-存放定位信息(经纬度),city-查询的城市,sFun-请求成功的回调函数

 //获取天气(含api)
 function sendtemp(location, city, sFun) {
    //测试
    console.log(`https://autodev.openspeech.cn/csp/api/v2.1/weather?${city == ""?"":'city='+city+"&"}${location.latitude == ""?"":"latitude="+location.latitude+"&"}${location.longitude == ""?"":"longitude="+location.longitude+"&"}clientType=android&openId=aiuicus&sign=android`);

    //获取墨迹天气api
    wx.request({
      url: `https://autodev.openspeech.cn/csp/api/v2.1/weather?${city == ""?"":'city='+city+"&"}${location.latitude == ""?"":"latitude="+location.latitude+"&"}${location.longitude == ""?"":"longitude="+location.longitude+"&"}clientType=android&openId=aiuicus&sign=android`,
      success: result => sFun(result),
      header: {
        'content-type': 'application/json' // 默认值
      },
      fail: (err) => {},
      complete: (res) => {},
    })
  }

 定义第二个函数来判断获取天气的方式,并且船舰location对象

>形参:city-查询的城市

作用:如果city为空串,则获取定位查询天气,如果是含有城市名称的字符串,则直接查询天气.

sFun-依然是获取墨迹天气api的成功回调函数

 //判断获取天气的方式(判断是否定位获取?)
  function getWeather(city, sFun) {
    //测试
    console.log(city);
    //创建定位对象
    var location = {
      latitude: "", //纬度
      longitude: "" //经度
    };
    if (city == "") {
      //当没有查询天气则定位获取 or 当查询城市为空时则采取定位获取
      wx.getLocation({
        type: "wgs84",
        success(res) {
          location = res;
          sendtemp(location, city, sFun);
        }
      })
    } else {
      //查询城市天气
      sendtemp(location, city, sFun);
    }
    
  }

 Page对象的设置:

(1)当页面加载时(onload),触发定位获取天气的函数,传入空串的city,以及获取天气成功时的回调函数,也就是上两个函数的sFun,sFun这里的形参result实际上就是获取天气成功之后的数据对象.

---在这里定义sFun的函数,可提高代码的复用性,遵循了高内聚低耦合,大大减少了代码量.

(2)定义表单的提交时的函数:传入带有值或空串的city,回调函数跟之前的一样,如果有特殊的要求,还可以自由改变函数里的代码

--可能有些人会疑问为什么这里不再定义一个函数,来重复使用,提高代码复用性呢?

答:如果要重新定义一个函数,那么在以上每个函数的形参中我们都要传入一个this(这里指的是page本身),用$this来接收,然后在调用回调函数时,把$this传入才可以提高我们的代码复用性,也就是说this要绕一大圈才可以在回调函数中使用,作者认为这样的方式有点奇怪就没有再次提高代码的复用性,如果读者觉得不麻烦的话,其实也可以使用这样的方式.

  Page({

    /**
     * 生命周期函数--监听页面加载
     */
    onLoad: function (options) {
      getWeather("", result => {
        if(result.data.code === 0){
          //code为0时,代表有查询的天气数据
          var res = result.data.data.list[0];
          this.setData({
            code: result.data.code, //用于条件判断
            list: result.data.data.list, //天气列表
            todayWeather: res, //今日天气
          })
        }
      });
    },
    /*
     表单的查询天气函数
    */
    search: function (e) {
      getWeather(e.detail.value.city, result => {
        //code为0时,代表有查询的天气数据
        if(result.data.code === 0){
          var res = result.data.data.list[0];
          this.setData({
            code: result.data.code, //用于条件判断
            list: result.data.data.list, //天气列表
            todayWeather: res, //今日天气
          })
        }
      });
    },
  })

三.这个内容就不做解析了,相信大家学习到这里已经有牢固的前端知识基础了.

(1)wxml:这里多了一些条件渲染还有表单使用的区别,大家可以查看以下两个文档了解一下就可以了

条件渲染:条件渲染 | 微信开放文档

列表渲染:列表渲染 | 微信开放文档

表单使用:form | 微信开放文档

<image src="../../images/beijing.jpeg" class="bg-image"/>
<view class="search">
  <form bindsubmit="search">
    <input type="text" name="city" placeholder="请输入城市"/>
    <button form-type="submit" type="primary" size="mini">查询天气</button>
  </form>
</view>
<view class="main">
  <view class="info" wx:if="{{code===0}}">
    <view class="temp">{{todayWeather.high}}℃</view>
    <view class="lowhigh">空气质量 {{todayWeather.airQuality}}</view>
    <view class="type">{{todayWeather.weather}}</view>
    <view class="city">{{todayWeather.province}} {{todayWeather.city}}
    </view>
    <view class="week">
      {{todayWeather.date}}
    </view>
    <view class="weather">
      {{ todayWeather.wind }}
    </view>
  </view>
</view>
<scroll-view class="list" scroll-x wx:if="{{code===0}}">
  <block wx:for="{{list}}" wx:key="index">
    <view class="item">
      <view>{{item.weather}}</view>
      <view>{{item.high}}℃/{{item.low}}℃</view>
      <view>{{item.date}}</view>
      <view>{{item.airQuality}}</view>
      <view>{{item.wind}}</view>
    </view>
  </block>
</scroll-view>

下附背景图(有水印,作者也没办法去掉.大家如果不想使用的话,可以直接删除含有背景的代码即可.)

(2)wxss: 

.main {
  display: flex;
  width: 100%;
  justify-content: center;
  text-align: center;
  margin-top: 20px;
}
.info view{
  margin-top: 10px;
  font-weight: 300;
}
.info .temp{
  font-weight: 400;
  font-size: 64px;
}
.info .lowhigh{
  font-size: 8px;
}
.info .type{
  font-size: 14px;
}
.info .city{
  font-weight: bold;
}
.info .week,.weather{
  font-size: 10px;
}
.search{
  display: flex;
  padding-top: 50rpx;
  justify-content: center;
}
.search form input{
  display: inline-block;
  border: 1px solid gray;
  height: 60rpx;
  margin-right: 10rpx;
  padding-left: 10rpx;
  border-radius: 10rpx;
}
.search form button{
  display: inline-block;
}

.list{
  margin-top: 100rpx;
  width: 100%;
  padding-top: 100rpx;
  border-top: 1px solid #cccccc;
  white-space: nowrap;
}

.item{
  display: inline-block;
  width: 30%;
  margin-right: 10rpx;
  text-align: center;
  font-size: 14px;
  line-height: 25px;
  font-family: "微软雅黑";
}
.bg-image{
  position: absolute;
  width: 100%;
  height: 100%;
  z-index: -999;
}

(3)代码的演示:

初步加载时触发

查询天气时触发

(4)预览时有问题可看:微信小程序预览(真机调试)时请求获取不到API数据的解决方案

有关微信小程序之天气查询小案例的更多相关文章

  1. ruby - ECONNRESET (Whois::ConnectionError) - 尝试在 Ruby 中查询 Whois 时出错 - 2

    我正在用Ruby编写一个简单的程序来检查域列表是否被占用。基本上它循环遍历列表,并使用以下函数进行检查。require'rubygems'require'whois'defcheck_domain(domain)c=Whois::Client.newc.query("google.com").available?end程序不断出错(即使我在google.com中进行硬编码),并打印以下消息。鉴于该程序非常简单,我已经没有什么想法了-有什么建议吗?/Library/Ruby/Gems/1.8/gems/whois-2.0.2/lib/whois/server/adapters/base.

  2. ruby-on-rails - 在 Rails 和 ActiveRecord 中查询时忽略某些字段 - 2

    我知道我可以指定某些字段来使用pluck查询数据库。ids=Item.where('due_at但是我想知道,是否有一种方法可以指定我想避免从数据库查询的某些字段。某种反拔?posts=Post.where(published:true).do_not_lookup(:enormous_field) 最佳答案 Model#attribute_names应该返回列/属性数组。您可以排除其中一些并传递给pluck或select方法。像这样:posts=Post.where(published:true).select(Post.attr

  3. 「Python|Selenium|场景案例」如何定位iframe中的元素? - 2

    本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决

  4. 微信小程序通过字典表匹配对应数据 - 2

    前言一般来说,前端根据后台返回code码展示对应内容只需要在前台判断code值展示对应的内容即可,但要是匹配的code码比较多或者多个页面用到时,为了便于后期维护,后台就会使用字典表让前端匹配,下面我将在微信小程序中通过wxs的方法实现这个操作。为什么要使用wxs?{{method(a,b)}}可以看到,上述代码是一个调用方法传值的操作,在vue中很常见,多用于数据之间的转换,但由于微信小程序诸多限制的原因,你并不能优雅的这样操作,可能有人会说,为什么不用if判断实现呢?但是if判断的局限性在于如果存在数据量过大时,大量重复性操作和if判断会让你的代码显得异常冗余。wxswxs相当于是一个独立

  5. 计算机毕业设计ssm+vue基本微信小程序的小学生兴趣延时班预约小程序 - 2

    项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU

  6. 微信小程序开发入门与实战(Behaviors使用) - 2

    @作者:SYFStrive @博客首页:HomePage📜:微信小程序📌:个人社区(欢迎大佬们加入)👉:社区链接🔗📌:觉得文章不错可以点点关注👉:专栏连接🔗💃:感谢支持,学累了可以先看小段由小胖给大家带来的街舞👉微信小程序(🔥)目录自定义组件-behaviors    1、什么是behaviors    2、behaviors的工作方式    3、创建behavior    4、导入并使用behavior    5、behavior中所有可用的节点    6、同名字段的覆盖和组合规则总结最后自定义组件-behaviors    1、什么是behaviorsbehaviors是小程序中,用于实现

  7. sql - 查询忽略时间戳日期的时间范围 - 2

    我正在尝试查询我的Rails数据库(Postgres)中的购买表,我想查询时间范围。例如,我想知道在所有日期的下午2点到3点之间进行了多少次购买。此表中有一个created_at列,但我不知道如何在不搜索特定日期的情况下完成此操作。我试过:Purchases.where("created_atBETWEEN?and?",Time.now-1.hour,Time.now)但这最终只会搜索今天与那些时间的日期。 最佳答案 您需要使用PostgreSQL'sdate_part/extractfunction从created_at中提取小时

  8. ruby-on-rails - solr 清理查询 - 2

    我在Rails上使用带有ruby​​的solr。一切正常,我只需要知道是否有任何现有代码来清理用户输入,比如以?开头的查询。或* 最佳答案 我不知道执行此操作的任何代码,但理论上可以通过查看parsingcodeinLucene来完成并搜索thrownewParseException(只有16个匹配!)。在实践中,我认为您最好只捕获代码中的任何solr异常并显示“无效查询”消息或类似信息。编辑:这里有几个“sanitizer”:http://pivotallabs.com/users/zach/blog/articles/937-s

  9. ruby-on-rails - Rails 3 在一个查询中包含多个表 - 2

    我正在为锦标赛开发一个Rails应用程序。我在这个查询中使用了三个模型:classPlayertruehas_and_belongs_to_many:tournamentsclassTournament:destroyclassPlayerMatch"Player",:foreign_key=>"player_one"belongs_to:player_two,:class_name=>"Player",:foreign_key=>"player_two"在tournaments_controller的显示操作中,我调用以下查询:Tournament.where(:id=>params

  10. ruby-on-rails - Sunspot:如何对具有不同值的多个字段进行全文查询? - 2

    我想用sunspot重现以下原始solr查询q=exact_term_text:fooORterm_textv:foo*ORalternate_text:bar*但我无法通过标准的太阳黑子界面理解这是否可能以及如何实现,因为看起来:fulltext方法似乎不接受多个文本/搜索字段参数我不知道将什么参数作为第一个参数传递给fulltext,就好像我通过了"foo"或"bar"结果不匹配如果我传递一个空参数,我得到一个q=*:*范围过滤器(例如with(:term).starting_with('foo*')(顾名思义)作为过滤器查询应用,因此不参与评分。似乎可以手动编写字符串(或者可能使

随机推荐