折腾:
【记录】小程序实现绘本查询的详情页
期间,在小程序中,已经实现了详情页的基本字段信息显示。
对于想要继续去实现类似的web页面中的推荐列表:
感觉应该不用完全重新画一个,因为之前小程序的主页的搜索结果列表,已经是完全一样的效果了:
所以感觉应该:
把共用的内部,包括html和css部分,都提取出来,供别的地方多次调用才对。
只支持js
好像是这个:
?
小程序 提取公共部分
小程序 公共 组件
“从小程序基础库版本 1.6.3 开始,小程序支持简洁的组件化编程。所有自定义组件相关特性都需要基础库版本 1.6.3 或更高。
开发者可以将页面内的功能模块抽象成自定义组件,以便在不同的页面中重复使用;也可以将复杂的页面拆分成多个低耦合的模块,有助于代码维护。自定义组件在使用时与基础组件非常相似。”
很明显就是我所想要的:
模块化编程
期间去:
【记录】用微信开发者工具打开小程序官网的示例代码
然后先去:
【已解决】小程序中实现最基本的自定义组件功能
然后还需要去解决:
【已解决】小程序的自定义组件中如何传递比如列表之类复杂的数据类型
不过很明显,有些字段并没有显示出来,那是因为传入的数据,还需要一定的处理,所以接着去:
【已解决】小程序自定义组件中如何对于传入参数做一些初始化和处理
然后再去:
【已解决】小程序自定义组件中如何得知传入参数的数据发生变化
然后再去把book_list也被index主页中调用。
【总结】
最后终于实现了复杂的book_list的可复用的组件:
components/book_list/book_list.js
// components/book_list/book_list.js const app = getApp() //获取应用实例 const util = require('../../utils/util.js') const book_common = require('../../utils/book_common.js') Component({ lifetimes: { created: function () { // 在组件实例进入页面节点树时执行 console.log("component book_list created") }, attached: function () { // 在组件实例进入页面节点树时执行 console.log("component book_list attached") }, ready: function () { // 在组件实例进入页面节点树时执行 console.log("component book_list ready") }, moved: function () { // 在组件实例进入页面节点树时执行 console.log("component book_list moved") }, detached: function () { // 在组件实例被从页面节点树移除时执行 console.log("component book_list detached") }, }, pageLifetimes: { show: function () { // 在组件实例进入页面节点树时执行 console.log("component book_list show") }, }, /** * 组件的属性列表 */ properties: { curBookList: { type: Array, value: [], observer: function (newBookList, oldBookList, changedPath) { console.log("curBookList observer: newBookList=%o, oldBookList=%o, changedPath=%o", newBookList, oldBookList, changedPath) if(newBookList){ var processedList = this.processBookList(newBookList) console.log("processedList=%o", processedList) this.setData({ processedBookList: processedList }) } } } }, /** * 组件的初始数据 */ data: { processedBookList: [] }, /** * 组件的方法列表 */ methods: { // process book item to add extra field for show processBookList: function (originBookList) { console.log("processBookList: originBookList=%o", originBookList) var processedBookList = [] for (var curBookDict of originBookList) { console.log("curBookDict=%o", curBookDict) var coverImgUrl = curBookDict["coverImgUrl"] console.log("coverImgUrl=", coverImgUrl) if (!coverImgUrl) { coverImgUrl = app.globalData.DefaultValue.CoverImg console.log("default coverImgUrl=", coverImgUrl) } curBookDict["coverImgUrl"] = coverImgUrl var title = curBookDict["title"] console.log("title=", title) title = book_common.processEmptyDefault(title) console.log("title=", title) curBookDict["title"] = title var authorsStr = book_common.listToStr(curBookDict["author"]["bookAuthors"]) console.log("authorsStr=", authorsStr) authorsStr = book_common.processEmptyDefault(authorsStr) curBookDict["authorsStr"] = authorsStr var lexileStr = curBookDict["grading"]["lexile"] console.log("lexileStr=", lexileStr) lexileStr = book_common.processEmptyDefault(lexileStr) curBookDict["lexileStr"] = lexileStr var ageStr = curBookDict["grading"]["age"] console.log("ageStr=", ageStr) if (ageStr) { ageStr += "岁" } ageStr = book_common.processEmptyDefault(ageStr) curBookDict["ageStr"] = ageStr processedBookList.push(curBookDict) } return processedBookList }, bookItemClickCallback: function(e){ console.log("bookItemClickCallback: e=%o", e) var curBookId = e.currentTarget.id // 5bd7bf97bfaa44fe2c7415d9 console.log("curBookId=%s", curBookId) // var difficulty = e.currentTarget.dataset.difficulty // // var difficulty = e.currentTarget.dataset["difficulty"] // console.log("difficulty=%s", difficulty) var queryParaDict = { "book_id": curBookId, // "cur_input": this.data.curInputValue } var encodedQueryStr = util.encodeQueryDict(queryParaDict) console.log("queryParaDict=%o -> encodedQueryStr=%s", encodedQueryStr) var detailUrl = '../detail/detail' detailUrl += "?" + encodedQueryStr console.log("detailUrl=%s", detailUrl) //redirect to detail page wx.navigateTo({ url: detailUrl, }) }, }, })
components/book_list/book_list.json
{ "component": true, "usingComponents": {} }
components/book_list/book_list.wxml
<!--components/book_list/book_list.wxml--> <view class='book_list'> <view id="{{curBookItem.id}}" wx:for="{{processedBookList}}" wx:for-index="bookIdx" wx:for-item="curBookItem" wx:key="id" class='book_list_item' bindtap='bookItemClickCallback' > <view class='book_item_logo'> <image class='book_item_logo_img' src="{{curBookItem.coverImgUrl}}" /> </view> <view class='book_list_item_attributes'> <view class='book_list_item_title'> {{curBookItem.title}} </view> <view class='book_list_attribute_row'> <text class='book_list_attribute_key'>作者:</text> <text class='book_list_attribute_value'>{{curBookItem.authorsStr}}</text> </view> <view class='book_list_attribute_row'> <text class='book_list_attribute_key'>兰斯指数:</text> <text class='book_list_attribute_value'>{{curBookItem.lexileStr}}</text> </view> <view class='book_list_attribute_row'> <text class='book_list_attribute_key'>参考年龄:</text> <text class='book_list_attribute_value'>{{curBookItem.ageStr}}</text> </view> <view class='book_list_attribute_tags'> <view wx:for="{{curBookItem.tags}}" wx:for-index="tagIdx" wx:for-item="eachTag" wx:key="*this" class='book_single_tag' > <text class='book_single_tag_value'>{{eachTag}}</text> </view> </view> </view> </view> </view>
components/book_list/book_list.wxss
/* components/book_list/book_list.wxss */ .book_list{ margin-left: 15px; margin-right: 15px; } .book_list_item{ display: flex; flex-direction:row; padding-bottom: 15px; font-size: 14px; color: #666666; } .book_item_logo{ } .book_item_logo_img{ width: 100px; height: 140px; border-radius: 8px; margin-right: 22px; } .book_list_item_attributes{ display: flex; flex-direction: column; /* font-family: PingFangSC-Light; */ font-family: "PingFangSC-Medium", "Microsoft Yahei", "微软雅黑", "Heiti SC"; } .book_list_item_title{ margin-top: 6px; margin-bottom: 10px; font-size: 18px; font-weight: 500; color: #333333; line-height: 1.2; } .book_list_attribute_row{ margin-bottom: 9px; line-height: 14px; } .book_list_attribute_key{ color: #333333; } .book_list_attribute_value{ } .book_single_tag{ font-size: 12px; font-weight: 400; margin-right: 4px; padding-top: 1px; padding-bottom: 0; background-color: rgba(97, 210, 179, 0.8); color: rgba(255, 255, 255, 0.9); height: 15px; line-height: 14px; display: inline-block; text-align: center; white-space: nowrap; vertical-align: baseline; padding-right: 0.6em; padding-left: 0.6em; border-radius: 10rem; } .book_single_tag_value{ }
然后:
主页中调用:
pages/index/index.json
{ "usingComponents": { "book-list": "/components/book_list/book_list" } }
pages/index/index.wxml
<view class='search_result_books'> <book-list cur-book-list="{{searchBookList}}"></book-list> </view>
详情页中调用:
pages/detail/detail.json
{ "usingComponents": { "book-list": "/components/book_list/book_list" } }
pages/detail/detail.wxml
<view class='detail_recommend_list'> <view class='recommend_header'>猜你喜欢</view> <book-list cur-book-list="{{curBookInfo.recommendations}}"></book-list> </view>
然后都可以正常显示出 绘本书籍的列表:
转载请注明:在路上 » 【已解决】小程序中如何提取公共部分内容为可复用的组件