当前位置:   article > 正文

微信小程序开发Day02:Swiper组件 导航栏配置 数据绑定 AppData 事件 js模块加载 缓存 列表渲染 Template 跳转页面并传参 页面交互API_swiper-item绑定数据

swiper-item绑定数据

目录

0x00  Swiper组件

0x01 App.json 中关于导航栏,标题的配置

0x02 Page页面与应用程序的生命周期

0x03 数据绑定(核心)(微信是单向绑定)

0x04 数据绑定的运算 与逻辑

0x05 AppData 区域

0x06 事件与事件对象

0x07使用require方法加载js模块文件

0x07 缓存 Storage

异步操作演示案例:

0x08 列表渲染(核心)

0x09 Template模板的使用

0x0A 事件中获取 组件的自定义属性:

0x0B 跳转页面并传参

0x0C 界面交互API

wx.showActionSheet()


 


0x00  Swiper组件

直接设置swiper item 的高度 和 image 的高度是没有用的,因为swiper 将高度写死了,决定轮播图组件高度的标签是swiper,直接设置swiper的高度即可。

swiper-item的高度默认自动充满swiper的高度。swiper-item也是一个容器,swiper-item的内容可以嵌套非常复杂的东西。

  1. <swiper indicator-dots="true" autoplay="true" interval="5000" vertical="true">
  2. <swiper-item>
  3. <image src='/images/1.jpg'></image>
  4. </swiper-item>
  5. <swiper-item>
  6. <image src='/images/2.jpg'></image>
  7. </swiper-item>
  8. <swiper-item>
  9. <image src='/images/3.jpg'></image>
  10. </swiper-item>
  11. </swiper>

注意这里有一个坑:

vertical为true的时候,表示轮播图为纵向轮播图,那么是不是将true改为false,轮播图就变成横向轮播图了呢?其实不然,因为这里的true是用引号引起来的,也就是说并不是布尔类型,而是字符串类型,js中只要字符串有值,就会被转化 bool 值true,所以这里应该改为"" 这样 转化为的布尔值才是false; 也可以使用数据绑定的写法 vertical = '{{false}}'

0x01 App.json 中关于导航栏,标题的配置

页面级别 json配置文件: 直接写,不需要写window,只能配置应用程序级别json配置中,部分window配置项的内容

  1. {
  2. "navigationBarBackgroundColor":"#405f80"
  3. }

应用程序级别json配置,需要些在window中

  1. {
  2. "pages": [
  3. "pages/welcome/welcome",
  4. "pages/posts/posts"
  5. ],
  6. "window": {
  7. "navigationBarBackgroundColor": "#405f80"
  8. }
  9. }

css布局无非两种,要么垂直布局要么 水平布局

0x02 Page页面与应用程序的生命周期

页面的生命周期:

onload 页面加载

onshow 页面显示

onready 页面初次渲染

0x03 数据绑定(核心)(微信是单向绑定)

小程序中无法使用dom操作。(DOM优先的思想)

小程序使用的是数据优先的思想

页面级别的js文件:

  1. /**
  2. * 页面的初始数据
  3. */
  4. data: {
  5. date:"Nov 18 2020",
  6. title:"出售一个二手螃蟹"
  7. },

使用数据:{{date}} {{title}} 注意在属性中使用 不能把引号去掉 例如 src="{{img_url}}" 这样写才是正确的

一般情况下向服务器获取数据的代码写在onLoad中,

this.setData(js对象) 将数据拷贝到data中,下文中数据是对象的形式,所以会将对象中属性添加到data中。

注意这个坑:确保传给setData的是一个js对象

  1. /**
  2. * 页面的初始数据
  3. */
  4. data: {
  5. },
  6. /**
  7. * 生命周期函数--监听页面加载
  8. */
  9. onLoad: function (options) {
  10. var post_content1 = {
  11. date:"Nov 19 2021",
  12. title:"出售一个螃蟹!还活着!",
  13. post_img:"/images/post/crab.png",
  14. content:"出售一个螃蟹!真的还活着!想要的同学联系QQ 2227627947",
  15. view_num:'112',
  16. collect_num:'96',
  17. author_img:'/images/avatar/1.png'
  18. };
  19. this.setData(post_content1);
  20. },

