目录
1 过滤器-格式化价格
2 组件-搜索框
3 组件-数量框
4 组件-商品概况
4.1 格式化价格
4.2 选择性使用勾选框和数量框
4.3 源码
1 过滤器-格式化价格
这个项目中仅用到格式化价格这一种过滤器。过滤器文件位置为store/filter.wxs
文件内容是这样的,功能是保留两位小数。后续我们会进行引用
2 组件-搜索框
在首页中有使用
在分类中有使用
在app.json中注册black_horse_search组件
html
<!--components/black_horse_search.wxml-->
<view class="my-search-container" bindtap="go_search_page">
<view class="my-search-box">
<icon class="icon-small" type="search" size="17"></icon>
<text class="placeholder">搜索</text>
</view>
</view>
css
/* components/black_horse_search.wxss */
.my-search-container {
background-color: #c00000;
height:50px;
padding:0 10px;
display:flex;
align-items: center;
}
.my-search-box {
height:36px;
background-color: #fff;
border-radius: 15px;
width:100%;
display:flex;
align-items:center;
justify-content:center;
}
.my-search-box .placeholder {
font-size:15px;
margin-left:5px;
}
js
// components/black_horse_search.js
Component({
/**
* 组件的属性列表
*/
properties: {
},
/**
* 组件的初始数据
*/
data: {
},
/**
* 组件的方法列表
*/
methods: {
go_search_page() {
wx.navigateTo({url:'/subpackage_search/search'})
}
}
})
js中只有点击后跳转到子页面search,跳转之后的事情就不用这个组件来做了
3 组件-数量框
数量框就是这个,该项目中只有购物车中用到了数量框,所以实际这个没必要封装
wxml
<!--components/number_box/number_box.wxml-->
<view class="number-container">
<!-- 减 1 的按钮 -->
<button size="mini" bindtap="sub_one" class="number_container_button">-</button>
<!-- 购买的数量 -->
<view class="number-box">{{ goods_count }}</view>
<!-- 加 1 的按钮 -->
<button size="mini" bindtap="add_one" class="number_container_button">+</button>
</view>
wxss
/* components/number_box/number_box.wxss */
.number-container {
display: flex;
text-align: center;
justify-content: center;
}
.number-box {
line-height: 80rpx;
text-align: center;
margin: 0 5px;
font-size: 12px;
}
js
// components/number_box/number_box.js
Component({
/**
* 组件的属性列表
*/
properties: {
goods_count:{
type:Number,
value:1
}
},
/**
* 组件的初始数据
*/
data: {
},
/**
* 组件的方法列表
*/
methods: {
add_one(e) {
this.setData({goods_count:this.data.goods_count+1})
this.triggerEvent("add_one",e.target.dataset)
},
sub_one(e) {
if (this.data.goods_count > 1) {
this.setData({goods_count:this.data.goods_count-1})
}
this.triggerEvent("sub_one",e.target.dataset)
}
}
})
在js中用到了自定义事件传递数据。从数量框->goods_list_item->购物车页面
e.target.dataset是传递参数,我们在组件中没写参数,也不需要传递参数,所以可以删掉
4 组件-商品概况
在商品列表中使用。每一个绿框就是一个组件
在购物车中使用
在app.json中注册goods_list_item组件
4.1 格式化价格
引入wxs,然后在模板中使用
4.2 选择性使用勾选框和数量框
从使用者接受properties觉得是否使用勾选框和数量框
4.3 源码
wxml
<!--components/goods_list_item/goods_list_item.wxml-->
<wxs module="filter" src="../../store/filter.wxs"></wxs>
<view class="goods-item">
<view class="goods-item-left">
<checkbox model:checked="{{goods_checked}}" color="#C00000" wx:if="{{showRadio}}" bindtap="trigger_change_radio_state_event" data-goods_id="{{goods_id}}" data-goods_status="{{goods_checked}}" />
<image src="{{goods_small_logo}}" class="goods-pic" data-goods_id="{{goods_id}}"/>
</view>
<view class="goods-item-right" data-goods_id="{{goods_id}}">
<view class="goods-name" data-goods_id="{{goods_id}}" >{{goods_name}}</view>
<view class="goods-info-box" data-goods_id="{{goods_id}}">
<view class="goods-price" data-goods_id="{{goods_id}}">¥{{filter.format_price(goods_price)}}</view>
<number_box wx:if="{{showNumberBox}}" goods_count="{{goods_count}}" bind:add_one="add_one" bind:sub_one="sub_one" data-goods_id="{{goods_id}}"></number_box>
</view>
</view>
</view>
在这里给所有的元素都给上了data-goods_id是怕goods_id传不出去,怀疑是和事件冒泡有关,应该有更简便的写法,如果不想思考就给每个元素都加上
wxss
/* components/goods_list_item/goods_list_item.wxss */
.goods-item {
display:flex;
padding:10px 5px;
border-bottom:1px solid #f0f0f0;
}
/* 左侧 */
.goods-item .goods-item-left {
margin-right:5px;
display:flex;
justify-content: space-between;
align-items:center;
}
.goods-item .goods-item-left .goods-pic {
width:100px;
height:100px;
display: block;
}
/* 右侧 */
.goods-item .goods-item-right {
display: flex;
flex:1;
flex-direction:column;
justify-content:space-between;
}
.goods-item .goods-item-right .goods-name {
font-size:13px;
}
.goods-item .goods-item-right .goods-price {
font-size:16px;
color:#c00000;
}
.goods-item .goods-item-right .goods-info-box {
display:flex;
align-items:center;
justify-content: space-between;
}
js
// components/goods_list_item/goods_list_item.js
Component({
/**
* 组件的属性列表
*/
properties: {
goods_small_logo:{
type:String,
value:'https://img3.doubanio.com/f/movie/8dd0c794499fe925ae2ae89ee30cd225750457b4/pics/movie/celebrity-default-medium.png'
},
goods_id:{
type:Number
},
goods_count:{
type:Number
},
goods_price:{
type:Number
},
goods_name:{
type:String
},
showRadio:{
type:Boolean,
value:false
},
showNumberBox:{
type:Boolean,
value:false
},
goods_checked:{
type:Boolean,
value:true
}
},
/**
* 组件的初始数据
*/
data: {
},
/**
* 组件的方法列表
*/
methods: {
trigger_change_radio_state_event(e) {
this.triggerEvent("radio_change",e.target.dataset)
},
add_one(e) {
this.setData({goods_count:this.data.goods_count+1})
this.triggerEvent("add_one",e.target.dataset)
},
sub_one(e) {
if (this.data.goods_count > 1) {
this.setData({goods_count:this.data.goods_count-1})
}
this.triggerEvent("sub_one",e.target.dataset)
}
}
})
js中干了两件事,一个是通过properties收数据,另一个是通过方法向上传数据,这里的e.target.dataset不可省略,因为要向上传递goods_id