601 小程序阶段7 系统API:网络请求,展示弹窗,页面分享,登录流程,小程序登录演练,open-type的取值,导航返回,界面跳转过传递数据

网络请求 – 基本使用


网络请求 – 代码演练


网络请求 – 请求封装


home.js

// pages/home/home.js
import request from '../../service/network.js'

Page({
  data: {
  },
  onLoad: function (options) {
    // 1.原生的方式发送网络请求
    this.get_data_origin()

    // 2.使用封装的request发送网络请求
    // Promise最大的好处就是防止出现回调地狱
    request({
      url: 'http://123.207.32.32:8000/recommend'
    }).then(res => {
      console.log(res)
    }).catch(err => {
      console.log(err)
    })
  },
  get_data_origin() {
    // 发送网络请求
    // 1.发送最简单的get请求
    // wx.request({
    //   url: 'http://123.207.32.32:8000/recommend',
    //   success: function(res) {
    //     console.log(res)
    //   }
    // })
    // 2.get请求,并且携带参数
    // wx.request({
    //   url: 'http://123.207.32.32:8000/home/data',
    //   data: {
    //     type: 'sell',
    //     page: 1
    //   },
    //   success: function (res) {
    //     console.log(res)
    //   }
    // })
    // 3.post请求,并且携带参数
    // wx.request({
    //   url: 'http://httpbin.org/post',
    //   method: 'post',
    //   data: {
    //     name: 'coderwhy',
    //     age: 18
    //   },
    //   success: function(res) {
    //     console.log(res)
    //   },
    //   fail: function(err) {
    //     console.log(err)
    //   }
    // })
  }
})

network.js

export default function request(options) {
  return new Promise((resolve, reject) => {
    wx.request({
      url: options.url,
      method: options.method || 'get',
      data: options.data || {},
      success: resolve,
      fail: reject
    })
  })
}

// export default function request(options) {
//   return new Promise((resolve, reject) => {
//     wx.request({
//       url: options.url,
//       method: options.method || 'get',
//       data: options.data || {},
//       success: function (res) {
//         resolve(res)
//       },
//       fail: function (err) {
//         reject(err)
//       }
//     })
//   })
// }

展示弹窗


页面分享


home.wxml

<!--pages/home/home.wxml-->
<text class='title'>Hello World</text>
<button size='mini'>按钮</button>

<!-- 1.Toast -->
<button size='mini' bind:tap="handleShowToast">showToast</button>

<!-- 2.Modal -->
<button size='mini' bind:tap="handleShowModal">showModal</button>

<!-- 3.Loading -->
<button size='mini' bind:tap="handleShowLoading">showLoading</button>

<!-- 4.actionSheet -->
<button size='mini' bind:tap="handleShowAction">showAction</button>

<!-- 5.分享按钮 -->
<button size='mini' open-type='share'>分享</button>

home.js

// pages/home/home.js
Page({
  handleShowToast() {
    wx.showToast({
      title: '加载中ing',
      duration: 3000,
      icon: 'loading',
      // image: "/assets/icon/icon.png"
      mask: true,
      success: function() {
        console.log('展示弹窗成功')
      },
      fail: function() {
        console.log('展示弹窗失败')
      },
      complete: function() {
        console.log('完成函数的调用')
      }
    })
  },
  handleShowModal() {
    wx.showModal({
      title: '我是标题',
      content: '我是内容,哈哈哈',
      // showCancel: false, // 是否顯示取消按鈕
      cancelText: '退出', // 取消按钮的文本
      cancelColor: 'red', // 取消按钮的文本顏色
      success: function(res) {
        console.log(res)
        // 判断用戶点击了取消按钮
        if (res.cancel) {
          console.log('用户点击了取消按钮')
        }
        if (res.confirm) {
          console.log('用户点击了确定按钮')
        }
      }
    })
  },
  handleShowLoading() {
    wx.showLoading({
      title: '加载ing',
      mask: true
    })

    setTimeout(() => {
      // 必须手动调用hideLoading才会让loading消失
      wx.hideLoading()
    }, 1000)
  },
  handleShowAction() {
    wx.showActionSheet({
      itemList: ['相册', '拍照'],
      itemColor: 'red', // 文本颜色
      success: function(res) {
        console.log(res)
      }
    })
  },
  onShareAppMessage: function(options) {
    return {
      title: '你好啊, 哈哈',
      // 用户点击分享的小程序,进入到的页面
      path: '/pages/about/about', 
      // 分享的小程序显示的图片,不写就显示当前页面的截图
      imageUrl: 'http://s3.mogucdn.com/mlcdn/c45406/170915_0a93207ci28kelh617k4hh62l65lb_640x960.jpg'
    }
  }
})

登录流程


小程序登录演练


app.js

const TOKEN = 'token'

