溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Android小程序開發(fā)中遇到的問題有哪些

發(fā)布時間:2022-02-08 10:34:33 來源:億速云 閱讀:167 作者:iii 欄目:移動開發(fā)

本篇內(nèi)容介紹了“Android小程序開發(fā)中遇到的問題有哪些”的有關(guān)知識,在實(shí)際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

渲染列表時用 block 包裹

<block wx:for="{{[1, 2, 3]}}">
  <view> {{index}}: </view>
  <view> {{item}} </view>
</block>

block 不會真實(shí)渲染到頁面上,只作為一個包裹元素,接受控制屬性

寫一個自定義組件

自定義組件分為 4 部分

  • properties 組件接收的屬性

properties: {
  // 輸入框的默認(rèn)提示
  placeholder: {
	type: String,  // 屬性值的類型
	value: ''      // 屬性默認(rèn)值
  }
},
  • data 組件數(shù)據(jù)

  • methods 組件方法,一般內(nèi)部方法用_開頭

  • 組件的生命周期函數(shù),一般使用 ready,在組件布局完成后執(zhí)行,此時可以獲取節(jié)點(diǎn)信息(使用 SelectorQuery )

調(diào)用父組件傳入的方法

// 子組件
var myEventDetail = {value: ''}; // detail對象,提供給事件監(jiān)聽函數(shù),寫需要傳給外面的數(shù)據(jù)
var myEventOption = {} // 觸發(fā)事件的選項(xiàng)
this.triggerEvent('onclear', myEventDetail, myEventOption)
<!-- 父組件 -->
<searchbar id="search-bar" bind:onsearch="onSearch" bind:onclear="onSearch" placeholder="搜索文章內(nèi)容"></searchbar>
<!-- 像綁定 bindtap 一樣綁定自定義函數(shù) -->
// 父組件
onSearch(e){
  console.log(e.detail.value)
}

父組件直接調(diào)用子組件的方法

// 父組件,使用 selectComponent 拿到子組件的實(shí)例,直接調(diào)用其中的方法
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
// 在組件內(nèi)部需要寫 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)
	})
})

頁面返回時不會調(diào)用 onLoad

之前把調(diào)用接口的部分寫到了onLoad里,從文章列表進(jìn)入詳情頁,在從詳情頁點(diǎn)擊左上角回退返回列表頁,列表頁的閱讀數(shù)應(yīng)該更新,但是沒有更新,因?yàn)闆]有重新調(diào)文章列表接口。

所以把調(diào)文章列表接口的部分寫好了onShow里。

自定義 tabbar 優(yōu)化

第一次優(yōu)化,將組件封裝的tabbar改成頁面的模版形式

1、之前用組件的形式寫的,改為了 template;tabbar 上的圖標(biāo)都改成的 iconfont,解決點(diǎn)擊 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、點(diǎn)擊 tabbar 時,需要銷毀之前的頁面,在跳到需要跳轉(zhuǎn)的頁面,所以在 navigator 組件用了 reLaunch

第二次優(yōu)化,將帶有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的頁面都重寫為組件形式

  • 因?yàn)榻M件中只有掛載完成后的 ready 方法,所以之前頁面中 onShow,onReachBottom,onPullDownRefresh 都放到父頁面調(diào)用

onPullDownRefresh: function () {
	if (this.data.tabbarID === this.data.tabbarList.article) {
	  // 使用 selectComponent 找到組件實(shí)例,調(diào)用內(nèi)部方法
	  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都會有下拉刷新的效果,即使不需要下拉刷新

  • 從其他頁面點(diǎn)擊按鈕,直接跳到首頁的某一個tab卡,可能會有問題

使用 iconfont

  • 登錄 iconfont.cn 下載 zip 包

  • 解壓縮,其中的 .ttf 文件在 transfonter.org/ 上面轉(zhuǎn)成 base64 格式

  • 將 style.css 寫入新建的 iconfont.wxss 中,上面的字體文件路徑用剛剛轉(zhuǎn)好的 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}}"
	>滑動的內(nèi)容
	</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、通過判斷滑動距離修改列表項(xiàng)的 left 值

onTouchStartListItem: function (e) {
	// 是單指觸碰
	if (e.touches.length === 1) {
		// 記下觸碰點(diǎn)距屏幕邊緣的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小程序開發(fā)中遇到的問題有哪些”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI