Taro & Vant Weapp
組件實例
this.selectComponent('.classSelector')
引入
Taro
Taro中引入Vant Weapp,不能直接通過第三方NPM
包的形式直接調用。
需要進行以下幾步:
- 在github上找到Vant-weapp下載文件包,將對應的
dist
目錄複製到項目/src/components/vant-weapp
目錄下。 - 在
Pages
對應文件的config.usingComponents
中,配置每個頁面所需要的組件。(無法在app.js
中進行所謂的全局註冊組件。)
config = {
navigationBarTitleText: '首頁',
usingComponents: {
"van-button": "../../components/vant-weapp/button/index",
"van-popup": "../../components/vant-weapp/popup/index"
}
}
- 在使用
Vant-weapp
組件後,taro
構建會自動將相應的組件複製一份到dist/components
下,而Vant-weapp
的組件還依賴工具庫/src/components/vant-weapp/wxs
,該工具庫taro
不會自動複製到dist
中。所以,我們需要修改/config/index.js
文件中的config.copy.patterns
,讓其在編譯時,自動複製到dist
對應目錄下。
copy: {
patterns: [
{
from: 'src/components/vant-weapp/wxs/',
to: 'dist/components/vant-weapp/wxs/'
}
],
options: {
}
},
- 由於
Vant-weapp
的樣式使用的單位是px
,所以會被taro
編譯成rpx
,以便對各個設配進行適配。可以通過修改/config/index.js
文件中的config.weapp.module.pxtransform.selectorBlackList
不讓其單位轉換。
pxtransform: {
enable: true,
config: {
},
selectorBlackList: [
/^.van-.*?$/, // 這裏是vant-weapp中className的匹配模式
]
},
ec-canvas
ec-canvas
是ECharts
的微信小程序版本。
Canvas引起的層級覆蓋問題
canvas
是由客戶端創建的原生組件,而原生組件的層級是最高的,所以頁面中的其他組件無論設置z-index
爲多少,都無法蓋在原生組件上。
所以,如果canvas
和遮罩交互同時存在時,canvas
會在遮罩的上層。
解決方案:
- 在
canvas
外包裹一層結構,通過條件(遮罩的開關)來設置canvas
容器的hidden
屬性。 -
通過
cover-view
、cover-image
自定義組件,cover-view
通過定位,提升層級,可以防止被canvas
覆蓋。- 因爲後插入的原生組件可以覆蓋之前的原生組件,所以,要注意:結構上,
cover-view
一定要在canvas
後邊; - 可以通過
flex
和order
來調整展示順序。 - 只有最外層
cover-view
才支持position: fixed
。
- 因爲後插入的原生組件可以覆蓋之前的原生組件,所以,要注意:結構上,
iconfont
下載到本地,什麼都不要改,放到指定位置。
該資源不會自動拷貝到dist/
文件夾下,所以需要通過修改配置文件拷貝。
copy: {
patterns: [
...
{
from: 'src/assets/fonts/',
to: 'dist/assets/fonts/'
},
...
],
options: {
}
}
然後,在app.js
入口文件中,import './assets/fonts/iconfont.css'
。
注意:開發完,上傳版本的時候,開發者工具
會報告圖標字體文件沒有被打包上傳,然而,可以正常的預覽體驗版。
自定義組件
組件向外傳參
this.triggerEvent(
'eventType',
{
key: value, //這裏定義的鍵值對,在父組件中,通過args.detail.key獲取;
},
{
bubbles: true, //事件屬性:是否冒泡;
capturePhase: true, //事件屬性: 是否可捕獲;
}
)
插槽slot
用法同Vue
。
注意:組件內部對slot
定義的樣式,不起作用。只能在調用組件的位置,對傳入slot
內的結構進行樣式定義。
注意事項
typeof
wx:if
語句中,不能使用typeof
運算符,{{}}
中不能使用typeof
運算符,只能在wxs
中使用。
data初始化賦值
不知道data什麼時機初始化,但,初始化data
的時候,不能使用this
指向當前組件實例(這是this === void 0
),也就是說,data
初始化只能給一個常量。
需要properties
或methods
來初始化data
的時候,只能在生命週期attached
中通過this.setData
更新data
的值。
而且,如果data.fn = this.methodName
,methodName
中如果調用了this
引用,這時this
指向的是data
,所以需要使用data.fn = this.methodName.bind(this)
。
canvas層級最高
參見上述引入ec-canvas
部分。
vant-weapp庫中的popup樣式設置
popup
內容的大小不是由內容撐起來的,需要通過popup
組件的custom-class
定義一個類名,設置width
、height
來定義內容的尺寸。
vant-tree-select事件觸發
在Taro
中的代碼風格類React
,而vant-weapp
庫中的代碼風格爲wxml
和wxs
風格。React
綁定事件是駝峯式,wxml
綁定事件是使用-
連字符分隔。
這就造成了Taro
使用vant-tree-select
組件時,onClickNav
和onClickItem
不會被vant-tree-select
識別,事件無法觸發。
解決方案:
-
@tarojs/cli
低版本,對vant-tree-select
進行二次封裝,事件原始觸發通過this.$triggerEvent
傳出駝峯式的事件類型,在Taro
中調用。 - 升級
@tarojs/cli
的版本,如1.2.0
版本無法觸發駝峯式命名的事件,升級到最新版1.3.15
,使用onClick-nav
形式綁定事件就可以了。
目前vant-weapp0.5.20
中,vant-tree-select
不支持單選。
props獲取不到
駝峯式命名的事件無法觸發[微信小程序]
注意@tarojs/cli
的版本,如最初用的1.2.0
版本就獲取不到自定義組件傳的參數,升級到最新版1.3.15
就可以了。
注意@tarojs/cli
的版本,如最初用的1.2.0
版本無法觸發駝峯式命名的事件,升級到最新版1.3.15
,使用onClick-nav
形式綁定事件就可以了。
Taro
編譯器無法自動將用到組件的.wxs
文件移動到/dist
相應目錄下
修改/config/index.js
文件中的config.copy.patterns
,讓其在編譯時,自動複製到dist
對應目錄下。
copy: {
patterns: [
{
from: 'src/components/vant-weapp/**/*.wxs',
to: 'dist/components/vant-weapp/**/*.wxs'
}
],
options: {
}
},
在微信開發者工具
中運行Taro
代碼,如果有async/await
,則regenerator is not defined。
將微信開發者工具
--> 右上角詳情
--> 本地設置
裏的配置全部關掉,如ES6轉ES5
...。
定製echarts,引入報錯
echarts.js
不需要再次編譯,配置中新增編譯時忽略echarts.js
。
weapp: {
...
compile: {
exclude: ['src/echarts-for-weixin/ec-canvas/echarts.js']
}
}
getState()獲取Store存儲的數據
可以在(dispatch, getState) => {
中使用。
真機調試正常,預覽/體驗版空白(只有tabbar)
將"本地設置"--> "上傳時進行代碼保護"取消勾選。
Taro
中className=''
單引號賦值不起作用。
className
的值使用雙引號包裹。