踩坑日记 《正确的使用Vuex》基于 uniapp Vue3 setup 语法糖 vuex4 项目 太多坑了要吐了

踩坑日记 《正确的使用Vuex》基于 uniapp Vue3 setup 语法糖 vuex4 项目 太多坑了要吐了

完美解决页面数据不刷新 或者数据慢一步刷新

  • 页面使用
  • html
html 复制代码
<template>
	<view>
		<template v-if="cartData.data.length>0">
			<!-- 自定义导航栏 -->
			<view class="box-bg" style="font-size: 36rpx;">
				<!-- <uni-nav-bar shadow left-icon="left" right-icon="cart" title="购物车" /> -->
				<uni-nav-bar shadow fixed="true" left-icon="left" :right-text="isEdit?'完成':'编辑'" title="购物车"
					statusBar="true" @clickRight="isEdit=!isEdit" />
			</view>
			<!-- 商品内容 -->
			<view class="shop-info">
				<view class="shop-item" v-for="(items, index) in cartData.data" :key="index">
					<label class="radio">
						<radio value="" color="#F33" @tap="selectedItemOne(index)" :checked="items.checked" />
						<text></text>
					</label>
					<image class="shop-image" :src="items.imgUrl" mode=""></image>
					<!-- 文字 -->
					<view class="shop-text">
						<view class="shop-name">{{items.name}}</view>
						<view class="shop-color f-color">颜色:{{items.color}}</view>
						<view class="shop-price-num">
							<view class="shop-price">¥{{items.nprice}}</view>
							<view class="shop-num">x {{items.num}}</view>
						</view>
					</view>
				</view>
			</view>

			<!-- 底部内容 -->
			<view class="shop-foot">
				<label class="foot-radio">
					{{checkedall.data}}
					<radio value="" color="#F33" @tap="checkAllFunc" :checked="checkedall.data" /><text>全选</text>
				</label>

				<view class="foot-text">
					<view class="foot-center">
						<view class="foot-count">合计:¥<span class="f-active-color">0</span>
							<view class="foot-tips">不包含运费</view>
						</view>
					</view>
					<view class="foot-num">结算(0)</view>
				</view>
			</view>
		</template>

		<template v-else>
			<!-- 自定义导航栏 -->
			<view class="box-bg" style="font-size: 36rpx;">
				<!-- <uni-nav-bar shadow left-icon="left" right-icon="cart" title="购物车" /> -->
				<uni-nav-bar statusBar="true" fixed="true" title="购物车" />
			</view>
			<view>
				<image class="shop-info-else" src="../../static/cartImage/isNull.png"></image>
			</view>
		</template>
	</view>
</template>
  • javascript
javascript 复制代码
<script setup>
	import {
		ref,
		reactive,
		computed,
	} from "vue"

	import {
		useStore
	} from 'vuex'
	import store from '@/store/index.js'
	// 购物车商品数据
	const cartData = reactive({
		data: computed(() => {
			return store.state.cart.cartData
		})
	})
	console.log(cartData.data);

	// 全选
	const checkAllFunc = () => {
		store.dispatch("checkAllFunc")
	}

	// 获取全选状态
	const checkedall = reactive({
		data: computed(() => {
			return store.getters["checkedAll"]
		})
	})
	// 全选
	const selectedItemOne = (index) => {
		store.commit("oneCheck", index)
	}
	// 编辑 or 确定
	const isEdit = ref(false)
</script>
  • store
    • index.js
javascript 复制代码
import { createStore } from 'vuex'
import cart from "@/store/modules/cart.js"
export default createStore({
	modules: {
		cart,
	}
})
  • store
    • modules
      • cart.js
