mingyunyuziyou

纯正商业级应用-微信小程序开发实战--学习总结(上)
一、课程亮点在线api提供数据(因为mock数据没有与服务器交换数据)https://bl.7yue.pro/de...
扫描右侧二维码阅读全文
12
2020/04

纯正商业级应用-微信小程序开发实战--学习总结(上)

一、课程亮点

  1. 在线api提供数据(因为mock数据没有与服务器交换数据)

https://bl.7yue.pro/dev/index.html

http://bl.7yue.pro/dev/index.html

  1. 获取开发者key和设计图

www.7yue.pro

  1. 参考的小程序(可以先根据设计图和小程序自己写代码,然后再看课程对比不同)。

旧岛

  1. 全新开发模式:组件式构建小程序,实现可复用的目的。
  2. 该课程出了套理想的开发结构
  3. 细节的完善

7.大量使用flex布局和ES6(小程序对二者的支持非常好)

二、准备工作

  1. https://mp.weixin.qq.com/ 注册账号(每个邮箱仅能申请一个小程序)

微信公众号分为:服务号、订阅号和企业号(现在叫企业微信,渐渐被小程序替代)

  1. https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html 下载微信web开发者工具
  2. 进入https://mp.weixin.qq.com/ 中的小程序部分,填写小程序相关信息,获得appID,当然不用appID也能开发,但是就不能用开放接口了。
  3. 在微信web开发者工具选中模板创建一个小程序

使用技巧:

①三个部分都可以按来隐藏

②在模拟器上按(中间那个),可以让模拟器悬浮起来。

③在编辑器中按F1可以查看所有的快捷键

④mac快捷键,command + p 跳转文件 command+e 查看最近打开过的文件。window可以在设置=》外观设置=》快捷键=》编辑中查看和设置。Shift+Alt+F格式化代码,Ctrl+P跳转文件,Ctrl+E最近文件。

⑤新建页面的方式

⑥可在导航栏"微信开发者工具"=》"开发者文档"中查看文档。

⑦可以点击工具栏中的预览查看真机上的效果。

  1. 也可以使用vs code写代码,安装minapp插件。(不过微信开发者工具用起来也不错)

三、小程序的基本知识

  1. 小程序的特点:①免安装 ②操作更接近原生APP ③必须在微信中使用。
  2. 访问小程序的方式: ①小程序搜索入口&附近的小程序 ②好友分享、群分享 ③关联公众号 ④第三方的小程序应用商店 ⑤小程序之间互相跳转。
  3. 小程序的四种文件类型:①样式 .wxss (和css写法一模一样)②骨架 .wxml ③业务 .js ④配置 .json(不能注释代码)
  4. 小程序的基本结构:

微信自带的结构

组件化的结构:

自定义文件夹: ① utils: 该文件件主要用于存放全局的一些.js文件,用于全局调用。

四、开发规范

① JS中一致使用反引号 ``或单引号' ' , 不使用双引号。

② WXML、CSS、JSON中均应使用双引号。

五、flex使用指南

  1. 定义:弹性盒子由弹性容器(Flex container)和弹性子元素(Flex item)组成。
  2. 注意点:

① 弹性容器添加display:flex属性后,弹性容器宽度占父元素百分百,高度自适应,即使弹性元素为块状(block),也会从左到右排列显示(inline-block)。

② 当弹性容器flex-direction设置为row-reverse,column-reverse,弹性子元素不仅排列顺序会发生变化,对齐方式也会发生变化。

③ justify-content 属性应用在弹性容器上,把弹性项沿着弹性容器的主轴线(横轴)对齐。

align-items 属性应用在弹性容器上,把弹性项沿着弹性容器的侧轴(纵轴)对齐。

六、小程序组件

  1. 小程序中 image组件默认宽度300px、高度225px,因此需要自己设置宽高,在开发者工具中可直接查看images的大小。(使用rpx单位)
  2. 在iphone6机型下,设备像素比为2,1rpx = 0.5px = 1物理像素,建议使用rpx, rpx可以自适应屏幕的大小,而px不可以。(大部分情况使用rpx,少数情况使用px,比如字体、边框等不需要自适应屏幕大小的情况)。

如果设计图和图片是按照iphone6设计的,可以直接量取长度,然后加上单位rpx即可。

  1. 小程序支持的css选择器远比小程序文档:"框架"=》"WXSS"=>"选择器"列出的多。
  2. 安卓上默认的字体是思源,IOS上默认的字体是苹方。
  3. pages下的每个页面,都被<page></page>包裹,因此可以在app.wxss通过 page {}添加全局样式。设置的极少全局样式可以被page包含的组件所继承。(font、color)。
  4. 事件绑定的写法和组件属性一致,以key="value"的形式,key以bind或者catch开头,然后跟上事件的类型。bind事件绑定不会阻止冒泡事件向上冒泡,catch事件绑定可以阻止冒泡事件向上冒泡(一般就用bind)。
  5. wx.request()是异步的,wx.request(,fail(){},),当网络有问题的时候,会执行fail回调函数。
  6. 在小程序中请求不合法的域名会报错,测试过程可以在"设置"=>"项目设置"中选中“不校验域名“。但最好的方法是在后端设置可以访问该域名。
  7. 在使用import的时候要使用相对路径,不要使用绝对路径和根路径。
  8. 小程序已经支持npm了,在框架=》可用性=》ES6支持情况查看ES6的支持情况。