0x04 数据绑定的运算 与逻辑

{{"hello"+date}}

{{a+b+c}} 当abc都是数字时,会进行数学运算

wx:if = "{{condition}}" 条件渲染指令,即某个元素的显示隐藏控制,当condition为true时显示该元素,否则隐藏

wx:for 列表渲染指令 指定数组

wx:for-item 指定数组中每个元素,如果不指定for-item,会默认定义为item

wx:for-index = 'idx' 指定序号 {{idx}} 如果没有指定  默认指定为 index {{index}}

  1. <block wx:for="{{posts_key}}" wx:for-item="item">
  2. <view class="post-container">
  3. <view class='post-author-date'>
  4. <image class='post-author' src='{{item.img.author_img}}'></image>
  5. <text wx:if="{{item.text_condition}}" class='post-date'>{{item.date}}</text>
  6. </view>
  7. <text class='post-title'>{{item.title}}</text>
  8. <image class='post-image' src="{{item.img.post_img}}"></image>
  9. <text class='post-content'>{{item.content}}</text>
  10. <view class='post-like'>
  11. <image src='/images/icon/chat.png' class='post-like-image'></image>
  12. <text class='post-like-font'>{{item.collect_num}}</text>
  13. <image class='post-like-image' src='/images/icon/view.png'> </image>
  14. <text class='post-like-font'>{{item.view_num}}</text>
  15. </view>
  16. </view>
  17. </block>

页面级别的js文件:

  1. onLoad: function (options) {
  2. var posts_content =[
  3. {
  4. date:"Nov 19 2021",
  5. title:"出售一个螃蟹!还活着!",
  6. img:{
  7. post_img:"/images/post/crab.png",
  8. author_img:'/images/avatar/1.png'
  9. },
  10. content:"出售一个螃蟹!真的还活着!想要的同学联系QQ 2227627947",
  11. view_num:'112',
  12. collect_num:'96',
  13. text_condition:true
  14. },
  15. {
  16. date:"Nov 19 2021",
  17. title:"找个妹妹一起看电影",
  18. img:{
  19. post_img:"/images/post/bl.png",
  20. author_img:'/images/avatar/2.png'
  21. },
  22. content:"一起看比利林恩的中场战事,联系QQ 2227627947",
  23. view_num:'112',
  24. collect_num:'96',
  25. text_condition:true
  26. }
  27. ]
  28. this.setData({'posts_key':posts_content});
  29. },

0x05 AppData 区域

在appData区域中可以查看本页面的数据绑定相关的情况

0x06 事件与事件对象

小程序的事件处理机制和web开发基本相同:

  1. 产生事件
  2. 捕捉事件
  3. 回调函数
  4. 处理事件

(1)事件监听的两种方式

bind:tap = "回调函数名" 监听tap事件

catch:tap ="回调函数名"

两者的区别:

除了用bind 还可以用catch ,如果用bind,那么子元素的事件会冒泡到父元素,

如果用catch,则子元素会阻止事件冒泡到父元素

(2)两种页面跳转方式

wx.navigateTo({}) 跳转 ,跳转后有返回按钮

wx.redirectTo({}) 跳转,跳转后没有返回按钮

  1. Page({
  2. onTap:function(){
  3. wx.navigateTo({
  4. url: '/pages/posts/posts',
  5. })
  6. }
  7. })

更深层次的区别:

wx.navigateTo 跳转后 原来的页面 将是 onHide状态,也就说原来的页面只是隐藏了,所以可以返回

wx.redirectTo 跳转后 原来的页面 将是 Unload 状态,也就说原来的页面已经卸载了,所以不能返回

  1. Page({
  2. onTap:function(){
  3. // wx.navigateTo({
  4. // url: '/pages/posts/posts',
  5. // }),
  6. wx.redirectTo({
  7. url: '/pages/posts/posts',
  8. })
  9. },
  10. onUnload:function(){
  11. console.log('welcome Page is Unload');
  12. },
  13. onHide:function(){
  14. console.log('welcome Page is onHide');
  15. }
  16. })

 

