wepy--用vantUI 实现上弹列表并选择相应的值操作


Posted in Javascript onNovember 03, 2020

vantUI就不多做介绍了,是一个相对来说比较好用的ui组件库,下面是地址大家可以自己去看看:

https://youzan.github.io/vant/#/zh-CN/actionsheet

接下来我们直接进入正题,在这个demo当中我是将这个弹出层封装成为一个组件,来供定义的页面去调用的,所以我们首先要做的就是先定义一个页面,在定义一个组件:下面是代码:

<template>
 <view class="container">
  <image src="{{localUser.avatarUrl}}" class="backimg" mode="aspectFill">
   <view class='backimg' style='position:absolute;top:0;height:300rpx;width:100%;'></view>
  </image>
  <view class="touxiang_area">
   <view class="touxiang_view">
    <image src="{{localUser.avatarUrl}}" catchtap="changePic"></image>
   </view>
   <view class='touxiang-text'>
    <text catchtap="changeName" class='name'>{{localUser.nickName}}</text>
   </view>
  </view>
  <view style="margin-top:125px;">
   <van-cell-group>
    <block wx:if="{{saLogined}}">
     <van-cell title="关联公众号" icon="add-o" >
      已关注
     </van-cell>
    </block>
    <block wx:else>
     <van-cell title="关联公众号" icon="add-o" url="/pages/authPage" is-link>
     </van-cell>
    </block>
 
    <van-cell title="编辑" icon="edit"></van-cell>
   </van-cell-group>
  </view>
  <view class="body">
   <form bindsubmit="formSubmit">
    <view class="message messageTwo">
     <view class="label">姓名</view>
     <input placeholder="请输入您的真实姓名" placeholder-class="place" name="realName" value="{{realName}}"
         confirm-type="done" />
    </view>
    <view class="message messageThree">
     <view class="label">电话</view>
     <input placeholder="请输入您的电话" placeholder-class="place" name="phone" value="{{phone}}" confirm-type="done" />
    </view>
//此处引用的是vant的 cellGroup
//cell可以单独使用也可以配合group来使用,只不过不同的是:
//CellGroup可以为Cell提供上下外边框 其余的属性值 大家可以自行去官网看他的意思
//title代表的是你的者一行 选择的主题是什么 
//value就是选择的相应的值 在刚开始的时候可以给一个默认值
// location: {
 //    id: -1,
 //    name: '未选择'
 //  },
 
//之后再更具获取到的值去替换
//@tap是绑定在他上面的方法。这里我主要是用它去invoke来给子组件当中的属性去赋值
    <van-cell-group>
     <van-cell
      title="所在位置"
      is-link
      value="{{location.name}}"
      @tap="popup"
     >
     </van-cell>
     </van-cell-group>
 //下面是一个按钮,按照提交的状态去变化一下按钮的内容
    <bolck>
 
     <button form-type='submit' class="submit">{{submit ? '重新提交': '提交'}}</button>
    </bolck>
   </form>
  </view>
  
 </view>
//下面这个就是我定义的选择组件 传递了两个值 showPopup来控制显示还是不显示
//setLocationId则是用来给父组件传递信息的方法
 
//在这里需要注意的是 根据值传递的方向 是有不同的传递方法的 大家可以去参阅我的另一篇博客 写了传
//递值的几种方式
 <chooseSchoolPopup :show.sync="showPopup" v-on:setLocationId="setLocationId">
 
 </chooseSchoolPopup>
</template>
<script>
 import wepy from 'wepy';
 
 import {
  SYSTEM_INFO,
  USER_INFO,
  TOKEN
 } from '@/utils/constant';
//request是我粉装的用来请求后端接口的方法
 import { request } from '../utils/util';
//在这里首先引入组件,但是引入之后别忘了在地下声明
 import chooseSchoolPopup from '../components/chooseSchoolPopup';