六: 第8章注意要点

  1. 回调函数剥夺了函数return的能力。

七、遇到的问题

  1. 在自定义组件的attached不能访问properties属性。

原因:自定义组件中properties属性值在attached(包含)之后就可以获取了,data属性在created(包含)之后就可以setData()。

方法一: 在ready生命周期,获取properties的属性值,并赋值给data的属性。(这种方法有时候能获取到数据,有时候不能)

方法二:父组件在给子组件传值时,不要传递整个对象,拆分成单个变量传递。(这样就不用在生命周期访问properties的属性的属性了, 但不适用于方法三的情况)。

<cmp-heart isLike="{{currentItem.like_status}}" count="{{currentItem.fav_nums}}"></cmp-heart>

方法三: 适用于要修改properties中属性的值,再赋值给data,再展示在页面上的情况。(注意!!!因为properties的index是Number类型,因此如果setData({index: val})的话,前面加的'0'将会无效。因此重新设置了一个String类型的data属性_index。)

总结: 千万不要在observer中修改自身属性

Component({
   properties: {
     index: {
       type: Number,
       observer(newVal, oldVal, changedPath) {
          let val = newVal < 10 ? '0' + newVal : newVal
          this.setData({_index: val})
       }
     }
   },

  data: {
    _index:''
  },
})
  1. 小程序 组件中bindtap事件及获取值的方式

xx.wxml 代码:

<view bindtap="bindName" data-id="123"></view>

xx.js 代码:

page({
  data: {
    id: ''
  },
  bindName(e) {
    //获取view组件bindtap事件的值
    var id = e.currentTarget.dataset.id; //123
    //设置值
    this.setData({
      id: id
    })
  }
})
  1. 通过wx.navigatorTo进行页面跳转时,可以通过查询参数传值。
wx.navigateTo({
  url: 'test?id=1'
})

4.<image>上的bindtap没反映

可能是层级太低,设置z-index: 2,点击事件成功响应。

  1. 在wxml布局文件中,直接调用相关特殊符号的转义字符会无效,原因是小程序的text文本控件的decode属性没有打开导致的。
<text decode="{{true}}">{{bookDetail.summary}}</text>
//不要写成下面的格式,true会被误认为是字符串
<text decode="true">{{bookDetail.summary}}</text>
  1. 在请求数据的回调函数之后,访问返回数据的属性失败。回调函数是异步的,后面的代码时同步的,所有访问不到,解决的方法是: 将访问返回数据属性的代码也写在请求数据的函数内部。

比如:

var PopularModel = require('../../models/popularData.js')
var popularModel = new PopularModel()
Page({
  data: {
    currentItem: {},
    index: 8
  },
  onLoad: function(options) {
      popularModel.getLatest(res=> {
      this.setData({
        currentItem: res
      })
    })
    this.setData({
      index: this.data.currentItem.index
    })
  }
})

改成:

var PopularModel = require('../../models/popularData.js')
var popularModel = new PopularModel()
Page({
  data: {
    currentItem: {},
    index: 8
  },
  onLoad: function(options) {
      popularModel.getLatest(res => {
      this.setData({
        currentItem: res,
        index: res.index
      })
    })
  }
})
  1. <text decode="{{true}}">{{content}}</text>,当content中有n时,却没有换行。

原因: <text></text>可以解析n,但是不能解析\n, 服务器返回的数据中的'n"被转换成'\n',同时decode="{{true}}"只对   < > & '    有效。

解决方法:

var BookModel = require('../../models/bookData.js')
var bookModel = new BookModel()
Page({
  data: {
    summary: ''
  },
  onLoad: function (options) {
    bookModel.getBookDetail(options.index, (res)=>{
      this.setData({
        // 这里转换一下
        summary: res.summary.replace(/\\n/g, "\n")
      })
    })
  }
})
  1. 如果一个自定义组件在多处使用,如果在某一个page中不想触发自定义组件上的事件,可以在在该page中,为自定义组件添加read-only="{{true}}"属性。
<!--pages/popular/popular.wxml-->
<cmp-heart read-only="{{true}}"></cmp-heart>
// components/heart/heart.js
Component({
  properties: {
    readOnly: Boolean
  },
  /**
   * 组件的方法列表
   */
  methods: {
    onChangeLike() {
      if (this.properties.readOnly) {
        return
      }
    }
  }
})

例子2: 不让组件上的事件触发的方式,就是page传递给组件变量,通过这个变量,控制组件的事件响应函数不要执行。

// components/navi/navi.js
Component({
 
  properties: {
    //不需要setData(), 因为小程序会合并properties和data
    isFirst: Boolean,
    isLatest: Boolean
  },
  methods: {
    onPrev() {
      if (!this.properties.isFirst) {
        this.triggerEvent('prev', {}, {})
      }
    },
    onNext() {
      if (!this.properties.isLatest) {
        this.triggerEvent('next', {}, {})
      }
    }
  }
})
  1. wx: for 和 v-for用法相同,应该放在循环的元素上。
<div id="app">
  <ul>
    <li v-for="(value, key) in object">
    {{ key }} : {{ value }}
    </li>
  </ul>
</div>

原文链接:https://blog.csdn.net/sinat_31900531/java/article/details/87914039

Last modification:April 12th, 2020 at 12:48 am
If you think my article is useful to you, please feel free to appreciate

Leave a Comment