App({
  // 对象: 小程序关闭掉
  globalData: {
    token: ''
  },
  onLaunch: function () {
    // 1.先从缓冲中取出token
    const token = wx.getStorageSync(TOKEN)

    // 2.判断token是否有值
    if (token && token.length !== 0) { 
      this.check_token(token) // 已经有token,验证token是否过期
    } else { 
      this.login() // 没有token, 进行登录操作
    }
  },
  check_token(token) {
    console.log('执行了验证token操作')
    wx.request({
      url: 'http://123.207.32.32:3000/auth',
      method: 'post',
      header: {
        token
      },
      success: (res) => {
        if (!res.data.errCode) {
          console.log('token有效')
          this.globalData.token = token;
        } else {
          this.login()
        }
      },
      fail: function(err) {
        console.log(err)
      }
    })
  },
  login() {
    console.log('执行了登录操作')
    wx.login({
      // code只有5分钟的有效期
      success: (res) => {
        // 1.获取code
        const code = res.code;

        // 2.将code发送给我们的服务器
        wx.request({
          url: 'http://123.207.32.32:3000/login',
          method: 'post',
          data: {
            code
          },
          success: (res) => {
            // 1.取出token
            const token = res.data.token;

            // 2.将token保存在globalData中
            this.globalData.token = token;

            // 3.进行本地存储
            wx.setStorageSync(TOKEN, token)
          }
        })
      }
    })
  }
})

界面跳转


open-type的取值


redirect:关闭当前页面,跳转到应用内的某个页面。但是不允许跳转到 tabbar 页面,并且不能返回。(不是一个压栈)
switchTab:跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面。(需要在tabBar中定义的)
reLaunch:关闭所有的页面,打开应用中某个页面。(直接展示某个页面,并且可以跳转到tabBar页面)


导航返回


数据传递 – 传递方式分析


数据传递 – 传递过程


代码演练


代码的跳转和返回


home.wxml

<!--pages/home/home.wxml-->
<text class='title'>Hello World</text>
<button size='mini'>按钮</button>

<!-- 1.navigator页面跳转 -->
<!-- 【左上角有后退箭头的后退按钮】 -->
<navigator url='/pages/detail/detail'>跳到详情页</navigator>

<!-- 2.navigator属性: open-type -->
<!-- 【open-type='redirect' :左上角有向上箭头的后退按钮】 -->
<navigator url='/pages/detail/detail' open-type='redirect'>
  跳到详情页(redirect)
</navigator>

<!-- 【open-type='switchTab' : 没有后退按钮】 -->
<navigator url='/pages/about/about' open-type='switchTab'>
  跳到关于页(switchTab)
</navigator>

<!-- 【open-type='reLaunch' :左上角有向上箭头的后退按钮】 -->
<navigator url='/pages/detail/detail' open-type='reLaunch'>
  跳到详情页(reLaunch)
</navigator>

<!-- 3.跳转过程中数据的传递 -->
<!-- 【】在跳转到的页面的js文件中的 onLoad方法的形参options里,保存了传递的数据 -->
<navigator url='/pages/detail/detail?name=why&age=18&height=1.88'>跳到详情页</navigator>
<view>{{title}}</view>

<!-- 4.通过代码进行页面跳转 -->
<button size='mini' bind:tap="handlePushDetail">跳到详情页</button>

home.js

// pages/home/home.js
Page({
  /**
   * 页面的初始数据
   */
  data: {
    title: '哈哈哈'
  },
  handlePushDetail() {
    wx.navigateTo({
      url: '/pages/detail/detail?title=你好啊',
    })

    // 如果open-type='redirect',那么就是 wx.redirectTo。也就是说,每一个open-type,都会有对应的api
    // wx.redirectTo({
    //   url: '',
    // })
  }
})

detail.wxml

<!--pages/detail/detail.wxml-->
<text>pages/detail/detail.wxml</text>

<navigator url='/pages/comment/comment'>跳到评论页</navigator>

<!-- 【点击,返回上一级页面。】 -->
<navigator open-type='navigateBack'>返回</navigator>

<button size='mini' bind:tap="handleBackHome">返回</button>

detail.js

// pages/detail/detail.js
Page({
  // 【options里,保存了传递过来的数据】
  onLoad: function (options) {
    console.log(options)
  },
  // 在 onUnload方法里,修改home页面的数据
  onUnload() {
    // 1.获取首页的页面对象
    // getCurrentPages当前所有栈的页面
    const pages = getCurrentPages()
    const home = pages[pages.length - 2]

    // 2.调用页面对象的setData
    home.setData({
      title: '呵呵呵'
    })
  },
  // 返回home页面
  handleBackHome() {
    // 此时不能用 navigateTo,用navigateTo必须写url
    wx.navigateBack({
      delta: 1
    })
  }
})

posted on 2021-02-09 20:52  冲啊!  阅读(165)  评论(0编辑  收藏  举报

导航