目標場景
分類管理
技術點
-
讀取分類列表
-
點選某分類進入編輯頁,操作編輯與刪除
-
點選列表頁底部按鈕,跳轉新增,共用編輯頁
效果
![](https://i.iter01.com/images/01acfee3aab23961ebddd532f991d88afcb505a46e0243989eeb254832fb8eb7.gif)
列表頁js
var Bmob = require('../../utils/bmob.js');var that; Page({ onLoad: function () { that = this; }, onShow: function () { that.loadCategories(); }, loadCategories: function () { var query = new Bmob.Query('Category'); query.limit(Number.Max_VALUE); query.find().then(function (categories) { console.log(categories); that.setData({ categories: categories }); }); }, add: function () { // 跳轉新增頁面 wx.navigateTo({ url: '../add/add' }); }, })
可以看到,上面使用了onShow代替了onLoad作為載入請求loadCategories,這是因為考慮到新增完畢後會有返回上頁,能和自重新整理最新資料。
相應的佈局頁面
class="item" wx:for="{{categories}}" wx:key=""> <navigator< span="" style="word-wrap: break-word; margin: 0px; padding: 0px;"> class="title" url="../add/add?objectId={{item.objectId}}" open-type="navigate" hover-class="none">{{item.title}}
<view< span="" style="word-wrap: break-word; margin: 0px; padding: 0px;"> class="add-category" bindtap="add"> <image< span="" style="word-wrap: break-word; margin: 0px; padding: 0px;"> src="/images/add.png" class="icon" /> <view< span="" style="word-wrap: break-word; margin: 0px; padding: 0px;"> class="caption">新增分類
列表頁跳轉可以使用代替的bindtap,這樣更簡潔一些;而底部的新增按鈕使用position: fixed固定底部;wx:for迴圈提供objectId作為引數,以傳遞給編輯頁面。
編輯頁面
var Bmob = require('../../utils/bmob.js');var that; Page({ onLoad: function (options) { that = this; if (options.objectId) { // 快取資料 that.setData({ isEdit: true, objectId: options.objectId }); // 請求待編輯的分類物件 var query = new Bmob.Query('Category'); query.get(that.data.objectId).then(function (category) { that.setData({ category: category }); }); } }, add: function (e) { var form = e.detail.value; if (form.title == '') { wx.showModal({ title: '請填寫分類名稱', showCancel: false }); return; } // 新增或者修改分類 var category = new Bmob.Object('Category'); // 修改模式 if (that.data.isEdit) { category = that.data.category; } category.set('title', form.title); category.save().then(function (updatedCategory) { // that.setData({ // category: updatedCategory // }); // 操作成功提示並返回上一頁 wx.showModal({ title: that.data.isEdit ? '修改成功' : '新增成功', showCancel: false, success: function () { wx.navigateBack(); } }); }); }, delete: function () { // 確認刪除對話方塊 wx.showModal({ title: '確認刪除', success: function (res) { if (res.confirm) { var category = that.data.category; category.destroy().then(function (result) { wx.showModal({ title: '刪除成功', showCancel: false, success: function () { wx.navigateBack(); } }); }); } } }); } })
通過onLoad事件的options回撥接受objectId引數,如果存在代表是編輯狀態,反之新增
新增頁面,通過form取值,bindtap事件中,通用e.detail.value拿到form物件
wx.showModal,帶參showCancel決定取消按鈕是不是顯示,點選確認或取消按鈕支援回撥,而showToast雖然能回撥,但在wx.navigateBack()同時併發,導致會看不清Toast上的文字就返回到上一頁了,所以基本都改用showModal了。res.confirm代表使用者點選了確認按鈕而非取消按鈕。
編輯頁面佈局
<form< span="" style="word-wrap: break-word; margin: 0px; padding: 0px;"> onsubmit="add"> <view< span="" style="word-wrap: break-word; margin: 0px; padding: 0px;"> class="item"> <view< span="" style="word-wrap: break-word; margin: 0px; padding: 0px;"> class="title">分類名稱 <view< span="" style="word-wrap: break-word; margin: 0px; padding: 0px;"> class="subtitle"> <input< span="" style="word-wrap: break-word; margin: 0px; padding: 0px;"> type="text" name="title" value="{{category.title}}" placeholder="請填寫分類名稱" /> <view< span="" style="word-wrap: break-word; margin: 0px; padding: 0px;"> class="buttons"> <button< span="" style="word-wrap: break-word; margin: 0px; padding: 0px;"> wx:if="{{isEdit}}" class="delete" bindtap="delete">刪除 <button< span="" style="word-wrap: break-word; margin: 0px; padding: 0px;"> form-type="submit" class="confirm">{{isEdit ? '修改' : '新增'}}
判斷是不是編輯狀態isEdit,分別顯示修改或新增樣式,相應的事件也有不同,分別對應onsubmit方法與delete方法。
編輯頁樣式
/*每行*/ .item { align-items: center; border-bottom: 1px solid #eee; background: white; margin-left: 0; } /*確認按鈕*/ .confirm { background: #4cd964; color: white; margin: 10px; flex: 1; } /*刪除按鈕*/ .delete { background: #da634f; color: white; margin: 10px; flex: 1; } /*標題與文字框1/3開*/ .title { flex: 1; } .subtitle { flex: 3; } /*編輯與新增按鈕*/ .buttons { display: flex; flex-direction: row; }
文字標籤與input標記,使用flex,1: 3比例對開,編輯與刪除則1: 1對半開
|