本篇內容介紹了“Android小程序開發中遇到的問題有哪些”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
渲染列表時用 block 包裹
<block wx:for="{{[1, 2, 3]}}">
<view> {{index}}: </view>
<view> {{item}} </view>
</block>block 不會真實渲染到頁面上,只作為一個包裹元素,接受控制屬性
寫一個自定義組件
自定義組件分為 4 部分
properties 組件接收的屬性
properties: {
// 輸入框的默認提示
placeholder: {
type: String, // 屬性值的類型
value: '' // 屬性默認值
}
},data 組件數據
methods 組件方法,一般內部方法用_開頭
組件的生命周期函數,一般使用 ready,在組件布局完成后執行,此時可以獲取節點信息(使用 SelectorQuery )
調用父組件傳入的方法
// 子組件
var myEventDetail = {value: ''}; // detail對象,提供給事件監聽函數,寫需要傳給外面的數據
var myEventOption = {} // 觸發事件的選項
this.triggerEvent('onclear', myEventDetail, myEventOption)<!-- 父組件 --> <searchbar id="search-bar" bind:onsearch="onSearch" bind:onclear="onSearch" placeholder="搜索文章內容"></searchbar> <!-- 像綁定 bindtap 一樣綁定自定義函數 -->
// 父組件
onSearch(e){
console.log(e.detail.value)
}父組件直接調用子組件的方法
// 父組件,使用 selectComponent 拿到子組件的實例,直接調用其中的方法
let searchBar = this.selectComponent('#search-bar');
searchBar.setData({ value: e.currentTarget.dataset.name })
searchBar.onClickSearch({ detail: {value: e.currentTarget.dataset.name}});子組件中獲取 dom 寬高
// 獲取屏幕寬度
let windowWidth = wx.getSystemInfoSync().windowWidth
// 在組件內部需要寫 this
let query = wx.createSelectorQuery().in(this);
let that = this;
query.selectAll('.tagItem').boundingClientRect()
query.exec(function (res) {
let allWidth = 0;
res[0].map(item=>{
allWidth = allWidth + item.width
return allWidth
})
let length = res[0].length
let ratioWidth = allWidth / windowWidth
that.setData({
allLength: length,
iphone: ratioWidth + (length == 1 ? 0 : res[0].length * 0.0533)
})
})頁面返回時不會調用 onLoad
之前把調用接口的部分寫到了onLoad里,從文章列表進入詳情頁,在從詳情頁點擊左上角回退返回列表頁,列表頁的閱讀數應該更新,但是沒有更新,因為沒有重新調文章列表接口。
所以把調文章列表接口的部分寫好了onShow里。
自定義 tabbar 優化
第一次優化,將組件封裝的tabbar改成頁面的模版形式
1、之前用組件的形式寫的,改為了 template;tabbar 上的圖標都改成的 iconfont,解決點擊 tabbar 時候會閃的問題
<template name="tabbar">
<view class="tabbar-wrapper">
<block wx:for="{{tabbar.list}}" wx:key="item">
<navigator hover-class="none" class="tabbar_nav {{item.selected ?'selected':''}}" url="{{item.pagePath}}" style="color:{{item.selected ? tabbar.selectedColor : tabbar.color}}" open-type="reLaunch">
<view class="tab-item"><text class="{{item.iconPath}}" style="width: {{item.iconWidth}};height: {{item.iconHeight}}"></text>{{item.text}}<text class='red-tag' wx:if="{{tabbar.num && index==1}}">{{tabbar.num > 99 ? '99+' : tabbar.num}}</text></view>
</navigator>
</block>
</view>
</template>2、點擊 tabbar 時,需要銷毀之前的頁面,在跳到需要跳轉的頁面,所以在 navigator 組件用了 reLaunch
第二次優化,將帶有tabbar的頁面都封裝成組件寫在頁面,在頁面中setData切換tab
<homePage id="home-page" wx:if="{{tabbarID == tabbarList.home}}" bind:onclicktab="setTabbar" ></homePage>
<articleLibraryPage id="article-page" wx:if="{{tabbarID == tabbarList.article}}"></articleLibraryPage>
<doclistPage id="doctor-page" wx:if="{{tabbarID == tabbarList.doctor}}"></doclistPage>
<mePage id="me-page" wx:if="{{tabbarID == tabbarList.me}}"></mePage>
<tabbar id="tab-bar" bind:onclick="onClickTabbar" tabbarID="{{tabbarID}}"></tabbar>修改的地方:
帶有tabbar的頁面都重寫為組件形式
因為組件中只有掛載完成后的 ready 方法,所以之前頁面中 onShow,onReachBottom,onPullDownRefresh 都放到父頁面調用
onPullDownRefresh: function () {
if (this.data.tabbarID === this.data.tabbarList.article) {
// 使用 selectComponent 找到組件實例,調用內部方法
let articlePage = this.selectComponent('#article-page');
articlePage.onPullDownRefresh();
} else if (this.data.tabbarID === this.data.tabbarList.doctor){
let doctorPage = this.selectComponent('#doctor-page');
doctorPage.onPullDownRefresh();
} else {
wx.stopPullDownRefresh();
}
},帶來的問題:
每個tabbar都會有下拉刷新的效果,即使不需要下拉刷新
從其他頁面點擊按鈕,直接跳到首頁的某一個tab卡,可能會有問題
使用 iconfont
登錄 iconfont.cn 下載 zip 包
解壓縮,其中的 .ttf 文件在 transfonter.org/ 上面轉成 base64 格式
將 style.css 寫入新建的 iconfont.wxss 中,上面的字體文件路徑用剛剛轉好的 base64 替代
在 app.wxss 中 import iconfont.wxss
注意:組件中的樣式本身不受 app.wxss 影響,因此,組件中需要使用 iconfont 的時候,需要手動引一下 app.wxss 或者 iconfont.wxss
列表的左滑效果
1、在列表的父元素上綁定事件
<view
class="list-container"
wx:for="{{doctorList.list}}"
wx:key="{{index}}"
>
<view
bindtouchstart='onTouchStartListItem'
bindtouchmove='onTouchMoveListItem'
style="{{item.txtStyle}}"
>滑動的內容
</view>
<view class="backCover">滑動后顯示的按鈕</view>
</view>.list-container{
position: relative;
width:100%;
height: 224rpx;
overflow: hidden;
}
.list-item{
position: absolute;
left: 0;
z-index: 5;
transition: left 0.2s ease-in-out;
background-color: #fff;
}
.backCover{
box-sizing: border-box;
width: 200rpx;
height: 218rpx;
position: absolute;
right: 0;
top: 0;
z-index: 4;
}2、通過判斷滑動距離修改列表項的 left 值
onTouchStartListItem: function (e) {
// 是單指觸碰
if (e.touches.length === 1) {
// 記下觸碰點距屏幕邊緣的x軸位置
this.setData({
startX: e.touches[0].clientX,
})
}
},
onTouchMoveListItem: function (e) {
var that = this
if (e.touches.length == 1) {
var disX = that.data.startX - e.touches[0].clientX;
var deleteBtnWidth = that.data.deleteBtnWidth;
var txtStyle = "";
if (disX < deleteBtnWidth / 4) {
txtStyle = "left:0rpx";
} else {
txtStyle = "left:-" + deleteBtnWidth + "rpx";
}
var index = e.currentTarget.id
var list = that.data.doctorList.list
list[index].txtStyle = txtStyle;
that.setData({
doctorList: {
list: list,
total: that.data.doctorList.total
}
})
}
},
onTouchEndListItem: function (e) {
var that = this
if (e.changedTouches.length == 1) {
var endX = e.changedTouches[0].clientX;
var disX = that.data.startX - endX;
var deleteBtnWidth = that.data.deleteBtnWidth;
var txtStyle = disX > deleteBtnWidth / 2 ? "left:-" + deleteBtnWidth + "px" : "left:0px";
var index = e.currentTarget.id
var list = that.data.doctorList.list
list[index].txtStyle = txtStyle;
that.setData({
doctorList: {
list: list,
total: that.data.doctorList.total
}
});
}
},“Android小程序開發中遇到的問題有哪些”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。