在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
wepy.js借鉴了Vue的语法风格和功能特性,对官方提供的框架进行了封装,更贴近于MVVM架构模式,让开发者更加容易上手,增加开发效率。(脏数据处理--是否有标识、是否有响应) 前端开发的对组件化开发应该都都很熟悉,我们就讲精华的部分: 首先我们需要输入下面的命令: npm install wepy-cli -g // 全局安装或更新WePY命令行工具 wepy new myproject // 在开发目录中生成Demo开发项目 cd myproject // 切换至项目目录 npm install // 安装依赖 wepy build --watch // 开启实时编译 完成上面的命令后,你会看到类似下面的目录结构(部分文件夹是本人自己的项目业务需要,学习不需要理会):
目录讲解: --dis 文件夹是微信开发者工具指定的目录(该目录由WePY的build指令自动编译生成,请不要直接修改该目录下的文件) --src 代码编写的目录(该目录为使用WePY后的开发目录) --components wepy组件目录(组件不属于完整页面,仅供完整页面或其他组件引用) --pages wepy页面目录(属于完整页面) --app.wpy 小程序逻辑、公共配置、公共样式 --package.json 项目的package配置 wepy官方文档有五个重要的提示,我们要跟着规则做,不要给自己挖坑。
用于开发的编辑器,个人喜欢vs code。开发者可以根据自己熟悉的编辑器(
1. 在 Code 里先安装 Vue 的语法高亮插件 2. 打开任意 3. 点击右下角的选择语言模式,默认为 4. 在弹出的窗口中选择 5. 在
wepy官方提供了一些代码规范的规则,这里我列出重要的几条: 1.变量与方法尽量使用驼峰式命名,并且注意避免使用 2.事件绑定语法使用优化语法代替。 * 原 * 原 3.事件传参使用优化后语法代替。 原 4.自定义组件命名应避开微信原生组件名称以及功能标签
基于WePY的代码:
export default class Catalog extends wepy.page //通过继承自wepy.page的类创建页面逻辑 methods //事件处理函数(集中保存在methods对象中) components //支持组件化开发如下图
注意:WePY中,在父组件 wepy基于原生进行优化: (使用原生同时最多只能发起5个请求,使用wepy后没有了这个限制) import wepy from 'wepy'; async onLoad() { await wepy.login(); this.userInfo = await wepy.getUserInfo(); }
一个
逻辑部分,除了config对象之外的部分,对应于原生的 配置部分,即config对象,对应于原生的
其中,小程序入口文件 代码如下 <style lang="less" src="page1.less"></style> <template lang="wxml" src="page1.wxml"></template> <script> // some code </script> 各标签对应的
下面具体对脚本进行讲解, 小程序的入口是app.wpy <script> import wepy from 'wepy'; export default class extends wepy.app { config = { "pages":[ "pages/index/index" ], "window":{ "backgroundTextStyle": "light", "navigationBarBackgroundColor": "#fff", "navigationBarTitleText": "WeChat", "navigationBarTextStyle": "black" } }; onLaunch() { console.log(this); } } </script> <style lang="less"> /** less **/ </style> 入口文件 页面page.wpy
<script> import wepy from 'wepy'; import Counter from '../components/counter'; export default class Page extends wepy.page { config = {}; components = {counter1: Counter}; data = {}; methods = {}; events = {}; onLoad() {}; // Other properties } </script> <template lang="wxml"> <view> </view> <counter1></counter1> </template> <style lang="less"> /** less **/ </style> 页面文件
组件com.wpy <template lang="wxml"> <view> </view> </template> <script> import wepy from 'wepy'; export default class Com extends wepy.component { components = {}; data = {}; methods = {}; events = {}; // Other properties } </script> <style lang="less"> /** less **/ </style> 组件文件
通过上面的总结,我们可以知道,小程序被分成三个实例:小程序实例 import wepy from 'wepy'; // 声明一个App小程序实例 export default class MyAPP extends wepy.app { } // 声明一个Page页面实例 export default class IndexPage extends wepy.page { } // 声明一个Component组件实例 export default class MyComponent extends wepy.component { } App小程序实例中主要包含小程序生命周期函数、config配置对象、globalData全局数据对象,以及其他自定义方法与属性。在Page页面实例中,可以通过 Page页面实际上继承自Component组件,即Page也是组件。除扩展了页面所特有的 注意,对于WePY中的methods属性,因为与Vue中的使用习惯不一致,非常容易造成误解,这里需要特别强调一下:WePY中的methods属性只能声明页面wxml标签的bind、catch事件,不能声明自定义方法,这与Vue中的用法是不一致的。示例如下: import wepy from 'wepy'; export default class MyComponent extends wepy.component { methods = { bindtap () { let rst = this.commonFunc(); // doSomething }, bindinput () { let rst = this.commonFunc(); // doSomething }, } //正确:普通自定义方法在methods对象外声明,与methods平级 customFunction () { return 'sth.'; } } 需要特别注意的一点:当需要循环渲染WePY组件时(类似于通过 <template> <!-- 注意,使用for属性,而不是使用wx:for属性 --> <repeat for="{{list}}" key="index" index="index" item="item"> <!-- 插入<script>脚本部分所声明的child组件,同时传入item --> <child :item="item"></child> </repeat> </template> computed计算属性、watcher监听器跟VUE很相似。 // computed data = { a: 1 } // 计算属性aPlus,在脚本中可通过this.aPlus来引用,在模板中可通过{{ aPlus }}来插值 computed = { aPlus () { return this.a + 1 } } // wathcer data = { num: 1 } // 监听器函数名必须跟需要被监听的data对象中的属性num同名, // 其参数中的newValue为属性改变后的新值,oldValue为改变前的旧值 watch = { num (newValue, oldValue) { console.log(`num value: ${oldValue} -> ${newValue}`) } } // 每当被监听的属性num改变一次,对应的同名监听器函数num()就被自动调用执行一次 onLoad () { setInterval(() => { this.num++; this.$apply(); }, 1000) }
Props传值: props传值在WePY中属于父子组件之间传值的一种机制,包括静态传值与动态传值。 在props对象中声明需要传递的值,静态传值与动态传值的声明略有不同,具体可参看下面的示例代码。 静态传值 静态传值为父组件向子组件传递常量数据,因此只能传递String字符串类型。 在父组件 <child title="mytitle"></child> // child.wpy props = { title: String }; onLoad () { console.log(this.title); // mytitle } 动态传值 动态传值是指父组件向子组件传递动态数据内容,父子组件数据完全独立互不干扰。但可以通过使用 注意:下文示例中的 在父组件 // parent.wpy <child :title="parentTitle" :syncTitle.sync="parentTitle" :twoWayTitle="parentTitle"></child> data = { parentTitle: 'p-title' }; // child.wpy props = { // 静态传值 title: String, // 父向子单向动态传值 syncTitle: { type: String, default: 'null' }, twoWayTitle: { type: Number, default: 'nothing', twoWay: true } }; onLoad () { console.log(this.title); // p-title console.log(this.syncTitle); // p-title console.log(this.twoWayTitle); // p-title this.title = 'c-title'; console.log(this.$parent.parentTitle); // p-title. this.twoWayTitle = 'two-way-title'; this.$apply(); console.log(this.$parent.parentTitle); // two-way-title. --- twoWay为true时,子组件props中的属性值改变时,会同时改变父组件对应的值 this.$parent.parentTitle = 'p-title-changed'; this.$parent.$apply(); console.log(this.title); // 'c-title'; console.log(this.syncTitle); // 'p-title-changed' --- 有.sync修饰符的props属性值,当在父组件中改变时,会同时改变子组件对应的值。 }
组件之间的通信:
this.$emit('some-event', 1, 2, 3, 4); import wepy from 'wepy' export default class Com extends wepy.component { components = {}; data = {}; methods = {}; // events对象中所声明的函数为用于监听组件之间的通信与交互事件的事件处理函数 events = { 'some-event': (p1, p2, p3, $event) => { console.log(`${this.$name} receive ${$event.name} from ${$event.source.$name}`); } }; // Other properties }
组件自定义事件处理: 可以通过使用 其中, 目前总共有三种事件后缀:
// index.wpy <template> <child @childFn.user="parentFn"></child> </template> <script> import wepy from 'wepy' import Child from '../components/child' export default class Index extends wepy.page { components = { child: Child } methods = { parentFn (num, evt) { console.log('parent received emit event, number is: ' + num) } } } </script> // child.wpy <template> <view @tap="tap">Click me</view> </template> <script> import wepy from 'wepy' export default class Child extends wepy.component { methods = { tap () { console.log('child is clicked') this.$emit('childFn', 100) } } } </script> 当然,所有人写的总结都是基于自己的理解的,因此,个人觉得无论学什么技术,当自己有一定能力可以阅读官方文档后,最好自己把官方的文档都看一遍,只有这样自己的该门技术才有深入的理解。 官方文档地址:https://tencent.github.io/wepy/document.html#/?id=api 如果你阅读到这里了,说明你是个有追求的人,本人额外附送两个链接 https://github.com/hjkcai/wepy-plugin-axios https://github.com/youzan/zanui-weapp
|
请发表评论