wepy--用vantUI 實(shí)現(xiàn)上彈列表并選擇相應(yīng)的值操作
vantUI就不多做介紹了,是一個(gè)相對(duì)來說比較好用的ui組件庫,下面是地址大家可以自己去看看:
https://youzan.github.io/vant/#/zh-CN/actionsheet
接下來我們直接進(jìn)入正題,在這個(gè)demo當(dāng)中我是將這個(gè)彈出層封裝成為一個(gè)組件,來供定義的頁面去調(diào)用的,所以我們首先要做的就是先定義一個(gè)頁面,在定義一個(gè)組件:下面是代碼:
<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="關(guān)聯(lián)公眾號(hào)" icon="add-o" >
已關(guān)注
</van-cell>
</block>
<block wx:else>
<van-cell title="關(guān)聯(lián)公眾號(hào)" 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="請(qǐng)輸入您的真實(shí)姓名" placeholder-class="place" name="realName" value="{{realName}}"
confirm-type="done" />
</view>
<view class="message messageThree">
<view class="label">電話</view>
<input placeholder="請(qǐng)輸入您的電話" placeholder-class="place" name="phone" value="{{phone}}" confirm-type="done" />
</view>
//此處引用的是vant的 cellGroup
//cell可以單獨(dú)使用也可以配合group來使用,只不過不同的是:
//CellGroup可以為Cell提供上下外邊框 其余的屬性值 大家可以自行去官網(wǎng)看他的意思
//title代表的是你的者一行 選擇的主題是什么
//value就是選擇的相應(yīng)的值 在剛開始的時(shí)候可以給一個(gè)默認(rèn)值
// location: {
// id: -1,
// name: '未選擇'
// },
//之后再更具獲取到的值去替換
//@tap是綁定在他上面的方法。這里我主要是用它去invoke來給子組件當(dāng)中的屬性去賦值
<van-cell-group>
<van-cell
title="所在位置"
is-link
value="{{location.name}}"
@tap="popup"
>
</van-cell>
</van-cell-group>
//下面是一個(gè)按鈕,按照提交的狀態(tài)去變化一下按鈕的內(nèi)容
<bolck>
<button form-type='submit' class="submit">{{submit ? '重新提交': '提交'}}</button>
</bolck>
</form>
</view>
</view>
//下面這個(gè)就是我定義的選擇組件 傳遞了兩個(gè)值 showPopup來控制顯示還是不顯示
//setLocationId則是用來給父組件傳遞信息的方法
//在這里需要注意的是 根據(jù)值傳遞的方向 是有不同的傳遞方法的 大家可以去參閱我的另一篇博客 寫了傳
//遞值的幾種方式
<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是我粉裝的用來請(qǐng)求后端接口的方法
import { request } from '../utils/util';
//在這里首先引入組件,但是引入之后別忘了在地下聲明
import chooseSchoolPopup from '../components/chooseSchoolPopup';
//我們根據(jù)page去定義一個(gè)頁面
export default class UserInfo extends wepy.page {
//這里就是將你引入的組件做了聲明
components = {
chooseSchoolPopup: chooseSchoolPopup,
};
//定義一些頁面所用到的數(shù)據(jù)
data = {
active: 4,
localUser: {},
saLogined: false,
phone: '',
realName: '',
submit: false,
location: {
id: -1,
name: '未選擇'
},
showPopup: true,
location_id:null
};
//這個(gè)則是定義頁面的一些屬性,以及將頁面所要用到的ui組件導(dǎo)入進(jìn)來
//這里需要注意的是,在父組件當(dāng)中引入的組件,在子組件當(dāng)中依舊是可以用的
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當(dāng)中我們同樣在最初加載頁面的時(shí)候去獲取一遍
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 = {
//這個(gè)方法就是用來子組件向父組件傳值的,將組件里選擇條目的整條信息傳遞過來
//我們賦值給頁面的參數(shù),然后再頁面上面去顯示出來
//注意 若是你的方法是同步的,則組要手動(dòng)去調(diào)用this.$apply();才能將值賦值給變量
setLocationId(e){
console.log('setLocationId',e)
this.location_id =e.id
this.location = e
},
//這個(gè)方法則是用來調(diào)用子組件內(nèi)的方法,去給子組件的屬性賦值
//用的就是invoke方法 ,
//第一個(gè)參數(shù)是你要往那個(gè)組件里面賦值,第二個(gè)是,相應(yīng)組件里面的方法是什么,
//當(dāng)然再這里我是直接再子組件當(dāng)中去賦值的,所以這里沒有去傳遞任何的值
//你可以傳遞一個(gè)或者是多個(gè)的值,只要再相應(yīng)的方法當(dāng)中去接受即可
popup() {
this.$invoke('chooseSchoolPopup', 'onPopup');
},
//這是一個(gè)提交form表單里面內(nèi)容的方法
async formSubmit(e) {
var value = e.detail.value;
console.log('formSubmit', e.detail);
var params = {
realName: value.realName,
//這個(gè)id就是再子組件當(dāng)中傳遞出來的值
location_id: this.location_id,
phone: value.phone
};
console.log('formSubmit',params)
//調(diào)用我后端編寫的方法去提交
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>
以上就是定義頁面的及其屬性方法的代碼,下面我們來看一下相應(yīng)組件的代碼:
<template>
//同樣我們先去定義模板
//showPopup 就是傳遞進(jìn)來控制顯示與不顯示的值
//onclose方法則是主動(dòng)關(guān)閉彈出層
//position控制的則是從底部彈出
<van-popup show="{{ showPopup }}" bind:close="onPopup" position="bottom">
<van-radio-group value="{{ lastSchool.id }}">
<van-cell-group>
//對(duì)賦值的數(shù)組進(jìn)行遍歷
<repeat for="{{ locationList }}">
//定義一個(gè)點(diǎn)擊之間去調(diào)用我們?cè)俑附M件當(dāng)中綁定定義的向外傳遞參數(shù)的方法,將括號(hào)當(dāng)中的當(dāng)前的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 去定義一個(gè)組件
export default class myTabBar extends wepy.component {
//用props去去聲明頁面所需要的參數(shù),這些值是再父組件調(diào)用子組件的時(shí)候,綁定在組件上面?zhèn)鬟f進(jìn)來的
props = {
lastSchool: {
type: Object,
twoWay: true
}
};
//data則是父組件,或者是調(diào)用后端接口去賦值的屬性
data = {
showPopup: false,
locationList: []
};
onLoad() {
//在這里我是事先將學(xué)校列表存入到緩存當(dāng)中去使用的
//所以這里不會(huì)再去調(diào)用后端的接口 去獲取值
let locationList = wepy.getStorageSync('locationList');
console.log('popup load');
if (locationList) {
this.locationList = locationList;
}
}
methods = {
//這個(gè)方法就是在上面定義的點(diǎn)擊某頭條信息的時(shí)候觸發(fā)的方法,會(huì)將showPopup的邏輯值改變,從而控制
//顯示還是不顯示
onPopup(event) {
console.log('close', event);
this.showPopup = !this.showPopup;
},
//點(diǎn)擊事件則是去向父組件去傳遞值
//用到的就是emit 在這里需要注意的是 若是傳遞一個(gè)組件直接寫上就行,若是傳遞多個(gè)值,則要將其封裝
//成一個(gè)對(duì)象再向外去傳遞相應(yīng)的值
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>
下面我們來看幾張效果圖:
這是沒有選擇時(shí)的情況:

選擇時(shí):

點(diǎn)擊北大之后:

最后提交:提交時(shí)的參數(shù):

以上就是一個(gè)見簡單的,彈出層demo
補(bǔ)充知識(shí):vantUI的sku組件的使用(增加自定義提示信息、自定義按鈕獲取sku的選中值)
最近在做的移動(dòng)電商項(xiàng)目,因?yàn)関antUI開發(fā)商城比較方便,最后決定使用vue結(jié)合vantUI結(jié)合開發(fā),在使用sku組件的時(shí)候遇到了問題,先看一下使用了sku的效果圖,

再來看一下設(shè)計(jì)圖

很明顯少了一句提示,只需要寫一個(gè)插槽來實(shí)現(xiàn)就可以了

最后看一下最終效果

補(bǔ)充:
獲取選中規(guī)格的方法
1、首先給標(biāo)簽添加ref屬性

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

代碼示例如下:

打印結(jié)果:

以上這篇wepy--用vantUI 實(shí)現(xiàn)上彈列表并選擇相應(yīng)的值操作就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
vue 內(nèi)置過濾器的使用總結(jié)(附加自定義過濾器)
這篇文章主要介紹了vue 內(nèi)置過濾器的使用總結(jié)(附加自定義過濾器),詳細(xì)的介紹了各種過濾器的使用,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-12-12
Vue組件Draggable實(shí)現(xiàn)拖拽功能
這篇文章主要為大家詳細(xì)介紹了Vue組件Draggable實(shí)現(xiàn)拖拽功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12
vue中v-for循環(huán)數(shù)組,在方法中splice刪除數(shù)組元素踩坑記錄
這篇文章主要介紹了vue中v-for循環(huán)數(shù)組,在方法中splice刪除數(shù)組元素踩坑記錄,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06
Vue3 elementUI如何修改el-date-picker默認(rèn)時(shí)間
這篇文章主要介紹了Vue3 elementUI如何修改el-date-picker默認(rèn)時(shí)間,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08
vue 全局封裝loading加載教程(全局監(jiān)聽)
這篇文章主要介紹了vue 全局封裝loading加載教程(全局監(jiān)聽),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-11-11
vue項(xiàng)目啟動(dòng)后沒有局域網(wǎng)地址問題
這篇文章主要介紹了vue項(xiàng)目啟動(dòng)后沒有局域網(wǎng)地址問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09
ElementUI+命名視圖實(shí)現(xiàn)復(fù)雜頂部和左側(cè)導(dǎo)航欄
本文主要介紹了ElementUI+命名視圖實(shí)現(xiàn)復(fù)雜頂部和左側(cè)導(dǎo)航欄,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04
vue實(shí)現(xiàn)編輯器鍵盤抬起時(shí)內(nèi)容跟隨光標(biāo)距頂位置向上滾動(dòng)效果
這篇文章主要介紹了vue實(shí)現(xiàn)編輯器鍵盤抬起時(shí)內(nèi)容跟隨光標(biāo)距頂位置向上滾動(dòng)效果,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05