alt +shift +f 快速代码格式化

0x07使用require方法加载js模块文件

用于模拟通过api 从后端获取数据

posts-data.js

  1. var local_database = [{
  2. date: "Nov 19 2021",
  3. title: "出售一个螃蟹!还活着!",
  4. img: {
  5. imgSrc: "/images/post/crab.png",
  6. avatar: '/images/avatar/1.png'
  7. },
  8. content: "出售一个螃蟹!真的还活着!想要的同学联系QQ 2227627947",
  9. reading: '112',
  10. collection: '96',
  11. text_condition: true
  12. },
  13. {
  14. date: "Nov 19 2021",
  15. title: "找个妹妹一起看电影",
  16. img: {
  17. imgSrc: "/images/post/bl.png",
  18. avatar: '/images/avatar/2.png'
  19. },
  20. content: "一起看比利林恩的中场战事,联系QQ 2227627947",
  21. reading: '112',
  22. collection: '96',
  23. text_condition: true
  24. },
  25. {
  26. date: "Nov 19 2022",
  27. title: "找我家猫咪",
  28. img: {
  29. imgSrc: "/images/post/cat.png",
  30. avatar: '/images/avatar/2.png'
  31. },
  32. content: "找我家猫咪,联系QQ 2227627947",
  33. reading: '112',
  34. collection: '96',
  35. text_condition: true
  36. },
  37. {
  38. date: "Nov 19 2022",
  39. title: "出售VR眼镜",
  40. img: {
  41. imgSrc: "/images/post/vr.png",
  42. avatar: '/images/avatar/3.png'
  43. },
  44. content: "出售一个VR眼镜,联系QQ 2227627947",
  45. reading: '112',
  46. collection: '96',
  47. text_condition: true
  48. }
  49. ];
  50. module.exports = {
  51. postList:local_database
  52. }

module.exports 导出一个对象,然后在posts.js中就可以通过require来获取到该对象

注意这里只能用相对路径。

  1. var postsData = require('../../data/posts-data.js');
  2. /**
  3. * 生命周期函数--监听页面加载
  4. */
  5. onLoad: function (options) {
  6. this.setData({
  7. 'posts_key': postsData.postList
  8. });
  9. },

0x07 缓存 Storage

微信限制:10MB

wx.setStorageSync('健名', 字符串/对象 ) 设置缓存(同步),如果该健名已经存在则会更新缓存

wx.setStorage() 设置缓存(异步)

如果不主动清除缓存,那么缓存将会一直存在

wx.getStorageSync("键名") 获取缓存

wx.removeStorageSync("键名" ) 删除缓存

wx.clearStorageSync() 清除所有缓存

异步操作演示案例:

  1. getPostCollectedAsy:function(){
  2. var that = this;
  3. wx.getStorage({
  4. key: 'posts_collected',
  5. success:function(res){
  6. var postsCollected = res.data;
  7. var postCollected = postsCollected[that.data.postId];
  8. postCollected = !postCollected;
  9. postsCollected[that.data.postId] = postCollected;
  10. that.showToast(postsCollected, postCollected);
  11. }
  12. })
  13. },

0x08 列表渲染(核心)

0x09 Template模板的使用

模板化编程:实现wxml 和 wxss 的复用

template模板的好处:实现wxml代码 在多个页面之间的复用。将多个页面共用的wxml代码抽离出来,封装在一个template文件中。需要的时候,导入该文件即可。

post-item-template.wxml

name属性用于给模板命名

  1. <template name='postItem'>
  2. <view class="post-container">
  3. <view class='post-author-date'>
  4. <image class='post-author' src='{{item.img.avatar}}'></image>
  5. <text wx:if="{{item.text_condition}}" class='post-date'>{{item.date}}</text>
  6. </view>
  7. <text class='post-title'>{{item.title}}</text>
  8. <image class='post-image' src="{{item.img.imgSrc}}"></image>
  9. <text class='post-content'>{{item.content}}</text>
  10. <view class='post-like'>
  11. <image src='/images/icon/chat.png' class='post-like-image'></image>
  12. <text class='post-like-font'>{{item.collection}}</text>
  13. <image class='post-like-image' src='/images/icon/view.png'> </image>
  14. <text class='post-like-font'>{{item.reading}}</text>
  15. </view>
  16. </view>
  17. </template>