//我们根据page去定义一个页面
 export default class UserInfo extends wepy.page {
//这里就是将你引入的组件做了声明
  components = {
   chooseSchoolPopup: chooseSchoolPopup,
  };
//定义一些页面所用到的数据
  data = {
   active: 4,
   localUser: {},
   saLogined: false,
   phone: '',
   realName: '',
   submit: false,
   location: {
    id: -1,
    name: '未选择'
   },
   showPopup: true,
   location_id:null
  };
//这个则是定义页面的一些属性,以及将页面所要用到的ui组件导入进来
//这里需要注意的是,在父组件当中引入的组件,在子组件当中依旧是可以用的
  config = {
   navigationBarTitleText: '我的',
   usingComponents: {
    'van-cell': '../components/van/cell/index',
    'van-cell-group': '../components/van/cell-group/index',
    'van-row': '../components/van/row/index',
    'van-col': '../components/van/col/index',
    'van-field': '../components/van/field/index',
    'van-popup': '../components/van/popup/index',
   }
  };
//在这里onshow方法我们将用户的基本信息去获取一遍,包括他的位置
  async onShow(){
   let servant = await request('/servant/getSelfInfo');
   this.saLogined = servant.saLogined;
   this.location = servant.location;
   console.log('user onShow', servant);
   this.$apply();
  }
//onload当中我们同样在最初加载页面的时候去获取一遍
  async onLoad() {
   let user = wepy.getStorageSync(USER_INFO);
   this.localUser = user;
   try {
    let servant = await request('/servant/getSelfInfo');
    console.log('user onLoad', servant);
    this.realName = servant.realName;
    this.phone = servant.phone;
    this.location = servant.location ? servant.location.name : null;
    this.saLogined = servant.saLogined;
    this.$apply();
 
   } catch (e) {
    console.error(e);
   }
  }
 
  //来定义一些页面用到的方法
  methods = {
//这个方法就是用来子组件向父组件传值的,将组件里选择条目的整条信息传递过来
//我们赋值给页面的参数,然后再页面上面去显示出来
//注意 若是你的方法是同步的,则组要手动去调用this.$apply();才能将值赋值给变量
   setLocationId(e){
    console.log('setLocationId',e)
    this.location_id =e.id
    this.location = e
   },
//这个方法则是用来调用子组件内的方法,去给子组件的属性赋值
//用的就是invoke方法 ,
//第一个参数是你要往那个组件里面赋值,第二个是,相应组件里面的方法是什么,
//当然再这里我是直接再子组件当中去赋值的,所以这里没有去传递任何的值
//你可以传递一个或者是多个的值,只要再相应的方法当中去接受即可
   popup() {
    this.$invoke('chooseSchoolPopup', 'onPopup');
   },
//这是一个提交form表单里面内容的方法
   async formSubmit(e) {
    var value = e.detail.value;
    console.log('formSubmit', e.detail);
    var params = {
     realName: value.realName,
//这个id就是再子组件当中传递出来的值
     location_id: this.location_id,
     phone: value.phone
    };
    console.log('formSubmit',params)
//调用我后端编写的方法去提交
    try {
     await request('/servant/emdit/self', {
      method: 'POST',
      data: params
     });
     this.submit = true;
     this.$apply();
    } catch (e) {
     console.log(e);
    }
   }
 
  };
 }
