zoukankan      html  css  js  c++  java
  • 小程序(一)

     慕课网七月七讲师小程序文档:https://course.talelin.com/lin/lin-ui/

    页面结构,app.js和app.json是全局的文件,pages是总组件,index是页面子组件,页面子组件的路劲在app.json中配置,window是全局配置的参数

    在页面组件文件夹中右键鼠标点击新建page,自动新建js, json, wxml, wxss,文件,并且在app.json中会自动引入页面路径,

    小程序的语法
        1)没有DOM
        2)组件化开发
        3)一个页面具有几个文件:4个
            1.wxml    ->    结构
            2.wxss    ->    样式
            3.js    ->    行为    ->wxs
            4.json    ->    配置
        4)全局具有几个文件:
            1.app.js    ->    App(Object)    ->注册小程序,只能在app.js中调用,有且只能调用一次
            2.app.wxss->    全局样式,相同的样式,页面样式会覆盖全局样式
            3.app.json    ->    小程序的配置    ->pages    ->注册页面的路径
            4.project.config.json    ->    项目的配置文件    ->脚手架配置
            5.sitemap.json    ->    配置小程序中所有页面的检索规则

    小程序中数据读取与修改

        /*
          1.数据流向
            1.Vue 单向  双向数据绑定  v-model
            当input框内部的数据被修改时,将data中的数据也修改为相同内容
            :value="msg"  @change="handleChange"
            function handleChange(event){
                let value=event.target.value;
                this.msg=value;
            }
            2.React 单向
            3.小程序  单向
        */
        /*
          2.如何修改状态数据
            1)Vue
              修改:this.msg=234
              读取:this.msg ->  数据代理
            2)React-> 
              修改:this.setState({msg:234})
                setState同步调用,但是效果有可能是同步,有可能是异步
                1.同步
                  定时器+原生事件
                2.异步
                  生命周期函数+合成事件(以驼峰命名法绑定的事件都是合成事件)
              读取:this.state.msg
            3)小程序
              修改:this.setData({msg:234})  ->  setData同步调用,同步修改
              读取:this.data.msg -> 没有数据代理

    wxml语法

    1.     6.1 数据绑定

    a)     6.1.1 初始化数据

             1. 页面.js的data选项中

            

    6.1.2 使用数据

    1. 模板结构中使用双大括号 {{message}}
    2. 注意事项: 小程序中为单项数据流 model ---> view

    6.1.3 修改数据

    1. this.setData({message: ‘修改之后的数据’}, callback)
    2. 特点:

    a)       同步修改: this.data值被同步修改

    b)       异步更新: 异步将setData 函数用于将数据从逻辑层发送到视图层(异步)

             

    事件绑定

    6.2.1 事件分类

    1) 冒泡事件

    a) 定义:冒泡事件:当一个组件上的事件被触发后,该事件会向父节点传递。

    b) 冒泡事件列表:

    https://mp.weixin.qq.com/debug/wxadoc/dev/framework/view/wxml/event.html

    2) 非冒泡事件

    a) 定义:当一个组件上的事件被触发后,该事件不会向父节点传递。

    b) 非冒泡事件:表单事件和自定义事件通常是非冒泡事件

    https://mp.weixin.qq.com/debug/wxadoc/dev/framework/view/wxml/event.html

    6.2.2 绑定事件

    1. bind绑定:事件绑定不会阻止冒泡事件向上冒泡
    <view bindtap="handleTap" class='start_container'>
      <text class='start'>开启小程序之旅</text>
    </view>
    1. catch 绑定: 事件绑定可以阻止冒泡事件向上冒泡
    <view catchtap="handleTap" class='start_container'>
      <text class='start'>开启小程序之旅</text>
    </view>

    冒泡;标准事件机制,分为三个阶段,捕获阶段(由外到内)---》目标阶段(事件原)===》冒泡阶段(由内到外)

    原生阻止冒泡;e.stopPropagation()

    路由跳转

    wx.navigateTo(Object object)

    保留当前页面,跳转到应用内的某个页面。但是不能跳到 tabbar 页面。使用 wx.navigateBack 可以返回到原页面。小程序中页面栈最多十层

    比如,从index页面跳转到log页面,路由路径在app.json中,

    {
      "pages": [
        "pages/index/index",
        "pages/log/log"
      ],

    在index页面中的html中

     <view bindtap="handleParent"  >
      <text   bindtap="handleChild">你在哪里</text>
      </view>

    js代码,点击后,跳转到log页面了,此时index页面还在内存中保存,没有销毁,

    如果是wx.redirectTo函数,则index页面已经销毁了

     
      handleChild(){
        console.log('child')
        wx.navigateTo({
      //此时前面必须加个/,代表根路劲,不然报错 url:
    "/pages/log/log", }) // wx.redirectTo({ // //路必须到根路径找,加个/ // url: "/pages/log/log", // }); },

    小程序生命周期

     /*
      页面首次渲染会触发load,show,ready
      页面实例被卸载(关闭页面,页面左上角点击返回按钮,返回上一个页面),或者wx.redirectTo(), unload会触发,hide不会触发
      页面实例被隐藏(路由跳转到其他页面,wx.navigateTo()),hide触发,unload不触发
      当页面隐藏之后在显示,不会触发load,ready
      */
      /**
       * 生命周期函数--监听页面加载
       */
      onLoad: function (options) {
        this.setData({initData:2})
        console.log('---------------onLoad-----------------');
        // debugger
      },

      /**
       * 生命周期函数--监听页面初次渲染完成
       */
      onReady: function () {
        console.log('---------------onReady-----------------');
      },

      /**
       * 生命周期函数--监听页面显示
       */
      onShow: function () {
        console.log('---------------onShow-----------------');
      },

      /**
       * 生命周期函数--监听页面隐藏
       */
      onHide: function () {
        console.log('---------------onHide-----------------');
      },

      /**
       * 生命周期函数--监听页面卸载
       */
      onUnload: function () {
        console.log('---------------onUnload-----------------');
      },
     
     
     
    用户首次授权以及后续登录免授权
     
    1.必须是button按钮,open-type="getUserInfo"属性可以获得微信授权弹框
     
     bindgetuserinfo,该事件点击拒绝和允许都可以触发,允许,授权成功,拒绝,授权失败,回调函数的参数是用户的信息
    模板中的变量用插值语法
    <view class="indexContainer">
      <image class="avatarImg" wx:if="{{userInfo.avatarUrl}}" src="{{userInfo.avatarUrl}}"></image>
      <button class="avatarImg btn" wx:else open-type="getUserInfo"
      bindgetuserinfo="getInfo">获取头像昵称</button>
      <text class="username">{{userInfo.nickName}}</text>
      <view class="toguigu" bindtap="handleParent">
        <text class="info" bindtap="handleChild">欢迎来到峡谷</text>
      </view>
    js代码,res是用户的情况,userInfo,是微信用户的具体信息
      getInfo(res) {
        console.log(111,res)
        // if (res.detail.rawData) {
        //   // console.log(res.detail.userInfo)
        //   this.setData({ userInfo: res.detail.userInfo });
        // } else {
        //   console.log("获取授权失败");
        // }
      },
     data: {
        msg: '贾静雯女神',
        userInfo:{},
      },
    此时微信授权成功后,刷新下,授权消失了,还的继续授权,我们需要可以让他一次授权通过后,再次进入页面后,自动授权
    此时需要用到

    wx.getUserInfo(Object object)

    调用前需要 用户授权 scope.userInfo。

    自动获取授权
    在onLoad生命函数中添加,
    wx.getUserInfo函数里头可以传一个success成功的回调函数,参数res是获取的用户信息,将它重新赋值给data中的userInfo,
    此时需要用到箭头函数,this指向组件实例
    res的具体信息
    {errMsg: "getUserInfo:ok", rawData: "{"nickName":"MARCO","gender":1,"language":"zh_CN",…cSKDKlDvuB766gbv53npDJQHwDGyofJwjYoQQ5qRLcQ/132"}", userInfo: {…}, signature: "ef306fa6a6f4cc180427e3788999146872c04e80", encryptedData: "TfC+B/UhBVmnoK9CL19ONeIjcha57O3EysD0vuwSu+P26Jxd7t…F5WpdEvWklliyhN6JH3NGYsf2Ao4jiZ37cX0MUesvweMO2lI=", …}
    encryptedData: "TfC+B/UhBVmnoK9CL19ONeIjcha57O3EysD0vuwSu+P26Jxd7toZhT15dFRQ2r5qnYeNKHs5NTU76LvszFMUMRL0WdH0N09IGwxuzaKS5adCHstiJu+VACrgmOw+v4K+g9xHLR4EWnmbK4WRM/zR/nDXnIXusdFlhIa/Ytr3xhh+8XNEG6kC3fssKGLYtOzZpnUlXeXwuHUEvL150zyQq+B3EArqxHjEjIz/iwabs1dtO+I331U+s7rHCj/FSETi/fQb0FRP2ulEw3lrem4pIVoliCwxSJLQiFwV+mCB0FuFZdPA0Flo1AJMbOCc7gO5/NqDkiglJOTGz201VLsbRnB6ZoTPV1J6pWNeETJ03jOstsecSRR3vW2iQG+776yMldIy7yoU210UqfOXRJBz3+wO5MSBZ/5qiOih1qt/JvV7pYue2tgD3N4HgLWF5WpdEvWklliyhN6JH3NGYsf2Ao4jiZ37cX0MUesvweMO2lI="
    errMsg: "getUserInfo:ok"
    iv: "sH+1ZvejBxr/n/Jmndrzig=="
    rawData: "{"nickName":"MARCO","gender":1,"language":"zh_CN","city":"Shenzhen","province":"Guangdong","country":"China","avatarUrl":"https://thirdwx.qlogo.cn/mmopen/vi_32/DZU3YcDibrMV0mnI7x2ibpNIGsr17u1FowvSppWhGbjswicSKDKlDvuB766gbv53npDJQHwDGyofJwjYoQQ5qRLcQ/132"}"
    signature: "ef306fa6a6f4cc180427e3788999146872c04e80"
    userInfo:
    avatarUrl: "https://thirdwx.qlogo.cn/mmopen/vi_32/DZU3YcDibrMV0mnI7x2ibpNIGsr17u1FowvSppWhGbjswicSKDKlDvuB766gbv53npDJQHwDGyofJwjYoQQ5qRLcQ/132"
    city: "Shenzhen"
    country: "China"
    gender: 1
    language: "zh_CN"
    nickName: "MARCO"
    province: "Guangdong"
    __proto__: Object
    __proto__: Object
     wx.getUserInfo({
          success: (res) => {
            this.setData({
              userInfo: res.userInfo,
            });
            // console.log(res)
          },
        });
     
     
     
     
  • 相关阅读:
    select_related与prefetch_related
    settings源码
    Django路由系统
    Django
    Django-下载安装-配置-创建Django项目-三板斧简单使用
    前端相关知识
    xadmin后台管理
    redis数据库
    ❥git❥-----协同开发,冲突解决 合并分支(项目中使用git)
    git的基本使用
  • 原文地址:https://www.cnblogs.com/fsg6/p/13616102.html
Copyright © 2011-2022 走看看