javascript 复制代码
const getDefaultState = () => {
	return {
		// token: getToken(),
		cartData: [{
				checked: false,
				id: 1,
				name: "正版护奶裙日系jk制服套装显瘦学院风甜美背带连衣裙夏季中长裙子甜美背带连衣裙夏季中长裙",
				color: "哈哈短会十大",
				imgUrl: "../../static/shopImage/shopInfo/jk02.png",
				nprice: "999",
				num: 1,
			},
			{
				checked: false,
				id: 2,
				name: "正版护奶裙日系jk制服套装显瘦学院风甜美背带连衣裙夏季中长裙子甜美背带连衣裙夏季中长裙",
				color: "哈哈短会十大",
				imgUrl: "../../static/shopImage/shopInfo/jk02.png",
				nprice: "99",
				num: 2,
			},
			{
				checked: false,
				id: 3,
				name: "正版护奶裙日系jk制服套装显瘦学院风甜美背带连衣裙夏季中长裙子甜美背带连衣裙夏季中长裙",
				color: "哈哈短会十大",
				imgUrl: "../../static/shopImage/shopInfo/jk02.png",
				nprice: "990",
				num: 1,
			},
			{
				checked: false,
				id: 4,
				name: "正版护奶裙日系jk制服套装显瘦学院风甜美背带连衣裙夏季中长裙子甜美背带连衣裙夏季中长裙",
				color: "哈哈短会十大",
				imgUrl: "../../static/shopImage/shopInfo/jk02.png",
				nprice: "990",
				num: 1,
			},
			{
				checked: false,
				id: 5,
				name: "正版护奶裙日系jk制服套装显瘦学院风甜美背带连衣裙夏季中长裙子甜美背带连衣裙夏季中长裙",
				color: "哈哈短会十大",
				imgUrl: "../../static/shopImage/shopInfo/jk02.png",
				nprice: "990",
				num: 1,
			},
		],
		selectList: []

	}
}

const state = getDefaultState()
const getters = {
	// 判断是否全选
	checkedAll(state) {
		return state.cartData.length == state.selectList.length;
	}
}
const mutations = {
	// 全选
	checkAll(state) {
		state.selectList = state.cartData.map(v => {
			v.checked = true;
			return v.id
		})
	},
	// 不全选
	unCheckAll(state) {
		state.cartData.forEach(v => {
			v.checked = false;
		})
		console.log(state.cartData);
		state.selectList = [];
	},
	// 单选
	oneCheck(state, index) {
		let id = state.cartData[index].id; // 查询 原数组 id
		let res = state.selectList.indexOf(id); // 原数组的 id 是否存在于空数组 res 返回存在位置
		if (res > -1) {
			state.cartData[index].checked = false;
			return state.selectList.splice(res, 1);
		}
		state.cartData[index].checked = true;
		state.selectList.push(id);;
	}
}
const actions = {
	checkAllFunc({
		commit,
		getters
	}) {
		getters.checkedAll ? commit("unCheckAll") : commit("checkAll")
	}
}

export default {
	state,
	getters,
	mutations,
	actions
}
  • main.js
javascript 复制代码
import App from './App'

// #ifndef VUE3
import Vue from 'vue'
import './uni.promisify.adaptor'
import { createApp } from 'vue'
import store from 'store/index.js'
const app = createApp(App)
app.use(store).mount('#app')
// Vue.config.productionTip = false
// #endif

// #ifdef VUE3
import {
	createSSRApp
} from 'vue'
export function createApp() {
	const app = createSSRApp(App)
	return {
		app
	}
}
// #endif
相关推荐
轻口味9 分钟前
命名空间与模块化概述
开发语言·前端·javascript
前端小小王44 分钟前
React Hooks
前端·javascript·react.js
迷途小码农零零发1 小时前
react中使用ResizeObserver来观察元素的size变化
前端·javascript·react.js
晓纪同学1 小时前
QT-简单视觉框架代码
开发语言·qt
威桑1 小时前
Qt SizePolicy详解:minimum 与 minimumExpanding 的区别
开发语言·qt·扩张策略
飞飞-躺着更舒服1 小时前
【QT】实现电子飞行显示器(简易版)
开发语言·qt
明月看潮生1 小时前
青少年编程与数学 02-004 Go语言Web编程 16课题、并发编程
开发语言·青少年编程·并发编程·编程与数学·goweb
明月看潮生1 小时前
青少年编程与数学 02-004 Go语言Web编程 17课题、静态文件
开发语言·青少年编程·编程与数学·goweb
Java Fans1 小时前
C# 中串口读取问题及解决方案
开发语言·c#
盛派网络小助手1 小时前
微信 SDK 更新 Sample,NCF 文档和模板更新,更多更新日志,欢迎解锁
开发语言·人工智能·后端·架构·c#