</script>
//一下是一些样式 使用的是less分割
<style lang="less">
//这是定义的全局样式,直接引入使用即可
 @import "../style/global";
 
 .body {
  background: white;
  .message {
   margin-top: 10px;
   display: flex;
   width: 100%;
   height: 100px;
   align-items: center;
   border-bottom: 1px solid #e8e8e8;
   justify-content: space-between;
  }
  .label {
   color: #333;
   margin-left: 20px;
   font-size: @font-size-normal;
  }
  .messageOne {
   image {
    height: 80px;
    width: 120px;
    margin-right: 20px;
    /*border-radius: 50%;*/
   }
  }
  input {
   padding-left: 20px;
   /*flex: 1;*/
   color: #333;
   font-size: @font-size-normal;
   text-align: right;
   margin-right: 20px;
   width: 80%;
  }
  .submit {
   position: fixed;
   bottom: 20px;
   left: 36px;
   width: 90%;
   background-color: #ea3333;
   color: #fff;
  }
 }
 
 .container {
  display: flex;
  flex-direction: column;
  box-sizing: border-box;
  overflow-x: hidden;
  overflow-y: hidden;
 }
 
 .backimg {
  height: 250px;
  background: linear-gradient(to bottom, rgba(255, 255, 255, 0.9) 0%, rgba(255, 255, 255, 0.95) 40%, rgba(255, 255, 255, 1) 98%, #FFFFFF 100%);
  overflow: hidden;
  position: absolute;
  top: 0;
  width: 100%;
 }
 
 .touxiang_area {
  height: 250px;
  flex-direction: column;
  align-items: center;
  box-sizing: border-box;
  border-bottom: 10px solid #e7e7eb;
  width: 100%;
  vertical-align: middle;
  position: absolute;
 }
 
 .touxiang_view {
  display: inline-block;
  width: 35%;
 }
 
 .touxiang_view > image {
  width: 130px;
  height: 130px;
  border-radius: 100%;
  margin-top: 25%;
  margin-left: 25%;
 }
 
 .touxiang-text {
  display: inline-block;
  width: 400px;
  position: absolute;
  top: 40%;
  /* line-height: 60rpx; */
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
 }
 
 .touxiang-text > text {
  font-size: 32px;
 }
 
 .touxiang_area > text {
  margin-top: 20px;
 }
 
 .city {
  /* margin-top:10rpx; */
  padding-bottom: 15px;
  font-size: 30px;
 }
 
 .city > text {
  font-size: 30px;
 }
 
 .name {
  overflow: hidden;
  width: 250px;
  display: inline-block;
  -webkit-line-clamp: 1;
  text-overflow: ellipsis;
  white-space: nowrap;
 }
 
 button::after {
  border: none;
 }
 
 input {
  outline: none;
  border: none;
  list-style: none;
 
 }
</style>

以上就是定义页面的及其属性方法的代码,下面我们来看一下相应组件的代码:

<template>
//同样我们先去定义模板
//showPopup 就是传递进来控制显示与不显示的值
//onclose方法则是主动关闭弹出层 
//position控制的则是从底部弹出
 <van-popup show="{{ showPopup }}" bind:close="onPopup" position="bottom">
  <van-radio-group value="{{ lastSchool.id }}">
   <van-cell-group>
//对赋值的数组进行遍历
    <repeat for="{{ locationList }}">
//定义一个点击之间去调用我们再父组件当中绑定定义的向外传递参数的方法,将括号当中的当前的item
//传递出去
     <van-cell title="{{item.name}}" clickable @tap="onClick({{item}})">
      <van-radio name="{{item.id}}" >
      </van-radio>
     </van-cell>
    </repeat>
   </van-cell-group>
 
  </van-radio-group>
 </van-popup>
</template>
 
<script>
 
 import wepy from 'wepy';
//我们用component 去定义一个组件
 export default class myTabBar extends wepy.component {
//用props去去声明页面所需要的参数,这些值是再父组件调用子组件的时候,绑定在组件上面传递进来的
  props = {
   lastSchool: {
    type: Object,
    twoWay: true
   }
  };
//data则是父组件,或者是调用后端接口去赋值的属性
  data = {
   showPopup: false,
   locationList: []
  };
 
  onLoad() {
 
//在这里我是事先将学校列表存入到缓存当中去使用的
//所以这里不会再去调用后端的接口 去获取值
   let locationList = wepy.getStorageSync('locationList');
   console.log('popup load');
   if (locationList) {
    this.locationList = locationList;
   }
  }
  methods = {
//这个方法就是在上面定义的点击某头条信息的时候触发的方法,会将showPopup的逻辑值改变,从而控制
//显示还是不显示
   onPopup(event) {
    console.log('close', event);
    this.showPopup = !this.showPopup;
   },
//点击事件则是去向父组件去传递值
//用到的就是emit 在这里需要注意的是 若是传递一个组件直接写上就行,若是传递多个值,则要将其封装
//成一个对象再向外去传递相应的值
   onClick(item, e) {
    console.log('item', item, e);
    this.lastSchool = item;
    this.$emit('setLocationId', item);
    this.showPopup = !this.showPopup;
   },
     };
 };
</script>
//下面是一些自定义的样式
<style lang="less">
 @import "../style/global";
 .van-radio__icon--checked{
  color:@theme-color !important;
 }
</style>

下面我们来看几张效果图:

这是没有选择时的情况:

wepy--用vantUI 实现上弹列表并选择相应的值操作

选择时:

wepy--用vantUI 实现上弹列表并选择相应的值操作

点击北大之后:

wepy--用vantUI 实现上弹列表并选择相应的值操作

最后提交:提交时的参数:

wepy--用vantUI 实现上弹列表并选择相应的值操作

以上就是一个见简单的,弹出层demo

补充知识:vantUI的sku组件的使用(增加自定义提示信息、自定义按钮获取sku的选中值)

最近在做的移动电商项目,因为vantUI开发商城比较方便,最后决定使用vue结合vantUI结合开发,在使用sku组件的时候遇到了问题,先看一下使用了sku的效果图,

wepy--用vantUI 实现上弹列表并选择相应的值操作

再来看一下设计图

wepy--用vantUI 实现上弹列表并选择相应的值操作

很明显少了一句提示,只需要写一个插槽来实现就可以了

wepy--用vantUI 实现上弹列表并选择相应的值操作

最后看一下最终效果

wepy--用vantUI 实现上弹列表并选择相应的值操作

补充:

获取选中规格的方法

1、首先给标签添加ref属性

wepy--用vantUI 实现上弹列表并选择相应的值操作

2、在你需要获取规格的事件中直接用this.$refs.(ref的属性值).(官方提供的getSkuData方法)获取就可以了

wepy--用vantUI 实现上弹列表并选择相应的值操作

代码示例如下:

wepy--用vantUI 实现上弹列表并选择相应的值操作

打印结果:

wepy--用vantUI 实现上弹列表并选择相应的值操作

以上这篇wepy--用vantUI 实现上弹列表并选择相应的值操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
(JS实现)MapBar中坐标的加密和解密的脚本
May 16 Javascript
文本域中换行符的替换示例
Mar 04 Javascript
如何判断微信内置浏览器(通过User Agent实现)
Sep 01 Javascript
jquery插件uploadify多图上传功能实现代码
Aug 12 Javascript
js判断手机系统是android还是ios
Mar 07 Javascript
jQuery操作DOM_动力节点Java学院整理
Jul 04 jQuery
react开发教程之React 组件之间的通信方式
Aug 12 Javascript
封装运动框架实战左右与上下滑动的焦点轮播图(实例)
Oct 17 Javascript
Vuex 入门教程
Jan 10 Javascript
vue权限路由实现的方法示例总结
Jul 29 Javascript
JS html事件冒泡和事件捕获操作示例
May 01 Javascript
JavaScript数组常用的增删改查与其他属性详解
Oct 13 Javascript
使用vant的地域控件追加全部选项
Nov 03 #Javascript
vue vant中picker组件的使用
Nov 03 #Javascript
vue-amap根据地址回显地图并mark的操作
Nov 03 #Javascript
ant-design-vue中tree增删改的操作方法
Nov 03 #Javascript
Vue+Vant 图片上传加显示的案例
Nov 03 #Javascript
vant-ui AddressEdit地址编辑和van-area的用法说明
Nov 03 #Javascript
antd中table展开行默认展示,且不需要前边的加号操作
Nov 02 #Javascript
You might like
使用php+xslt在windows平台上
2006/10/09 PHP
php遍历目录viewDir函数
2009/12/15 PHP
关于初学PHP时的知识积累总结
2013/06/07 PHP
Codeigniter实现处理用户登录验证后的URL跳转
2014/06/12 PHP
浅析PHP文件下载原理
2014/12/25 PHP
php+MySQL实现登录时验证登录名和密码是否正确
2016/05/10 PHP
js 实现复制到粘贴板的功能代码
2010/05/13 Javascript
JS获取后台Cookies值的小例子
2013/03/04 Javascript
js 控制页面跳转的5种方法
2013/09/09 Javascript
图片上传插件jquery.uploadify详解
2013/11/15 Javascript
JQuery实现绚丽的横向下拉菜单
2013/12/19 Javascript
JavaScript实现的SHA-1加密算法完整实例
2016/02/02 Javascript
IE下JS保存图片的简单实例
2016/07/15 Javascript
JS实现显示带倒影的图片横排居中放大展示特效实例【测试可用】
2016/08/23 Javascript
Vue使用vue-cli创建项目
2017/09/01 Javascript
Python判断操作系统类型代码分享
2014/11/22 Python
Python字符串处理实例详解
2017/05/18 Python
python生成二维码的实例详解
2017/10/29 Python
Python cookbook(数据结构与算法)找出序列中出现次数最多的元素算法示例
2018/03/15 Python
解决Python print 输出文本显示 gbk 编码错误问题
2018/07/13 Python
对Python中for复合语句的使用示例讲解
2018/11/01 Python
eclipse创建python项目步骤详解
2019/05/10 Python
用django-allauth实现第三方登录的示例代码
2019/06/24 Python
python for和else语句趣谈
2019/07/02 Python
python实现扫雷小游戏
2020/04/24 Python
Java程序员面试题
2013/07/15 面试题
预防传染病方案
2014/06/14 职场文书
2014年党员干部四风问题自我剖析材料
2014/09/29 职场文书
2014教师评职称工作总结
2014/11/10 职场文书
2014年电厂工作总结
2014/12/04 职场文书
教师学期末个人总结
2015/02/13 职场文书
2015年清明节演讲稿范文
2015/03/17 职场文书
撤诉申请怎么写
2015/05/19 职场文书
2016年员工年度考核评语
2015/12/02 职场文书
餐厅开业活动方案
2019/07/08 职场文书
JavaScript实现登录窗体
2021/06/22 Javascript