post.wxml

import 导入模板文件

template 使用模板文件 is 指定 使用哪个模板,data用于传递数据给 模板。

技巧:data={{...item}} 将 item对象展开,在模板中就可以直接item中成员变量了

  1. <import src="./posts-item/post-item-template.wxml"/>
  2. <block wx:key="1" wx:for="{{posts_key}}" wx:for-item="item">
  3. <template is="postItem" data='{{item}}'></template>
  4. </block>

同样也可以将多个页面共用的wxss 样式抽离出来,封装到post-item-template.wxss中,需要时在wxss 文件中导入即可

@import "文件路径";

  1. /* pages/posts/posts.wxss */
  2. @import "./posts-item/post-item-template.wxss";
  3. swiper{
  4. width:100%;
  5. height:480rpx;
  6. }
  7. swiper swiper-item image{
  8. width:100%;
  9. height:100%;
  10. }

0x0A 事件中获取 组件的自定义属性:

组件的自定义属性,必须以data开头,然后可以若干个横线连接若干个单词,例如data-id = "{{}}"

<view catch:tap='onPostTap' data-postId="{{item.id}}" ></view>

如何获取到这个属性呢?

  1. onPostTap:function(event){
  2. var postId = event.currentTarget.dataset.postid;
  3. console.log(post);
  4. console.log("onPostTap");
  5. },

event.currentTarget 获取到触发该事件的 组件对象

event.target 和 event.currentTarget的区别

event.target 指的是当前 点击的组件

event.currentTarget 指的是 事件捕获的组件

注意:dataset中 变量的横杠会被去掉,变成小驼峰命名法,例如:data-post-name 就变成了 postName ,data-postId 就变成了postid

前端编写的原则:先静后动,先样式后数据

0x0B 跳转页面并传参

  1. onPostTap:function(event){
  2. var postId = event.currentTarget.dataset.postid;
  3. wx.navigateTo({
  4. url: './post-detail/post-detail?id='+postid,
  5. })
  6. },

接收参数

  1. onLoad:function(option){
  2. var postId = option.id;
  3. var postData = postsData.postList[postId];
  4. this.setData({'postData':postData})
  5. }

0x0C 界面交互API

显示消息提示框

  1. wx.showToast({
  2. "title":"提示内容"
  3. "duration":"消失时间", 默认 1500ms
  4. "icon":"success", 小图标 只支持 success 和 loading
  5. success:function(){
  6. },
  7. fail:function(){
  8. },
  9. complete:function(){
  10. }
  11. })

wx.showModal(Object object)

显示模态对话框

实例代码:

  1. wx.showModal({
  2. title: '提示',
  3. content: '这是一个模态弹窗',
  4. success (res) {
  5. if (res.confirm) {
  6. console.log('用户点击确定')
  7. } else if (res.cancel) {
  8. console.log('用户点击取消')
  9. }
  10. }
  11. })
  1. wx.showModal({
  2. title:"收藏",
  3. content:"确认要收藏该文章?",
  4. showCancel:true,
  5. cancelText:"不收藏",
  6. cancelColor: '#405f80',
  7. confirmText:"收藏",
  8. confirmColor:"#405f30"
  9. })

wx.showActionSheet()

演示案例:

  1. onShareTap: function (event) {
  2. var itemList = [
  3. "分享给微信好友",
  4. "分享到朋友圈",
  5. "分享到微博",
  6. "分享到QQ"
  7. ];
  8. wx.showActionSheet({
  9. itemList: itemList,
  10. itemColor: '#405f80',
  11. success: function (res) {
  12. //res.cancel 用户是不是点击了取消按钮
  13. //res.tapIndex 数组元素的序号
  14. wx.showModal({
  15. title: "用户" + itemList[res.tapIndex],
  16. content:"现在无法实现分享功能!"
  17. })
  18. }
  19. })
  20. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/96959
推荐阅读
相关标签
  

闽ICP备14008679号