我們在操作 picker 元件的時候 可能會有疑惑,為什麼會出現渲染問題,或是我就是想取中文的值,怎麼辦?
視圖層
<view>数据是json的,直接展示</view> picker使用说明: <picker mode="selector" range-key="valuess" range='{{school}}' model:value="{{currentSchool}}" bindchange="handleChange" > 当前选择 {{school[currentSchool].valuess}} </picker>
邏輯層
page({ data: { school: [ {"isNewRecord":false,"id":"2","keyss":"school","valuess":"湖南小学"}, {"isNewRecord":false,"id":"3","keyss":"school","valuess":"北京小学"} ], currentSchool: "" } handleChange(e) { console.log(e) // 如果 range是一个 Object Array形式的,那这里的value就是索引下标 let currentVal = e.detail.value // 对应的中文是 let text = this.data.school[currentVal].valuess console.log('中文-->', text) }, })
這裡,我們傳入的是一個陣列物件Object Array類型, 那我們在使用picker元件的時候,一定要分清,這些欄位的意思,以及如何取值
range-key 是告訴我們,在渲染的時候,是以什麼欄位取值,下面就是不指定的情況,如果是很簡單的資料結構
類似: school: ["中文", '數學', "音樂"]
是不需要指定的,對於複雜的資料結構,指定字段,微信會自動幫我們去賦值
作者:知了清語
model:value="{{currentSchool}}" 你可能會發現這個,為什麼value前面綁定了model
因為微信不是雙向資料綁定的,如果單純的寫 value="{{目前選取的索引下標-currentSchool}}"
邏輯層的currentSchool 是不會有變化的,必須透過bindchange事件去修改data中的資料, 像下面這樣
handleChange(e) { this.setData({ currentSchool: e.detail.value }) }
使用model的好處就在於我們不需要關係這個賦值操作,只要我們點擊右上角的確定,data中的currentSchool就更新了,點擊取消是不會更新data中的資料的
我們在handleChange中的e.detail.value 拿到的值也就是個下標,其實我們可能會想要text文字
就直接像上面那樣,用索引去取來源資料中的{} 物件屬性
還有一個常見的操作,就是將school--schoolFilter變成["湖南小學", "北京小學"] 這個簡單結構,那麼e.detail.value 取得的就是中文
但是這種要求,data中有2個陣列schoolFilter--Array類型的和school--Object Array類型的, picker中用range = "{{schoolFilter}}"
那麼要取得來源資料的其他屬性,就必須遍歷school 再取值
總結
#不想去寫bindchange更改data數據,就使用model:
#picker 開始標籤和結束標籤中包裹只是選擇以後的內容,你可以隨意去組織用text呈現或{{內容}}呈現 或view 呈現或input 呈現都可以
取得Object Array中的其他字段,如果不想過濾數據,就使用Object Array這種結構,就透過索引下班去訪問,不需要在data中建2個欄位
只有點擊picker中顯示的【確定】按鈕,picker中的資料才會更新
推薦教學:《微信小程式》
以上是小程式之picker 資料是 Object Array的詳細內容。更多資訊請關注PHP中文網其他相關文章!