React-Native使用Mobx实现购物车功能
发布时间 - 2026-01-11 03:15:17 点击率:次在工作中,购物车场景非常常见。本文实现基于React-Native和Mobx实现两种购物车例子。

其中,后期会加入动画等其他。本期先实现基础功能。
二:基于State实现购物车
1-:ShoppingCarPage.js
export default class ShoppingCarPage extends Component {
static navigationOptions = {
headerTitle : '基于State购物车',
};
constructor(props) {
super(props);
this.state = {
allSelecte : data.isAllSelect,
totalMoney : data.totalMoney,
}
};
getMoney = (m) => {
this.state.totalMoney=this.state.totalMoney+m;
//this.state.totalMoney += m;
data.totalMoney = this.state.totalMoney;
this.setState({
totalMoney : this.state.totalMoney
});
let i = 0;
data.datas.map((item) => {
if (item.isSelect != true) {
i += 1;
}
});
if (i == 0) {
data.isAllSelect = true;
this.setState({ allSelecte : true })
}
else {
data.isAllSelect = false;
this.setState({ allSelecte : false })
}
};
renderItem = (item) => {
return (
<ShoppingItemComponent
itemData={item}
money={this.getMoney}
/>
)
};
allSelect = () => {
data.totalMoney = 0;
data.isAllSelect = !data.isAllSelect;
this.state.totalMoney = 0;
DeviceEventEmitter.emit('allSelect', !this.state.allSelecte);
this.setState({ allSelecte : !this.state.allSelecte })
};
separatorView = () => {
return (
<View style={{ height : 10, backgroundColor : '#e9e9e9' }}/>
)
};
keyExtractor = (item) => item.name;
render() {
let { allSelecte, totalMoney } = this.state;
return (
<View style={styles.container}>
<FlatList data={data.datas}
ItemSeparatorComponent={this.separatorView}
renderItem={({ item }) => this.renderItem(item)}
keyExtractor={ this.keyExtractor }
/>
<View style={styles.tool}>
<View style={{ flex : 1, flexDirection : 'row', alignItems : 'center' }}>
<TouchableOpacity style={styles.select} onPress={ this.allSelect }>
<Image source={allSelecte ? require('./imgs/login_radio_selected.png') : require('./imgs/login_radio_normall.png')}/>
<Text style={{ marginLeft : 3 }}>全选</Text>
</TouchableOpacity>
<Text style={styles.allMoneyText}>
¥{this.state.totalMoney}
</Text>
</View>
<TouchableOpacity style={styles.balance}>
<Text style={styles.balanceText}>去结算</Text>
</TouchableOpacity>
</View>
</View>
);
}
}
2-:ShoppingItemComponent.js
export default class ShoppingItemComponent extends Component {
static propTypes = {
itemData : PropTypes.object.isRequired,
money : PropTypes.func,
};
static defaultProps = {
money : () => null,
};
componentDidMount() {
this.subscription = DeviceEventEmitter.addListener('allSelect', (isSelAll) => {
this.props.itemData.isSelect = isSelAll;
this.setState({ isSel : isSelAll });
if (isSelAll) {
this.setMoney(this.state.money * this.state.selNum);
}
})
};
componentWillUnmount() {
this.subscription && this.subscription.remove();
};
constructor(props) {
super(props);
this.state = {
isSel : this.props.itemData.isSelect,
selNum : this.props.itemData.count,
money : this.props.itemData.money,
name : this.props.itemData.name,
description : this.props.itemData.description,
img : this.props.itemData.img,
}
};
itemSelect = (item) => {
this.setState({isSel :!this.state.isSel},()=>{
if (this.state.isSel) {
this.setMoney(this.state.money * this.state.selNum)
}
else {
this.setMoney(-this.state.money * this.state.selNum)
}
});
};
itemIncrease = (i) => {
i++;
this.setState({selNum : i},()=>{
if (this.state.isSel) {
this.setMoney(this.state.money)
}else{
this.setState({isSel :true});
this.setMoney(this.state.money * this.state.selNum);
}
this.props.itemData.count = i;
});
};
itemReduce = (i) => {
if (i <= 1) {
if(this.state.isSel){
this.setState({isSel :!this.state.isSel});
this.setMoney(-this.state.money)
}
return;
}
i--;
this.setState({ selNum : i },()=>{
if (this.state.isSel) {
this.setMoney(-this.state.money)
}else{
this.setState({isSel :true});
this.setMoney(this.state.money * this.state.selNum);
}
this.props.itemData.count = i;
});
};
setMoney = (money) => {
if (this.props.money) {
this.props.money(money);
}
};
render() {
let { itemData } = this.props;
let { isSel, selNum, money, name, description, img } = this.state;
return (
<View style={ styles.container }>
<TouchableOpacity
style={{ marginLeft : 15 }}
onPress={() => this.itemSelect(itemData)}>
<Image source={isSel ?
require('./imgs/login_radio_selected.png')
: require('./imgs/login_radio_normall.png')}/>
</TouchableOpacity>
<Image style={ styles.icon } source={{ uri : img }}/>
<View style={ styles.right }>
<Text style={ styles.nameStyle } numberOfLines={ 2 }>{ name }</Text>
<Text style={ styles.descriptionStyle } numberOfLines={1}>{ description }</Text>
<View style={ styles.right_bot}>
< Text style={ styles.moneyStyle }>¥{ money }</Text>
<View style={ styles.numControllStyle }>
<TouchableOpacity style={ styles.reduceStyle } onPress={() => this.itemReduce(selNum)}>
<Text style={{ color : selNum <= 1 ? 'red' : 'black' } }>-</Text>
</TouchableOpacity>
<View style={ styles.numberViewStyle }>
<Text style={ styles.numberStyle }>{ selNum }</Text>
</View>
<TouchableOpacity style={ styles.increaseStyle } onPress={() => this.itemIncrease(selNum)}>
<Text>+</Text>
</TouchableOpacity>
</View>
</View>
</View>
</View>
);
}
}
三:基于Mobx实现购物车
1-:MobxShoppingCarPage.js
@observer
export default class MobxShoppingCarPage extends Component {
static navigationOptions = {
headerTitle : '基于MobX购物车',
};
constructor(props) {
super(props);
this.data = new MobxStore();
};
componentDidMount() {
this.data.replace(jsonData)
};
@action
allSelect = () => {
DeviceEventEmitter.emit('allSelect', !this.data.itemData.isAllSelect);
this.data.selectAll();
};
renderItem = (item) => {
return (
<MobxShopItemComponent itemData={ item } data={ this.data }/>
)
};
separatorView = () => {
return (
<View style={{ height : 10, backgroundColor : '#e9e9e9' }}/>
)
};
keyExtractor = (item) => item.name;
render() {
return (
<View style={ styles.container }>
<FlatList data={ this.data.itemData.datas }
ItemSeparatorComponent={ this.separatorView }
renderItem={ ({ item }) => this.renderItem(item) }
keyExtractor={ this.keyExtractor }
/>
<View style={ styles.tool }>
<View style={{ flex : 1, flexDirection : 'row', alignItems : 'center' }}>
<TouchableOpacity style={ styles.select } onPress={ this.allSelect }>
<Image source={ this.data.itemData.isAllSelect ?
require('../imgs/login_radio_selected.png')
: require('../imgs/login_radio_normall.png') }/>
<Text style={{ marginLeft : 3 }}>全选</Text>
</TouchableOpacity>
<Text style={ styles.allMoneyText }>
¥{ this.data.itemData.totalMoney }
</Text>
</View>
<TouchableOpacity style={ styles.balance } onPress={ this.allSelect }>
<Text style={ styles.balanceText }>去结算</Text>
</TouchableOpacity>
</View>
</View>
);
}
}
2-:MobxShopItemComponent.js
@observer
export default class MobxShopItemComponent extends Component {
static propTypes = {
itemData : PropTypes.object.isRequired,
data : PropTypes.object.isRequired,
};
constructor(props) {
super(props);
this.itemData = this.props.itemData;
}
componentDidMount() {
this.subscription = DeviceEventEmitter.addListener('allSelect', (isSelAll) => {
this.itemData.isSelect = isSelAll;
})
};
componentWillUnmount() {
this.subscription && this.subscription.remove();
};
@action
selectPress = () => {
this.itemData.isSelect = !this.itemData.isSelect;
let money = this.itemData.money * this.itemData.count;
if (this.itemData.isSelect) {
this.props.data.increase(money);
}
else {
this.props.data.reduce(money)
}
this.props.data.itemPress();
};
@action
increase = () => {
this.itemData.count += 1;
if (this.itemData.isSelect) {
this.props.data.increase(this.itemData.money);
}else{
this.itemData.isSelect = !this.itemData.isSelect;
this.props.data.increase(this.itemData.money * this.itemData.count);
}
};
@action
reduce = () => {
if (this.itemData.count <= 1) {
if(this.itemData.isSelect){
this.itemData.isSelect = !this.itemData.isSelect;
this.props.data.reduce(this.itemData.money);
}
return;
}
this.itemData.count -= 1;
if (this.itemData.isSelect) {
this.props.data.reduce(this.itemData.money);
}
};
render() {
return (
<View style={ styles.container }>
<TouchableOpacity
style={{ marginLeft : 15 }}
onPress={ this.selectPress }>
<Image source={ this.itemData.isSelect ?
require('../imgs/login_radio_selected.png')
: require('../imgs/login_radio_normall.png') }/>
</TouchableOpacity>
<Image style={ styles.icon } source={{ uri : 'https://img10.360buyimg.com/n7/jfs/t4063/153/323373745/444727/87c24f22/58b11156N9be178c2.jpg' }}/>
<View style={ styles.right }>
<Text style={ styles.nameStyle } numberOfLines={ 2 }>{ this.itemData.name }</Text>
<Text style={ styles.descriptionStyle } numberOfLines={1}> { this.itemData.description }</Text>
<View style={ styles.right_bot}>
< Text style={ styles.moneyStyle }>¥{ this.itemData.money }</Text>
<View style={ styles.numControllStyle }>
<TouchableOpacity style={ styles.reduceStyle } onPress={ this.reduce }>
<Text style={{ color : this.itemData.count <= 1 ? 'red' : 'black' } }>-</Text>
</TouchableOpacity>
<View style={ styles.numberViewStyle }>
<Text style={ styles.numberStyle }>{ this.itemData.count }</Text>
</View>
<TouchableOpacity style={ styles.increaseStyle } onPress={ this.increase }>
<Text>+</Text>
</TouchableOpacity>
</View>
</View>
</View>
</View>
);
}
};
3-:MobxStore.js
import { observable, action, computed, autorun } from 'mobx';
export default class MobxStore {
@observable
itemData = {}
//设置数据
replace = (data) => {
this.itemData = data;
}
//按下的反选
itemPress = () => {
let i = 0;
this.itemData.datas.map((item) => {
if (item.isSelect != true) {
i += 1;
}
});
if (i == 0) {
this.itemData.isAllSelect = true;
}
else {
this.itemData.isAllSelect = false;
}
}
//加
increase = (money) => {
this.itemData.totalMoney += money;
}
//减
reduce = (money) => {
this.itemData.totalMoney -= money;
}
//全选
selectAll = () => {
this.itemData.isAllSelect = !this.itemData.isAllSelect;
this.itemData.totalMoney = 0;
if (this.itemData.isAllSelect) {
for (let i = 0;
i < this.itemData.datas.length;
i++) {
this.itemData.totalMoney += this.itemData.datas[ i ].money * this.itemData.datas[ i ].count;
}
}
}
}
四:
1-:代码github地址:https://github.com/erhutime/React-Navigation-All/tree/master/All/jscode/shoppingcar/src
2-:下载完成后,修改index.ios.js:入口文件如下:
运行效果如下:
import App from './jscode/shoppingcar/src/App'
AppRegistry.registerComponent('All', () => App);
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# React-Native
# Mobx购物车
# React
# Native
# 购物车
# React中使用Mobx的方法
# React+Mobx基本使用、模块化操作
# react使用mobx封装管理用户登录的store示例详解
# React Native中Mobx的使用方法详解
# react mobx 基本用法示例小结
# 全选
# 两种
# 按下
# 本期
# 在工作中
# 大家多多
# 后期
# 完成后
# backgroundColor
# View
# height
# container
# FlatList
# styles
# keyExtractor
# render
# separatorView
# lt
# ShoppingItemComponent
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel怎么在Controller之外的地方验证数据
胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?
Laravel如何使用Telescope进行调试?(安装和使用教程)
如何在景安服务器上快速搭建个人网站?
绝密ChatGPT指令:手把手教你生成HR无法拒绝的求职信
html5如何设置样式_HTML5样式设置方法与CSS应用技巧【教程】
Laravel如何使用Facades(门面)及其工作原理_Laravel门面模式与底层机制
Laravel中间件起什么作用_Laravel Middleware请求生命周期与自定义详解
如何挑选高效建站主机与优质域名?
js实现点击每个li节点,都弹出其文本值及修改
活动邀请函制作网站有哪些,活动邀请函文案?
如何在 Python 中将列表项按字母顺序编号(a.、b.、c. …)
非常酷的网站设计制作软件,酷培ai教育官方网站?
Angular 表单中正确绑定输入值以确保提交与验证正常工作
JavaScript模板引擎Template.js使用详解
Win11摄像头无法使用怎么办_Win11相机隐私权限开启教程【详解】
国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?
如何构建满足综合性能需求的优质建站方案?
Laravel DB事务怎么使用_Laravel数据库事务回滚操作
Laravel怎么连接多个数据库_Laravel多数据库连接配置
专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?
Python企业级消息系统教程_KafkaRabbitMQ高并发应用
如何快速启动建站代理加盟业务?
VIVO手机上del键无效OnKeyListener不响应的原因及解决方法
高端建站如何打造兼具美学与转化的品牌官网?
JavaScript如何实现路由_前端路由原理是什么
Laravel如何实现全文搜索_Laravel Scout集成Algolia或Meilisearch教程
如何在Windows服务器上快速搭建网站?
Laravel如何使用查询构建器?(Query Builder高级用法)
Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑
Laravel如何配置和使用缓存?(Redis代码示例)
如何用狗爹虚拟主机快速搭建网站?
Laravel Docker环境搭建教程_Laravel Sail使用指南
小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像
Laravel如何处理文件上传_Laravel Storage门面实现文件存储与管理
原生JS获取元素集合的子元素宽度实例
js代码实现下拉菜单【推荐】
使用spring连接及操作mongodb3.0实例
香港服务器如何优化才能显著提升网站加载速度?
成都品牌网站制作公司,成都营业执照年报网上怎么办理?
JavaScript实现Fly Bird小游戏
零基础网站服务器架设实战:轻量应用与域名解析配置指南
laravel怎么为应用开启和关闭维护模式_laravel应用维护模式开启与关闭方法
Laravel怎么返回JSON格式数据_Laravel API资源Response响应格式化【技巧】
Laravel如何实现API资源集合?(Resource Collection教程)
如何在企业微信快速生成手机电脑官网?
ChatGPT回答中断怎么办 引导AI继续输出完整内容的方法
Firefox Developer Edition开发者版本入口
Python自动化办公教程_ExcelWordPDF批量处理案例
linux top下的 minerd 木马清除方法

